2024江苏省赛E. Divide

[复制链接]
发表于 2024-10-22 06:30:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
补题链接
标题大意:
每次操作会把区间内最大值除以2,q次询问,问[l,r]操作k次后的结果是什么
分析:
一道主席树的标题,可以先最整个区间不停进行除以2的操作,问区间[l,r]操作后结果,其实就可以转化为求区间第k+1大的结果,反转一下就是求区间第                                   s                         u                         m                         −                         k                         −                         1                              sum-k-1                  sum−k−1小值,这样就是比较裸的主席树了,需要注意的是每次插入操作的时候,需要把数从                                   a                         [                         i                         ]                              a                  a加入然后除以2,直到为0制止,至于版本的话就是索引                                   1                              1                  1到                                   n                              n                  n
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. using i64 = long long;
  4. using i128 = __int128;
  5. constexpr int maxn = 1e5+10;
  6. struct ty{
  7.     int l,r,sum;
  8. }hjt[maxn*280];
  9. int cnt,root[maxn];
  10. int n,q,a[maxn],c[maxn];
  11. inline void insert(int l,int r,int pre,int &now,int p){
  12.     hjt[++cnt] = hjt[pre];
  13.     now = cnt;
  14.     hjt[now].sum++;
  15.     if(l==r) return;
  16.     int mid = (l+r)>>1;
  17.     if(p<=mid) insert(l,mid,hjt[pre].l,hjt[now].l,p);
  18.     else insert(mid+1,r,hjt[pre].r,hjt[now].r,p);
  19. }
  20. inline int query(int l,int r,int L,int R,int k){
  21.     if(l==r) return l;
  22.     int mid = (l+r)>>1;
  23.     int tmp = hjt[hjt[R].l].sum-hjt[hjt[L].l].sum;//会在这里减掉1-[l-1]版本的影响
  24.     if(k<=tmp) return query(l,mid,hjt[L].l,hjt[R].l,k);
  25.     else return query(mid+1,r,hjt[L].r,hjt[R].r,k-tmp);
  26. }
  27. signed main(){
  28.     ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  29.     cin>>n>>q;
  30.     for(int i = 1;i<=n;++i){
  31.         cin>>a[i];
  32.         c[i]=c[i-1];
  33.         insert(0,1e5,root[i-1],root[i],a[i]);
  34.         ++c[i];a[i]>>=1;
  35.         while(a[i]){
  36.             insert(0,1e5,root[i],root[i],a[i]);
  37.             a[i]>>=1;
  38.             c[i]++;
  39.         }
  40.     }
  41.     while(q--){
  42.         int l,r,k;
  43.         cin>>l>>r>>k;
  44.         if(k>=c[r]-c[l-1]) cout<<"0\n";
  45.         else cout<<query(0,1e5,root[l-1],root[r],c[r]-c[l-1]-k)<<"\n";
  46.     }
  47.     return 0;
  48. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2025-7-10 02:41 , Processed in 0.077396 second(s), 29 queries 手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199 )|网站地图

快速回复 返回顶部 返回列表