1. 程式人生 > >。。。

。。。

amp inf ber class har count display spl urn

技術分享
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=500010,inf=0x3f3f3f3f;
int t[maxn][2],f[maxn],num[maxn],L[maxn],R[maxn],M[maxn],sum[maxn],en[maxn],delta[maxn],g[maxn],s[maxn];
//f父親 num值 L左起最大子段和 R右起最大子段和 M最大子段和 sum和 en覆蓋標記 delta覆蓋值 g翻轉標記 s結點數 
queue<int>q; int Node(int fa,int number) { int i=q.front();q.pop(); f[i]=fa;num[i]=sum[i]=L[i]=R[i]=M[i]=number;s[i]=1; en[i]=delta[i]=g[i]=t[i][0]=t[i][1]=0; } void clear(int x) { q.push(x); if(t[x][0])clear(t[x][0]); if(t[x][1])clear(t[x][1]); t[x][0]=t[x][1]=f[x]=0;
// } void count(int x)//更新記得加自身 { L[x]=max(L[t[x][0]],sum[t[x][0]]+num[x]+L[t[x][1]]); R[x]=max(R[t[x][1]],sum[t[x][1]]+num[x]+R[t[x][0]]); M[x]=max(M[t[x][0]],M[t[x][1]]); M[x]=max(M[x],R[t[x][0]]+L[t[x][1]]+num[x]); sum[x]=sum[t[x][0]]+sum[t[x][1]]+num[x]; s[x]=s[t[x][0]]+s[t[x][1]]+1
; } void pushdown(int x) { if(g[x]) { g[t[x][0]]^=1;g[t[x][1]]^=1; swap(L[t[x][0]],R[t[x][0]]); swap(L[t[x][1]],R[t[x][1]]); g[x]=0; } if(en[x]) { en[t[x][0]]=en[t[x][1]]=1; delta[t[x][0]]=delta[t[x][1]]=delta[x]; L[t[x][0]]=R[t[x][0]]=M[t[x][0]]=delta[x]>0?delta[x]*s[t[x][0]]:0; sum[t[x][0]]=delta[x]*s[t[x][0]]; num[t[x][0]]=delta[x]; L[t[x][1]]=R[t[x][1]]=M[t[x][1]]=delta[x]>0?delta[x]*s[t[x][1]]:0; sum[t[x][1]]=delta[x]*s[t[x][1]]; num[t[x][1]]=delta[x]; en[x]=0; } } int rotate(int x) { int y=f[x]; int k=t[y][1]==x; t[y][k]=t[x][!k];f[t[x][!k]]=y; t[f[y][t[f[y]][1]==y]=x;f[x]=f[y];f[y]=x; t[x][!k]=y; L[x]=L[y];R[x]=R[y];M[x]=M[y];sum[x]=sum[y];s[x]=s[y];en[x]=en[y];delta[x]=delta[y];g[x]=g[y]; count(y); } int splay(int x,int y)//因為到達時y已經被旋轉走,所以要通過fa[y]來判斷 { int fa=f[y]; while(f[x]!=fa) { if(f[f[x]]==fa){rotate(x);break;} int X=t[f[x]][1]==x,Y=t[f[f[x]]][1]==x; if(X^Y)rotate(x),rotate(x); else rotate(f[x]),rotate(x); } } void find(int &r,int x) { for(int i=r;i!=0;) { pushdown(i); if(x<=s[t[i][0]])i=t[i][0];else if(x==s[t[i]][0]+1){splay(i,r);r=i;break;} else{x-=s[t[i][0]]+1;i=t[i][1];} } } void build(int fa,int &x,int l,int r) { if(l>r)return; int mid=(l+r)>>1; x=Node(fa,a[mid]); if(l<mid)build(x,t[x][0],l,mid-1); if(r>mid)build(x,t[x][1],mid+1,r); count(x); } void insert() { int l,k; scanf("%d%d",&l,&k); for(int i=1;i<=k;i++)scanf("%d",&a[i]); int r;build(0,r,1,k); find(root,l);find(t[root][1],0);//? t[t[root][1]][0]=r; count(t[root][1]);count(root); } void del() { int l,k; scanf("%d%d",&l,&k); find(root,l-1);find(t[root][1],k); clear(t[t[root][1]][0]);t[t[root][1]][0]=0; } void cover() { int l,k,number; scanf("%d%d%d",&l,&k,&number); find(root,l-1);find(t[root][1],k); int y=t[t[root][1]][0]; en[y]=1; delta[y]=number; L[y]=R[y]=M[y]=delta[y]>0?delta[y]*s[y]:0; sum[y]=delta[y]*s[y]; num[y]=delta[y]; } void reverse() { int l,k; scanf("%d%d%d",&l,&k); find(root,l-1);find(t[root][1],k); int y=t[t[root][1]][0]; g[y]^=1; swap(L[y],R[y]); } int getsum() { int l,k; scanf("%d%d%d",&l,&k); find(root,l-1);find(t[root][1],k); int y=t[t[root][1]][0]; return sum[y]; } int getM() { int l,k; scanf("%d%d%d",&l,&k); find(root,l-1);find(t[root][1],k); int y=t[t[root][1]][0]; return M[y]; } char str[20]; int main() { scanf("%d%d",&n,&m); //0? for(int i=maxn;i>=1;i--)q.push(i); for(int i=1;i<=n;i++)scanf("%d",&a[i]); int root=0; build(0,root,1,n);
View Code

。。。