| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
坑爹题,Splay单旋AC,双旋TLE。。//单旋代码
#include<stdio.h>
#define MAXN 150000
using namespace std;
struct data
{
long long sum,lazy,left,right,father,value,size;
} tree[MAXN];
long long z,n,q,x,y,i,t,root,total;
char s[2];
void pushup(long long p)
{
tree[p].size=1+tree[tree[p].left].size+tree[tree[p].right].size;
tree[p].sum=tree[p].value+tree[tree[p].left].sum+tree[tree[p].right].sum;
}
void pushdown(long long p)
{
tree[tree[p].left].sum+=tree[p].lazy*tree[tree[p].left].size;
tree[tree[p].right].sum+=tree[p].lazy*tree[tree[p].right].size;
tree[tree[p].left].lazy+=tree[p].lazy;
tree[tree[p].right].lazy+=tree[p].lazy;
tree[p].value+=tree[p].lazy;
tree[p].lazy=0;
}
void zig(long long p)
{
int f=tree[p].father;
pushdown(f);
pushdown(p);
tree[f].left=tree[p].right;
tree[tree[p].right].father=f;
tree[p].father=tree[f].father;
if (tree[f].father!=0)
{
if (f==tree[tree[f].father].left) tree[tree[f].father].left=p;
else tree[tree[f].father].right=p;
}
tree[p].right=f;
tree[f].father=p;
pushup(f);
pushup(p);
}
void zag(long long p)
{
int f=tree[p].father;
pushdown(f);
pushdown(p);
tree[f].right=tree[p].left;
tree[tree[p].left].father=f;
tree[p].father=tree[f].father;
if (tree[f].father!=0)
{
if (f==tree[tree[f].father].left) tree[tree[f].father].left=p;
else tree[tree[f].father].right=p;
}
tree[p].left=f;
tree[f].father=p;
pushup(f);
pushup(p);
}
void splay(long long r,long long p)
{
if (r==p) return;
while (tree[p].father!=r)
{
if (p==tree[tree[p].father].left) zig(p);
else zag(p);
}
if (p==tree[tree[p].father].left) zig(p);
else zag(p);
if (r==root) root=p;
}
int maketree(long long x_make,long long y_make,long long f)
{
if (x_make>y_make) return 0;
int r=(x_make+y_make)/2;
tree[r].father=f;
tree[r].left=maketree(x_make,r-1,r);
tree[r].right=maketree(r+1,y_make,r);
pushup(r);
return r;
}
int main()
{
// freopen("input.txt", "r", stdin);
scanf("%I64d%I64d",&n,&q);
for (i=1;i<=n;i++)
{
scanf("%I64d",&tree[i].value);
}
root=maketree(1,n,0);
for (i=1;i<=q;i++)
{
scanf("%s",s);
if (s[0]=='Q')
{
scanf("%I64d%I64d",&x,&y);
if (x==1 and y==n)
{
printf("%I64d\n",tree[root].sum);
}
if (x==1 and y!=n)
{
splay(root,y+1);
t=tree[root].left;
printf("%I64d\n",tree[t].sum);
}
if (x!=1 and y==n)
{
splay(root,x-1);
t=tree[root].right;
printf("%I64d\n",tree[t].sum);
}
if (x!=1 and y!=n)
{
splay(root,x-1);
t=tree[root].right;
splay(t,y+1);
t=tree[root].right;
t=tree[t].left;
printf("%I64d\n",tree[t].sum);
}
}
else
{
scanf("%I64d%I64d%I64d",&x,&y,&z);
if (x==1 and y==n)
{
tree[root].lazy+=z;
tree[root].sum+=z*tree[root].size;
}
if (x==1 and y!=n)
{
splay(root,y+1);
t=tree[root].left;
tree[t].lazy+=z;
tree[t].sum+=z*tree[t].size;
tree[root].sum+=z*tree[t].size;
}
if (x!=1 and y==n)
{
splay(root,x-1);
t=tree[root].right;
tree[t].lazy+=z;
tree[t].sum+=z*tree[t].size;
tree[root].sum+=z*tree[t].size;
}
if (x!=1 and y!=n)
{
splay(root,x-1);
t=tree[root].right;
splay(t,y+1);
t=tree[root].right;
t=tree[t].left;
tree[t].lazy+=z;
tree[t].sum+=z*tree[t].size;
tree[tree[root].right].sum+=z*tree[t].size;
tree[root].sum+=z*tree[t].size;
}
}
}
return 0;
}
//双旋代码
#include<stdio.h>
#define MAXN 150000
using namespace std;
struct data
{
long long sum,lazy,left,right,father,value,size;
} tree[MAXN];
long long z,n,q,x,y,i,t,root,total;
char s[2];
void pushup(long long p)
{
tree[p].size=1+tree[tree[p].left].size+tree[tree[p].right].size;
tree[p].sum=tree[p].value+tree[tree[p].left].sum+tree[tree[p].right].sum;
}
void pushdown(long long p)
{
tree[tree[p].left].sum+=tree[p].lazy*tree[tree[p].left].size;
tree[tree[p].right].sum+=tree[p].lazy*tree[tree[p].right].size;
tree[tree[p].left].lazy+=tree[p].lazy;
tree[tree[p].right].lazy+=tree[p].lazy;
tree[p].value+=tree[p].lazy;
tree[p].lazy=0;
}
void zig(long long p)
{
int f=tree[p].father;
pushdown(f);
pushdown(p);
tree[f].left=tree[p].right;
tree[tree[p].right].father=f;
tree[p].father=tree[f].father;
if (tree[f].father!=0)
{
if (f==tree[tree[f].father].left) tree[tree[f].father].left=p;
else tree[tree[f].father].right=p;
}
tree[p].right=f;
tree[f].father=p;
pushup(f);
pushup(p);
}
void zag(long long p)
{
int f=tree[p].father;
pushdown(f);
pushdown(p);
tree[f].right=tree[p].left;
tree[tree[p].left].father=f;
tree[p].father=tree[f].father;
if (tree[f].father!=0)
{
if (f==tree[tree[f].father].left) tree[tree[f].father].left=p;
else tree[tree[f].father].right=p;
}
tree[p].left=f;
tree[f].father=p;
pushup(f);
pushup(p);
}
void splay(long long r,long long p)
{
if (r==p) return;
while (tree[p].father!=r)
{
if (tree[tree[p].father].father!=r)
{
if (tree[p].father==tree[tree[tree[p].father].father].left) zig(tree[p].father);
else zag(tree[p].father);
if (p==tree[tree[p].father].left) zig(p);
else zag(p);
}
else
{
if (p==tree[tree[p].father].left) zig(p);
else zag(p);
}
}
if (p==tree[tree[p].father].left) zig(p);
else zag(p);
if (r==root) root=p;
}
int maketree(long long x_make,long long y_make,long long f)
{
if (x_make>y_make) return 0;
int r=(x_make+y_make)/2;
tree[r].father=f;
tree[r].left=maketree(x_make,r-1,r);
tree[r].right=maketree(r+1,y_make,r);
pushup(r);
return r;
}
int main()
{
// freopen("input.txt", "r", stdin);
scanf("%I64d%I64d",&n,&q);
for (i=1;i<=n;i++)
{
scanf("%I64d",&tree[i].value);
}
root=maketree(1,n,0);
for (i=1;i<=q;i++)
{
scanf("%s",s);
if (s[0]=='Q')
{
scanf("%I64d%I64d",&x,&y);
if (x==1 and y==n)
{
printf("%I64d\n",tree[root].sum);
}
if (x==1 and y!=n)
{
splay(root,y+1);
t=tree[root].left;
printf("%I64d\n",tree[t].sum);
}
if (x!=1 and y==n)
{
splay(root,x-1);
t=tree[root].right;
printf("%I64d\n",tree[t].sum);
}
if (x!=1 and y!=n)
{
splay(root,x-1);
t=tree[root].right;
splay(t,y+1);
t=tree[root].right;
t=tree[t].left;
printf("%I64d\n",tree[t].sum);
}
}
else
{
scanf("%I64d%I64d%I64d",&x,&y,&z);
if (x==1 and y==n)
{
tree[root].lazy+=z;
tree[root].sum+=z*tree[root].size;
}
if (x==1 and y!=n)
{
splay(root,y+1);
t=tree[root].left;
tree[t].lazy+=z;
tree[t].sum+=z*tree[t].size;
tree[root].sum+=z*tree[t].size;
}
if (x!=1 and y==n)
{
splay(root,x-1);
t=tree[root].right;
tree[t].lazy+=z;
tree[t].sum+=z*tree[t].size;
tree[root].sum+=z*tree[t].size;
}
if (x!=1 and y!=n)
{
splay(root,x-1);
t=tree[root].right;
splay(t,y+1);
t=tree[root].right;
t=tree[t].left;
tree[t].lazy+=z;
tree[t].sum+=z*tree[t].size;
tree[tree[root].right].sum+=z*tree[t].size;
tree[root].sum+=z*tree[t].size;
}
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator