[NBUT 1458 Teemo]區間第k大問題,劃分樹

裸的區間第k大問題,劃分樹搞起。

?

#pragma comment(linker, "/STACK:10240000")
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;#define X                   first
#define Y                   second
#define pb                  push_back
#define mp                  make_pair
#define all(a)              (a).begin(), (a).end()
#define fillchar(a, x)      memset(a, x, sizeof(a))
#define fillarray(a, b)     memcpy(a, b, sizeof(a))typedef long long ll;
typedef pair<int, int> pii;
typedef unsigned long long ull;#ifndef ONLINE_JUDGE
void RI(vector<int>&a,int n){a.resize(n);for(int i=0;i<n;i++)scanf("%d",&a[i]);}
void RI(){}void RI(int&X){scanf("%d",&X);}template<typename...R>
void RI(int&f,R&...r){RI(f);RI(r...);}void RI(int*p,int*q){int d=p<q?1:-1;
while(p!=q){scanf("%d",p);p+=d;}}void print(){cout<<endl;}template<typename T>
void print(const T t){cout<<t<<endl;}template<typename F,typename...R>
void print(const F f,const R...r){cout<<f<<", ";print(r...);}template<typename T>
void print(T*p, T*q){int d=p<q?1:-1;while(p!=q){cout<<*p<<", ";p+=d;}cout<<endl;}
#endif
template<typename T>bool umax(T&a, const T&b){return b<=a?false:(a=b,true);}
template<typename T>bool umin(T&a, const T&b){return b>=a?false:(a=b,true);}const double PI = acos(-1.0);
const int INF = 1e9 + 7;
const double EPS = 1e-12;/* -------------------------------------------------------------------------------- */const int maxn = 1e5 + 7;/** 過程:快排的過程,通過記錄進入左子區間的個數的前綴和來解決區間第k大問題 **/
class PartitionTree {int cnt[20][maxn], val[20][maxn], buf[maxn];int n;void init(int a[], int n) {this->n = n;fillchar(cnt, 0);fillchar(val, 0);fillarray(val[0], a);fillarray(buf, a);sort(buf, buf + n);}void build(int l, int r, int dep) {if (l == r) return ;int m = (l + r) >> 1, c = 0, small = 0;for (int i = l; i <= r; i ++) small += val[dep][i] < buf[m];for (int i = l; i <= r; i ++) {if (c < m - l + 1) {if (val[dep][i] < buf[m] || val[dep][i] == buf[m] && small < m - l + 1) {cnt[dep][i] = 1;val[dep + 1][l + c ++] = val[dep][i];small += val[dep][i] == buf[m];}}else break;}for (int i = l; i <= r; i ++) {if (!cnt[dep][i]) val[dep + 1][l + c ++] = val[dep][i];}build(l, m, dep + 1);build(m + 1, r, dep + 1);}/** 第k小 */int querykth(int L, int R, int k, int l, int r, int dep) {if (k <= 0 || k > R - L + 1) return - 1;if (L == R) return val[dep][L];int m = (l + r) >> 1, cl = cnt[dep][L - 1] - cnt[dep][l - 1], cr = cnt[dep][R] - cnt[dep][l - 1];if (cr - cl >= k) return querykth(l + cl, l + cr - 1, k, l, m, dep + 1);return querykth(m + 1 + L - l - cl, m + R - l + 1 - cr, k - cr + cl, m + 1, r, dep + 1);}
public:void build(int a[], int n) {init(a, n);build(1, n, 0);for (int i = 0; i < 20; i ++) {for (int j = 2; j <= n; j ++) {cnt[i][j] += cnt[i][j - 1];}}}int querykth(int L, int R, int k) { return querykth(L, R, k, 1, n, 0); }
};/** 下標從1開始 */PartitionTree pt;
int a[maxn];int main() {
#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);
#endif // ONLINE_JUDGEint n, m;while (cin >> n >> m) {for (int i = 1; i <= n; i ++) {scanf("%d", a + i);}pt.build(a, n);int l, r, k;for (int i = 0; i < m; i ++) {scanf("%d%d%d", &l, &r, &k);printf("%d\n", pt.querykth(l, r, k));}}return 0;
}

轉載于:https://www.cnblogs.com/jklongint/p/4749192.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273035.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273035.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273035.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux的軟件包封裝格式有,linux軟件安裝包詳解---全

