BZOJ 1058 [ZJOI2007]报表统计
题解:
SB的我打了无旋Treap,然后在洛谷上光荣的T了
BZOJ极限卡时A了
(每个初始位置后面加入的数)的影响是可以直接算的,然后初始位置之间的影响用平衡树(线段树)来维护即可
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<map> using namespace std; const int maxn=1000009; const int oo=1000000000; int n,TT; int abs(int x){ if(x<0)return -x; else return x; } int nn=0,root=0; int ch[maxn][2]={0},fix[maxn]={0},siz[maxn]={0},kyl[maxn]={0},kyr[maxn]={0},tl[maxn]={0},tr[maxn]={0},mn[maxn]={0}; void pushup(int x){ siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1; if(ch[x][0]&&ch[x][1]){ tl[x]=tl[ch[x][0]]; tr[x]=tr[ch[x][1]]; mn[x]=min(min(min(mn[ch[x][0]],mn[ch[x][1]]),abs(kyr[x]-tl[ch[x][1]])),abs(kyl[x]-tr[ch[x][0]])); }else if(ch[x][0]){ tl[x]=tl[ch[x][0]]; tr[x]=kyr[x]; mn[x]=min(mn[ch[x][0]],abs(kyl[x]-tr[ch[x][0]])); }else if(ch[x][1]){ tl[x]=kyl[x]; tr[x]=tr[ch[x][1]]; mn[x]=min(mn[ch[x][1]],abs(kyr[x]-tl[ch[x][1]])); }else{ tl[x]=kyl[x]; tr[x]=kyr[x]; mn[x]=oo; } } int NewNode(int a,int b){ int x=++nn; fix[x]=rand(); siz[x]=1; kyl[x]=tl[x]=a; kyr[x]=tr[x]=b; mn[x]=oo; return x; } int Mer(int x,int y){ if((!x)||(!y))return x+y; if(fix[x]<fix[y]){ ch[x][1]=Mer(ch[x][1],y); pushup(x); return x; }else{ ch[y][0]=Mer(x,ch[y][0]); pushup(y); return y; } } void Split(int now,int k,int &x,int &y){ if(!now){ x=y=0; }else{ int l=ch[now][0]; if(k>=siz[l]+1){ x=now; Split(ch[now][1],k-(siz[l]+1),ch[now][1],y); }else{ y=now; Split(ch[now][0],k,x,ch[now][0]); } pushup(now); } } void Updatapoint(int x,int k,int a){ int l=ch[x][0]; if(k==siz[l]+1){ kyr[x]=a; }else if(k<siz[l]+1){ Updatapoint(ch[x][0],k,a); }else if(k>siz[l]+1){ Updatapoint(ch[x][1],k-(siz[l]+1),a); } pushup(x); } int sortgap=oo,nextgap=oo; vector<int>G[maxn]; map<int,int>ma; int main(){ srand(19260817); scanf("%d%d",&n,&TT); for(int i=1;i<=n;++i){ int x;scanf("%d",&x); G[i].push_back(x); root=Mer(root,NewNode(x,x)); if(ma.count(x))sortgap=0; ma[x]=1; map<int,int>::iterator it=ma.lower_bound(x); if(it!=ma.begin()){ --it; sortgap=min(sortgap,abs(x-(it->first))); ++it; } ++it; if(it!=ma.end())sortgap=min(sortgap,abs(x-(it->first))); } while(TT--){ char opty[20]; scanf("%s",opty); int x,y,z,k,a; if(opty[4]=='R'){ scanf("%d%d",&k,&a); G[k].push_back(a); int m=G[k].size(); nextgap=min(nextgap,abs(G[k][m-2]-G[k][m-1])); Updatapoint(root,k,a); // Split(root,k,x,z); // Split(x,k-1,x,y); // root=Mer(Mer(x,NewNode(G[k][0],G[k][m-1])),z); if(ma.count(a))sortgap=0; ma[a]=1; map<int,int>::iterator it=ma.lower_bound(a); if(it!=ma.begin()){ --it; sortgap=min(sortgap,abs(a-(it->first))); ++it; } ++it; if(it!=ma.end())sortgap=min(sortgap,abs(a-(it->first))); ma[a]=1; } if(opty[4]=='G'){ printf("%d\n",min(nextgap,mn[root])); } if(opty[4]=='S'){ printf("%d\n",sortgap); } } return 0; }
致歉:笔者已经意识到这是一篇几乎没有价值的文章,给您的阅读带来不好的体验,并且干扰了您的搜索环境,非常抱歉!