【BZOJ3065】带插入区间K小值
来源:互联网 发布:java开发工具怎么用 编辑:程序博客网 时间:2024/05/17 20:11
题目链接:传送门
题解:
貌似我只会写块链
//by sdfzchy#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int inf=(1<<30),N=100010,mod=1e9+7;int n,m;inline int in(){ char tmp=getchar(); int res=0,f=1; while((tmp<'0'||tmp>'9')&&tmp!='-')tmp=getchar(); if(tmp=='-') f=-1,tmp=getchar(); while(tmp>='0'&&tmp<='9') res=(res<<1)+(res<<3)+(tmp^48),tmp=getchar(); return res*f;}int Bo=600;int la,cnt,a[200][1210],c[200][1210],siz[210],nxt[210];char s[10];void change(int pos,int x){ int k=1,p=1; while(pos>siz[k]&&nxt[k]) pos-=siz[k],k=nxt[k]; int val=a[k][pos];a[k][pos]=x; for(p=1;p<=siz[k];p++) if(c[k][p]==val) break; c[k][p]=x; for(int i=p-1;i>=1;i--) if(c[k][i]>c[k][i+1]) swap(c[k][i],c[k][i+1]); for(int i=p+1;i<=siz[k];i++) if(c[k][i]<c[k][i-1]) swap(c[k][i],c[k][i-1]);}void reset(int x){ ++cnt; nxt[cnt]=nxt[x];nxt[x]=cnt; siz[cnt]=siz[x]=Bo; for(int i=1;i<=Bo;i++) c[x][i]=a[x][i],c[cnt][i]=a[cnt][i]=a[x][i+Bo]; sort(c[x]+1,c[x]+siz[x]+1); sort(c[cnt]+1,c[cnt]+siz[cnt]+1); }void ins(int pos,int x){ int k=1,p=1; while(pos>siz[k]&&nxt[k]) pos-=siz[k],k=nxt[k]; siz[k]++; for(int i=siz[k];i>pos;i--) a[k][i]=a[k][i-1]; a[k][pos]=x; if(siz[k]==2*Bo) reset(k); else { c[k][siz[k]]=x;p=siz[k]; while(p>1&&c[k][p]<c[k][p-1]) swap(c[k][p],c[k][p-1]),p--; }}int ask(int x,int val){ int l=1,r=siz[x],ans=0; while(l<=r) { int mid=(l+r)>>1; if(c[x][mid]<val) l=mid+1,ans=mid; else r=mid-1; } return ans;}int query(int l,int r,int k){ int kl=1,kr=1; while(l>siz[kl]&&nxt[kl]) l-=siz[kl],kl=nxt[kl]; while(r>siz[kr]&&nxt[kr]) r-=siz[kr],kr=nxt[kr]; int ans=0,mid,tot=0,L=0,R=70000; while(L<=R) { tot=0; mid=(L+R)>>1; if(kl!=kr) { if(nxt[kl]!=kr) for(int i=nxt[kl];i!=kr;i=nxt[i]) tot+=ask(i,mid); for(int i=l;i<=siz[kl];i++) if(a[kl][i]<mid) tot++; for(int i=1;i<=r;i++) if(a[kr][i]<mid) tot++; } else for(int i=l;i<=r;i++) if(a[kl][i]<mid) tot++; if(tot<k) ans=mid,L=mid+1; else R=mid-1; } return ans;}void de(){ cout<<endl; for(int i=1;i;i=nxt[i]) for(int j=1;j<=siz[i];j++) { cout<<a[i][j]<<" "; if(j==siz[i]) cout<<endl; } cout<<endl<<endl; for(int i=1;i;i=nxt[i]) for(int j=1;j<=siz[i];j++) { cout<<c[i][j]<<" "; if(j==siz[i]) cout<<endl; } cout<<endl;}int main(){ n=in(); for(int i=1;i<=n;i++) a[(i-1)/Bo+1][(i-1)%Bo+1]=c[(i-1)/Bo+1][(i-1)%Bo+1]=in(); cnt=(n-1)/Bo+1; for(int i=1;i<cnt;i++) siz[i]=Bo,nxt[i]=i+1; siz[cnt]=n-(cnt-1)*Bo; for(int i=1;i<=cnt;i++) sort(c[i]+1,c[i]+siz[i]+1); m=in(); for(int i=1,l,r;i<=m;i++) { scanf("%s",s); l=in()^la,r=in()^la; if(s[0]=='Q') printf("%d\n",la=query(l,r,in()^la)); else if(s[0]=='M') change(l,r); else ins(l,r); } return 0;}
阅读全文
0 0
- BZOJ3065 带插入区间K小值
- [bzoj3065]带插入区间K小值
- bzoj3065带插入区间K小值
- BZOJ3065 带插入区间K小值
- bzoj3065: 带插入区间K小值
- 【BZOJ3065】带插入区间K小值
- [bzoj3065]带插入区间K小值 解题报告
- BZOJ3065: 带插入区间K小值(替罪羊树+权值线段树)
- 替罪羊树套线段树 【bzoj3065】 带插入区间k小值
- [bzoj3065]带插入区间K小值 替罪羊树套值域线段树
- BZO3065 带插入区间K小值
- 3065: 带插入区间K小值
- bzoj 3065 带插入区间k小值
- 【 bzoj 3065 】 带插入区间K小值 - 树套树乱搞
- bzoj 3065 带插入区间K小值
- BZOJ 3065: 带插入区间K小值
- BZOJ 3065 带插入区间K小值
- BZOJ 3065 带插入区间K小值 替罪羊树套线段树
- webview支持H5上传图片
- JavaScript
- C#同步SerialPort组件的DataReceived事件
- Caffe之LeNet分析
- Linux 如何更改主机名
- 【BZOJ3065】带插入区间K小值
- 第二章作业题1-顺序表
- Struts2与Cookie实现自动登录!
- App功耗优化
- 使用PhpStorm和Xdebug分析PHP应用程序
- Spark Streaming优雅的关闭策略优化
- python自动化测试android项目
- ERROR in Error encountered resolving symbol values statically. Function calls are not supported. Con
- vue 新增数据实现双向绑定