HDU6356 Glad You Came

一开始我就加了剪枝,如果当前更新的值比这一段的最小值都小就返回不更新,然后过不了样例。。。于是去掉对更新操作排了一遍序,才能过样例,接下来就T了,因为mlogn更新mlogm排序太慢了,于是qt开始接受优化工作,qt这个暑假已经不知道卡了多少次常数过不去了,zkw,手动开O2,register什么都加上了,26s被优化到6s。。。还是超时。赛后aols说他这样过了,我回去检查一蛤,aols 告诉我我的gank函数传下去没有更新最小值。。。哇,菜不成声.jpg,不然顺利的话感觉能上第一版233,3题第一版鎕题还是太恐怖了,买区域赛题送final题233。然而这道题还有一种十分玄学的做法,因为是这个生成函数随机分布性很强,所以很可能覆盖满整个区间,于是直接nth_element取最大的2e5个操作进行区间更新就A了,,qt气到自闭,连续2场有玄学做法能过的题

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxl 100010
#define maxm 5000001

using namespace std;

int n,m;
struct node
{
	int l,r;unsigned int val,tag,mi;
}tree[maxl<<2];
struct que
{
	int l,r;unsigned int val;
}q[maxm];
unsigned int X,Y,Z;
long long ans[maxl];

inline unsigned int max(unsigned int a,unsigned int b)
{
	if(a>b)	return a;
	else return b;
}

inline unsigned int min(unsigned int a,unsigned int b)
{
	if(a<b)	return a;
	else	return b;
}

inline void build(int k,int l,int r)
{
	tree[k].l=l;tree[k].r=r;tree[k].tag=0;tree[k].val=0;
	tree[k].mi=0;
	if(l==r)
		return;
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);

}

inline void prework()
{
	scanf("%d%d%u%u%u",&n,&m,&X,&Y,&Z);
	build(1,1,n);
}

inline unsigned int ran()
{
	X=X^(X<<11);
	X=X^(X>>4);
	X=X^(X<<5);
	X=X^(X>>14);
	unsigned int W=X^(Y^Z);
	X=Y;Y=Z;Z=W;
	return Z;
}


inline void gank(int k)
{
	if(tree[k].l!=tree[k].r)
	{
		if(tree[k].tag>tree[k<<1].val)
			tree[k<<1].tag=tree[k].tag,
			tree[k<<1].val=tree[k].tag,
			tree[k<<1].mi=tree[k].tag;
		if(tree[k].tag>tree[k<<1|1].val)
			tree[k<<1|1].tag=tree[k].tag,
			tree[k<<1|1].val=tree[k].tag,
			tree[k<<1|1].mi=tree[k].tag;
	}
	
	tree[k].tag=0;
}

inline void add(int k,int l,int r,unsigned int v)
{
	if(tree[k].tag)
		gank(k);
	if(v<=tree[k].mi)
		return;
	if(tree[k].l==l && tree[k].r==r)
	{
		tree[k].val=v;tree[k].tag=v;
		tree[k].mi=v;
		return;
	}
	int mid=(tree[k].l+tree[k].r)>>1;
	if(r<=mid)
		add(k<<1,l,r,v);
	else
	if(l>mid)
		add(k<<1|1,l,r,v);
	else
		add(k<<1,l,mid,v),add(k<<1|1,mid+1,r,v);
	tree[k].mi=min(tree[k<<1].mi,tree[k<<1|1].mi);
}

inline void getnum(int k)
{
	if(tree[k].tag)
		gank(k);
	if(tree[k].l==tree[k].r)
	{
		ans[tree[k].l]=tree[k].val;
		return;
	}
	getnum(k<<1);getnum(k<<1|1);
}

inline bool cmp(const que &x,const que &y)
{
	return x.val>y.val;
}