詳細介紹了常見的四種Linux應用軟件安裝包及其安裝方法。一、解析Linux應用軟件安裝包&#xff0c;通常Linux應用軟件的安裝包有四種&#xff1a;1) tar包&#xff0c;如software-1.2.3-1.tar.gz。他是使用UNIX系統的打包工具tar打包的。2) rpm包&#xff0c;如software-1.2.3-…

人生的第一個博客(●'?'●)??--開博典禮

嘛&#xff0c;說實話&#xff0c;現在才開始&#xff0c;實在是有點晚了&#xff0c;一不小心大學都過去1年了_(:3 」∠)_ 我在專業方面的起步也是相當晚的&#xff0c;身為計算機專業&#xff0c;編程卻從大學才開始正式接觸&#xff0c;進入大學時其他方面的能力也都約等于0…

linux查看運行鐘的tomcat,linux查看tomcat啟動運行日志

Linux0&period;11內核--進程調度分析之2&period;調度[版權所有,轉載請注明出處.出處:http://www.cnblogs.com/joey-hua/p/5596830.html ] 上一篇說到進程調度歸根結底是調用timer_interrupt函數, ...iReport 下載地址iReport 下載地址: https://osdn.jp/projects/sfnet…

8月面試題目收錄

面試題收錄 常見兼容性問題&#xff1f; * png24位的圖片在iE6瀏覽器上出現背景&#xff0c;解決方案是做成PNG8.* 瀏覽器默認的margin和padding不同。解決方案是加一個全局的*{margin:0;padding:0;}來統一。* IE6雙邊距bug:塊屬性標簽float后&#xff0c;又有橫行的margin情況…

linux如何升級php版本升級,Linux?升級php版本

近來因工作需要,又沒有服務器維護人員,只能自己上陣啦。從php5.3.28->5.5.30,先自己下載php包到/usr/local/下?&#xff0c;# 解壓縮安裝包tar zxvf php-5.5.30.tar.gz# 進入目錄cd php-5.5.30// 編譯的時候一定要加入參數--enable-fpm#./configure --prefix/usr/local/php…

opencv配置

OpenCV的簡單安裝和一次性配置在這里就不贅述了&#xff0c;網上教程很多&#xff0c;可以參考一下這個鏈接里面的教程http://wenku.baidu.com/view/3b40de25453610661ed9f46b.html。 但是很多情況下面&#xff0c;我們新建一個項目就要重新配置一次OpenCV&#xff0c;那就相當…

linux ftp 工作過程,linux中ftp的安裝過程記錄[運維篇]

安裝FTP的全過程記錄&#xff0c;對于相同情況希望有所幫助。【centOS】1、查詢本機是否安裝vsftpd: rpm -qa |grep vsftpd &#xff1b;2、安裝ftp服務 yum install vsftpd;3、開啟ftp服務 chkconfig vsftpd on&#xff0c;開機啟動&#xff1b;4、手動操作ftp服務&#xff0c…

代碼命名,代碼里的命名規則:錯誤的和正確的對比 命名方法總結 “自我描述的源代碼”用代碼表達出你的思想,讓其他人通過代碼能明白你的意圖。...

http://www.aqee.net/express-names-in-code-bad-vs-clean/ 編程初學者總是把大量的時間用在學習編程語言&#xff0c;語法&#xff0c;技巧和編程工具的使用上。他們認為&#xff0c;如果掌握了這些技術技巧&#xff0c;他們就能成為不錯的程序員。然而&#xff0c;計算機編程…

linux 動態執行cp,Linux常用命令之cp、mv、rm、cat、more、head、tail、ln命令講解

上一章節中&#xff0c;我們了解到了Linux系統的最基礎的幾個文件處理命令&#xff0c;核心的是ls命令&#xff0c;在今天這章中&#xff0c;我們來繼續學習Linux對于文件操作相關的一些命令&#xff0c;比如復制、移動、刪除、查看等命令。1、cp 命令解釋命令名稱&#xff1a;…

使用DBI(perl)實現文本文件的導入導出mysql

DBI 是perl腳本連接數據庫的一個模塊。perl腳本相對shell更靈活&#xff0c;功能更強大&#xff0c;跨平臺能力強。相對可執行jar包要簡單很多。 ?1、下載安裝包DBI-1.631.tar.gzperl腳本下載的網站http://www.cpan.org/ 很多perl的組件都可以在這個網站上下載 2、解壓tar -xz…

linux 車載視頻監控,基于Linux平臺車載視頻監控系統研發-計算機科學與技術專業論文.docx...

基于Linux平臺車載視頻監控系統研發-計算機科學與技術專業論文目錄HYPERLINK \l "_bookmark0" 第一章 緒論1 HYPERLINK \l "_bookmark1" 1.1 研究背景1 HYPERLINK \l "_bookmark2" 1.2 研究動態1 HYPERLINK \l "_bookmark3" 1.3 本文工…

Linux鼠標回報率修改,鼠標回報率怎么調? 設置鼠標回報率的三種方法

鼠標回報率如何設置呢&#xff1f;鼠標回報率又稱刷新率&#xff0c;是指鼠標MCU與電腦傳輸數據頻率。鼠標回報率對于游戲玩家而言至關重要&#xff0c;但同時鼠標回報率與電腦性能息息相關。只有電腦硬件性能良好&#xff0c;才能適當提升鼠標回報率&#xff0c;以實現更高的鼠…

linux下vi修改文件用法

進入vi的命令 vi filename :打開或新建文件&#xff0c;并將光標置于第一行首 vi n filename &#xff1a;打開文件&#xff0c;并將光標置于第n行首 vi filename &#xff1a;打開文件&#xff0c;并將光標置于最后一行首 vi /pattern filename&#xff1a;打開文件&#xff…

linux在芯片設計與實現,基于Linux的Atheros無線芯片網卡驅動的設計與實現

Design and Implementation of Linux based Atheros wireless network cards driverDU Qingbo1杜清波(1985-)&#xff0c;男&#xff0c;碩士研究生&#xff0c;主要研究方向&#xff1a;嵌入式系統與網絡通信1、School of Computer Science,Beijing University of Posts and T…

[轉載]孫婧妍:高考語文148分是這樣煉成的(附:孫婧妍

原文地址&#xff1a;孫婧妍&#xff1a;高考語文148分是這樣煉成的(附&#xff1a;孫婧妍2013高考作文《手機論》)作者&#xff1a; 語文新高考高考語文148分是這樣煉成的 (附&#xff1a;孫婧妍2013高考作文《手機論》) 來源&#xff1a;網絡 作者&#xff1a;孫婧妍…

linux ps 命令安裝,Linux上安裝pstree命令(-bash: pstree: command not found)

一、pstree命令的安裝1、在Mac OS上brew install pstree2、在Fedora/Red Hat/CentOSyum -y install psmisc3、在 Ubuntu/Debianapt-get install psmisc二、pstree命令詳解pstree指令用ASCII字符顯示樹狀結構&#xff0c;清楚地表達程序間的相互關系。如果不指定程序識別碼或用戶…

c語言字符串逆置,字符串逆置

滿意答案9n7j5j3m4o2013.12.03采納率&#xff1a;49% 等級&#xff1a;11已幫助&#xff1a;15198人47911 zxl0714 1358 Accepted 164K 15MS G 0.46K 2007-04-08 10:32:38#include using namespace std;void reverse(char* ch){int i, len;char tmp;len strlen( ch );for (…

哈夫曼編碼c語言論文,哈夫曼編碼的實現及應用論文.doc

哈夫曼編碼的實現及應用論文畢 業 設 計(論文)題目 哈夫曼編碼的實現及應用二級學院 數學與統計學院專 業 信息與計算科學班 級學生姓名 張澤欣 學號指導教師 職稱時 間目錄摘要IAbstractII第一章 緒論11.1 研究目的及意義11.2 圖像壓縮編碼技術概述21.2.1 圖像壓縮編碼技術分類…

css筆記3

CSS 多類選擇器,通過把兩個類選擇器鏈接在一起&#xff0c;僅可以選擇同時包含這些類名的元素&#xff08;類名的順序不限&#xff09;。 <p class"important warning"> This paragraph is a very important warning. </p>.important {font-weight:bold;…

java保留有效數字

1 在處理數值運算的時候&#xff0c;有時候會遇到保留幾位小數的需求&#xff0c;下面是一個保留兩位小數的簡單方法。2 /**3 * 將數據保留兩位小數4 */5 privatedoublegetTwoDecimal(doublenum) {6 DecimalFormatdFormatnewDecimalFormat("#.00"…