劃分樹版本:
#include#include#include#include#define maxn 100002
#define mlog 19
using namespace std;
int tree[mlog][maxn],cntleft[mlog][maxn],sorted[maxn];
void buildtree(int lef,int rig,int deep)
else
}buildtree(lef,mid,deep+1);
buildtree(mid+1,rig,deep+1);
}int query(int lef,int rig,int qlef,int qrig,int deep,int k)
else
}return tree[deep][qlef];
}int nextint()
int ans=ch-'0';
while(ch=getchar())
if(flag==1)
ans=-ans;
return ans;
}//注意初始化cntleft,排序sorted,buildtree(1,n,0)
int main()
sort(sorted+1,sorted+n+1);
buildtree(1,n,0);
int a,b,c;
for(int i=0;i
#include#include#includeusing namespace std;
const int n=100010;
const int deep=20;
int seq[deep][n]; //歸併樹
int a[n], n, m;
struct node
tree[n*4]; //線段樹
//線段樹+歸併樹一起建了,實際上二者的過程一樣。。
void build(int l, int r, int p, int deep)
build(l, tree[p].mid, p*2, deep+1);
build(tree[p].mid+1, r, p*2+1, deep+1);
//歸併過程
int i, j, k;
for(i=l, j=tree[p].mid+1, k=l; i<=tree[p].mid && j<=r; )
while(i<=tree[p].mid)
seq[deep][k++] = seq[deep+1][i++];
while(j<=r)
seq[deep][k++] = seq[deep+1][j++];
}//通過二分列舉,返回key在本區間大於多少個數
//注意:任何乙個通過線段樹最終到達的區間一定是已經排好序了的,所以可以通過二分求
int counthelp(int l, int r, int p, int key, int deep)
}//返回在通過二分列舉後得到的結果。。。
int query(int ll, int rr, int cnt)
return seq[1][l-1];
}int main()
} return 0;
}
塊鏈神馬的以後填坑。。。
可持久化線段樹什麼的以後填坑。。。
靜態區間 kth 第 k 小數
給定乙個長度為 n 的整數序列,下標為 1 sim n m 個操作,每次給定 l,r,k 表示詢問下標為 l sim r 的區間內第 k 小的數 1 leq n leq 10 1 leq m leq 10 a leq 10 值域很大,建立權值線段樹,權值線段樹要求離散化後的值之間的大小關係不發生改變...
區間K大數
區間k大數 問題描述 給定乙個序列,每次詢問序列中第 l個數到第 r個數中第 k大的數是哪個。輸入格式 第一行包含乙個數 n,表示序列長度。第二行包含 n個正整數,表示給定的序列。第三個包含乙個正整數 m,表示詢問個數。接下來m行,每行三個數 l,r,k 表示詢問序列從左往右第 l個數到第 r個數中...
主席樹 靜態區間第k小
這是個非常經典的主席樹入門題 靜態區間第k小 資料已經過加強,請使用主席樹。同時請注意常數優化 如題,給定n個整數構成的序列,將對於指定的閉區間查詢其區間內的第k小值。輸入格式 第一行包含兩個正整數n m,分別表示序列的長度和查詢的個數。第二行包含n個整數,表示這個序列各項的數字。接下來m行每行包含...