正题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356
题目大意
nnn个数的一个序列aaa开始都是000。mmm个操作[li,ri,vi][l_i,r_i,v_i][li,ri,vi]表示ax=max{ax,v}(li≤x≤ri)a_x=max\{a_x,v\}(l_i\leq x\leq r_i)ax=max{ax,v}(li≤x≤ri),求最终序列
解题思路
我们考虑将RMQRMQRMQ反过来操作,我们直接修改fi,jf_{i,j}fi,j然后将RMQRMQRMQ反过来转移即可。时间复杂度O(T(m+nlogn))O(\ T(m+n\log n)\ )O( T(m+nlogn) )
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define uit unsigned int
using namespace std;
const uit N=1e5+10;
uit T,n,m,x,y,z,lg[N],f[N][30];
uit answer(){x^=(x<<11); x^=(x>>4); x^=(x<<5); x^=(x>>14);uit w=x^y^z; x=y; y=z; z=w; return z;
}
int main()
{scanf("%u",&T);for(uit i=2;i<N;i++)lg[i]=lg[i/2]+1;while(T--){scanf("%u%u%u%u%u",&n,&m,&x,&y,&z);memset(f,0,sizeof(f));for(uit i=1;i<=m;i++){uit f1=answer()%n,f2=answer()%n,v=answer()%1073741824u;uit l=min(f1,f2)+1,r=max(f1,f2)+1,z=lg[r-l+1];f[l][z]=max(f[l][z],v);f[r-(1u<<z)+1][z]=max(f[r-(1u<<z)+1][z],v); }for(int i=lg[n]-1;i>=0;i--)for(uit j=1;j+(1<<i)-1<=n;j++){f[j][i]=max(f[j][i],f[j][i+1]);if(j+(1<<i)<=n)f[j+(1<<i)][i]=max(f[j+(1<<i)][i],f[j][i+1]);}long long ans=0;for(long long i=1;i<=n;i++)ans=ans^(i*f[i][0]);printf("%lld\n",ans);}
}