标签:
题目 :
定义:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define P 1000000000LL
#define n 100000
using namespace std;
struct treap_node{
treap_node *left,*right;
int size,wgt;
long long fix,ans;
treap_node(long long fix): fix(fix) {ans=fix; wgt=size=1; left=right=NULL;}
int lsize()
{
if (left)
return left->size;
else
return 0;
}
int rsize()
{
if (right)
return right->size;
else
return 0;
}
void Maintain()
{
size=wgt;
size+=lsize()+rsize();
ans=(long long)fix*(long long)(lsize()+1)*(long long)(rsize()+1);
if (left) ans=(long long)(ans+left->ans);
if (right) ans=(long long)(ans+right->ans);
}
};
treap_node *rootlarge,*rootsmall;
long long a[100001];
int t,l1,r1,l2,r2;
typedef pair<treap_node*,treap_node*> droot;
void print(treap_node *p)
{
if (p->left)
print(p->left);
printf("%d\n",p->fix);
if (p->right)
print(p->right);
}
treap_node *mergesmall(treap_node *a,treap_node *b)
{
if (!b) return a; if (!a) return b;
if (a->fix<b->fix)
{
a->right=mergesmall(a->right,b);
a->Maintain();
return a;
}
else
{
b->left=mergesmall(a,b->left);
b->Maintain();
return b;
}
}
treap_node *mergelarge(treap_node *a,treap_node *b)
{
if (!b) return a; if (!a) return b;
if (a->fix>b->fix)
{
a->right=mergelarge(a->right,b);
a->Maintain();
return a;
}
else
{
b->left=mergelarge(a,b->left);
b->Maintain();
return b;
}
}
droot split(treap_node *x,int k)
{
if (!x) return droot(NULL,NULL);
droot y;
if (k<=x->lsize())
{
y=split(x->left,k);
x->left=y.second;
x->Maintain();
y.second=x;
}
else
{
y=split(x->right,k-x->lsize()-1);
x->right=y.first;
x->Maintain();
y.first=x;
}
return y;
}
long long qlarge(int a,int b)
{
droot x,y;
long long t;
x=split(rootlarge,a-1);
y=split(x.second,b-a+1);
t=y.first->ans;
x.second=mergelarge(y.first,y.second);
rootlarge=mergelarge(x.first,x.second);
return t;
}
long long qsmall(int a,int b)
{
droot x,y;
long long t;
x=split(rootsmall,a-1);
y=split(x.second,b-a+1);
t=y.first->ans;
x.second=mergesmall(y.first,y.second);
rootsmall=mergesmall(x.first,x.second);
return t;
}
int main()
{
int i;
long long ai=1,bi=1,maxn,minn,sum;
treap_node *temp;
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
a[0]=0;
for (i=1;i<=100000;++i)
{
ai=(long long)((long long)ai*(long long)1023)%P;
bi=(long long)((long long)bi*(long long)1025)%P;
a[i]=ai^bi;
temp=new treap_node(a[i]);
rootlarge=mergelarge(rootlarge,temp);
temp=new treap_node(a[i]);
rootsmall=mergesmall(rootsmall,temp);
}
scanf("%d",&t);
while (t--)
{
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if (r2<l1)
sum=0;
else
{
if (l1>l2)
l2=l1;
if (r1<l2)
{
maxn=qlarge(l1,r2)-qlarge(l1,l2-1)-qlarge(r1+1,r2);
if (r1+1<=l2-1)
maxn+=qlarge(r1+1,l2-1);
minn=qsmall(l1,r2)-qsmall(l1,l2-1)-qsmall(r1+1,r2);
if (r1+1<=l2-1)
minn+=qsmall(r1+1,l2-1);
sum=maxn-minn;
}
else
{
if (r2>r1)
{
maxn=qlarge(l1,r2);
if (l2>l1) maxn-=qlarge(l1,l2-1);
if (r2>r1) maxn-=qlarge(r1+1,r2);
minn=qsmall(l1,r2);
if (l2>l1) minn-=qsmall(l1,l2-1);
if (r2>r1) minn-=qsmall(r1+1,r2);
sum=maxn-minn;
}
else
{
maxn=qlarge(l1,r2);
if (l2>l1) maxn-=qlarge(l1,l2-1);
minn=qsmall(l1,r2);
if (l2>l1) minn-=qsmall(l1,l2-1);
sum=maxn-minn;
}
}
}
printf("%I64d\n",sum);
}
}
标签:
原文地址:http://blog.csdn.net/lcomyn/article/details/45980057