inline void mainwork()
{
	unsigned int l,r,x,y,v,mod=(1<<30);
	for(register int i=1;i<=m;++i)
	{
		x=ran()%n;y=ran()%n;v=ran()%mod;
		add(1,min(x+1,y+1),max(x+1,y+1),v);
	}
//	sort(q+1,q+1+m,cmp);
//	for(register int i=1;i<=m;++i)
//		add(1,q[i].l,q[i].r,q[i].val);
	getnum(1);
}

inline void print()
{
	long long s=0;
	for(register int i=1;i<=n;++i)
		s=s^(1ll*i*ans[i]);
	printf("%lld\n",s);
}

int main()
{
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxl 100010
#define maxm 5000001
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
using namespace std;
int n,m,L,R,M;
unsigned int T[maxl*8];
//struct que
//{
//    int l,r;unsigned int val;
//}q[maxm];
unsigned int X,Y,Z,V;
struct node
{
	int x,y;
	unsigned int z;
	bool operator < (const node&B)const
	{
		return z>B.z;
	}
}Q[maxm];
inline void prework()
{
    scanf("%d%d%u%u%u",&n,&m,&X,&Y,&Z);
    for(M=1;M<(n+2);M<<=1);
    //for(register int i=2*M;i;--i)T[i]=0;
    memset(T,0,sizeof(unsigned int)*(2*M));
}

inline unsigned int ran()
{
    X=X^(X<<11);
    X=X^(X>>4);
    X=X^(X<<5);
    X=X^(X>>14);
    unsigned int W=X^(Y^Z);
    X=Y;Y=Z;Z=W;
    return Z;
}

//inline unsigned int max(unsigned int a,unsigned int b){return a>b?a:b;}

//inline unsigned int min(unsigned int a,unsigned int b){return a<b?a:b;}

inline void add(int l,int r,unsigned int v)
{
    for(l=l+M-1,r=r+M+1;l^r^1;l>>=1,r>>=1)
    {
        if((!(l&1))&&(T[l^1]<v))T[l^1]=v;
        if((r&1)&&(T[r^1]<v))T[r^1]=v;
    }
}

inline void getnum(int k,int l,int r)
{
    if(l>n||l==r)return;
    if(T[k])
    {
        if(T[k]>T[k<<1])T[k<<1]=T[k];
        if(T[k]>T[k<<1|1])T[k<<1|1]=T[k];
    }
    int mid=(l+r)>>1;
    getnum(k<<1,l,mid);getnum(k<<1|1,mid+1,r);
}

//inline bool cmp(const que &x,const que &y)
//{
//    return x.val<y.val;
//}

inline void mainwork()
{
    unsigned int x,y,v;
    for(register int i=1;i<=m;++i)
    {
        x=ran()%n;y=ran()%n;v=ran()%(1<<30);
        //q[i].l=min(x+1,y+1);
        //q[i].r=max(x+1,y+1);
        //q[i].val=v;
        L=min(x+1,y+1),R=max(x+1,y+1);
        Q[i].x=L;Q[i].y=R;Q[i].z=v;
        //add(L,R,V);
        //printf("i= %d L= %d R= %d v= %d\n",i,L,R,v);
    }
    int dd=min(200000,m);
    //printf("dd = %d\n",dd);
    nth_element(Q+1,Q+dd,Q+1+m);
    for(register int i=1;i<=dd;++i)
    {
        L=Q[i].x;R=Q[i].y;v=Q[i].z;
        //printf("%d %d %d\n",Q[i].x,Q[i].y,Q[i].z);
        add(L,R,v);
    }
    getnum(1,0,M-1);
}

inline void print()
{
    long long s=0;
    for(register int i=1;i<=n;++i)
        s=s^(1ll*i*T[i+M]);
    printf("%lld\n",s);
    //for(int i=1;i<=n;i++)printf("%d%c",ans[i],i==n?'\n':' ');
}

int main()
{
    //freopen("1.in","r",stdin);
    //freopen("1.out","w",stdout);
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;++i)
    {
        prework();
        mainwork();
        print();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/liufengwei1/article/details/81460347
今日推荐