[Zjoi2013]K大数查询
2016-01-20 11:00
288 查看
两个线段树,来维护C在任意区间上出现的次数。外层按质(C)建树,内层按下标建树(只建需要用到的节点)。
#include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> #include<stdlib.h> #include<string> using namespace std; #define LL long long #define ull unsigned long long #define nn 50005 #define mm 20002000 int sz; int q,a,b,c; int root[nn*4]; int ls[mm],rs[mm],sum[mm],lazy[mm]; void init() { sz=1; memset(root,0,sizeof(root)); memset(ls,0,sizeof(ls)); memset(rs,0,sizeof(rs)); memset(sum,0,sizeof(sum)); memset(lazy,0,sizeof(lazy)); } void pushdown(int k,int l,int r) { if(!lazy[k] || l==r) return; if(!ls[k]) ls[k]=sz++; if(!rs[k]) rs[k]=sz++; lazy[ls[k]]+=lazy[k]; lazy[rs[k]]+=lazy[k]; int mid=(l+r)>>1; sum[ls[k]]+=(mid-l+1)*lazy[k]; sum[rs[k]]+=(r-mid)*lazy[k]; lazy[k]=0; } void mod(int &k,int l,int r,int ll,int rr)//内层 { if( !k ) k=sz++; pushdown(k,l,r); if(l>=ll && r<=rr) { sum[k]+=r-l+1; lazy[k]++; return; } int mid=(l+r)>>1; if(ll<=mid) mod(ls[k],l,mid,ll,rr); if(rr>mid) mod(rs[k],mid+1,r,ll,rr); sum[k]=sum[ls[k]]+sum[rs[k]];// pushup } void ins() { int k=1,l=1,r=n; while(l != r)//外层 { int mid=(l+r)>>1; mod(root[k],1,n,a,b); if(c<=mid) r=mid,k=k<<1; else l=mid+1,k=k<<1|1; } mod(root[k],1,n,a,b); } int query(int k,int l,int r,int ll,int rr) { if(!k) return 0; pushdown(k,l,r); if(l>=ll && r<=rr) return sum[k]; int mid=(l+r)>>1; int ans=0; if(ll<=mid) ans+= query(ls[k],l,mid,ll,rr); if(mid<rr) ans+= query(rs[k],mid+1,r,ll,rr); return ans; } int solve() { int k=1,l=1,r=n; while(l != r) { int mid=(l+r)>>1; int t=query(root[k<<1],1,n,a,b); if(t>=c) r=mid,k=k<<1; else l=mid+1, k=k<<1|1, c -= t; } return l; } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { init(); while(m--) { scanf("%d%d%d%d",&q,&a,&b,&c); if(q==1) { c=n-c+1; ins(); } else printf("%d\n",n-solve()+1); } } return 0; }
相关文章推荐
- Java输入输出流
- JS的Document属性和方法小结
- 类似气泡的动画随笔
- UItableViewCell里面的UIButton点击不响应的诡异现象
- CocoaPods的介绍、安装、使用和原理
- Mac上安装和配置Appium
- mysql join的方式结果集
- springMVC实现Excel文件下载功能
- Linux命令替换rm命令防止误删除
- HDU 2553 N皇后问题
- 编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
- Redis的安装和使用之四------Redis集群
- SQL Server could not spawn FRunCM解决办法
- jsp、javabean学生信息管理系统
- XStream和Dom4j的区别
- 安装CRMEasy步骤
- 通过 XtraBackup 实现不停机不锁表搭建主从同步
- 安装memcache
- 小米路由搭建KMS Server
- PKCS与X.509标准的简单说明