給定乙個長度為\(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^\)
值域很大,建立權值線段樹,權值線段樹要求離散化後的值之間的大小關係不發生改變進行離散化後通過二分查詢找到離散化後的下標值
#includeusing namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
const int n=1e5+10;
struct nodetr[n*4+n*17];
int a[n];
int root[n],id;
vectordis;
int find(int x)
// 返回的是當前區間的指標
int build(int l,int r)
// pre 表示上一版本的指標,l,r表示離散化後的值域範圍,x表示當前插入節點離散化後的值
int insert(int pre,int l,int r,int x)
int mid=l+r>>1;
// 只修改左指標
if(x<=mid) tr[now].l=insert(tr[pre].l,l,mid,x);
// 只修改右指標
else tr[now].r=insert(tr[pre].r,mid+1,r,x);
tr[now].cnt=tr[tr[now].l].cnt+tr[tr[now].r].cnt;
return now; // 回溯插入後的節點指標
}int query(int aft,int pre,int l,int r,int k)
int main()
sort(dis.begin(),dis.end());
dis.erase(unique(dis.begin(),dis.end()),dis.end());
root[0]=build(0,dis.size()-1); // 只建樹,不插入節點
rep(i,1,n)
root[i]=insert(root[i-1],0,dis.size()-1,find(a[i]));
while(m--)
return 0;
}
雜題 區間第K大 kth
時間限制 20 sec 記憶體限制 256 mb 提交 48 解決 37 提交 狀態 討論版 想必大家對區間第k大問題相當熟悉了。這個問題是這樣的,給一串串行和若干詢問,每個詢問查詢某段連續區間中第k大的數。現在我們考慮乙個該問題的 reverse 版本。現在我們給出序列和q個詢問,每個詢問給出k ...
雜題 區間第K大 kth
時間限制 20 sec 記憶體限制 256 mb 提交 48 解決 37 提交 狀態 討論版 想必大家對區間第k大問題相當熟悉了。這個問題是這樣的,給一串串行和若干詢問,每個詢問查詢某段連續區間中第k大的數。現在我們考慮乙個該問題的 reverse 版本。現在我們給出序列和q個詢問,每個詢問給出k ...
區間第k小數問題
原題鏈結 我們在 值域 上建立線段樹。每個節點維護一段值域區間 l,r 並記錄序列中數值落在這段值域區間 l,r 內的點有多少個,記為cnt。先不考慮下標區間 l,r 的限制。對於詢問整個序列a1 an中的第k小數,我們執行線段樹的查詢操作,對於每個線段樹上的節點,只需比較k與左兒子 其值域區間為 ...