题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356
思路:。。。就单纯满足题目要求就好了。线段树跑的比st快好多。。应该是st写挫了。。
反向st表:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <bitset>
#include <cmath>
#include <cctype>
#include <unordered_map>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll inff = 0x3f3f3f3f3f3f3f3f;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%lld",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod unsigned(1<<30)
#define pb push_back
#define lc d<<1
#define rc d<<1|1
#define Pll pair<ll,ll>
#define P pair<int,int>
#define pi acos(-1)
unsigned a[10],stmax[100008][32],x,y,z,n,m;
unsigned RNG()
{
x=x^(x<<11);
x=x^(x>>4);
x=x^(x<<5);
x=x^(x>>14);
unsigned w=x^(y^z);
x=y;y=z;z=w;
return z;
}
void st()
{
for(int j=30;j>=0;j--)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
//stmin[i][j]=min(stmin[i][j-1],stmin[i+(1<<(j-1))][j-1]);
stmax[i][j]=max(stmax[i][j+1],stmax[i][j]);
stmax[i+(1<<j)][j]=max(stmax[i+(1<<j)][j],stmax[i][j+1]);
}
}
}
unsigned add(unsigned l,unsigned r,unsigned v)
{
unsigned x=0;
while((1<<(x+1))<=r-l+1) x++;
stmax[l][x]=max(stmax[l][x],v);stmax[r-(1<<x)+1][x]=max(stmax[r-(1<<x)+1][x],v);
}
int main()
{
cin.tie(0);
cout.tie(0);
int T;cin>>T;
while(T--){
cin>>n>>m>>x>>y>>z;
REW(stmax,0);
for(int i=1;i<=m;i++){
for(int j=1;j<=3;j++){
a[j]=RNG();
}
unsigned l=min(a[1]%n,a[2]%n)+1;
unsigned r=max(a[1]%n,a[2]%n)+1;
unsigned v=a[3]%mod;
add(l,r,v);
}
st();
ll ans=0;
for(int i=1;i<=n;i++) ans^=1LL*(1ll*i*1LL*1ll*stmax[i][0]);
cout<<ans<<endl;
}
return 0;
}
线段树:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <bitset>
#include <cmath>
#include <cctype>
#include <unordered_map>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll inff = 0x3f3f3f3f3f3f3f3f;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%lld",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod unsigned(1<<30)
#define pb push_back
#define lc d<<1
#define rc d<<1|1
#define Pll pair<ll,ll>
#define P pair<int,int>
#define pi acos(-1)
unsigned x,y,z;
struct as{
unsigned l,r,mi,lz;}tr[100008<<2];
unsigned RNG(){
x=x^(x<<11);
x=x^(x>>4);
x=x^(x<<5);
x=x^(x>>14);
unsigned w=x^(y^z);
x=y;y=z;z=w;
return z;
}
unsigned a[10];
void push(unsigned d){tr[d].mi=min(tr[lc].mi,tr[rc].mi);}
void build(unsigned d,unsigned l,unsigned r)
{
tr[d].l=l,tr[d].r=r,tr[d].lz=0;
if(l==r) {tr[d].mi=0;return;}
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
push(d);
}
void as(unsigned d)
{
if(tr[d].lz!=0)
{
tr[lc].lz=max(tr[d].lz,tr[lc].lz),tr[rc].lz=max(tr[d].lz,tr[rc].lz);
tr[lc].mi=max(tr[lc].lz,tr[lc].mi),tr[rc].mi=max(tr[rc].lz,tr[rc].mi);
tr[d].lz=0;
}
}
void add(unsigned d,unsigned l,unsigned r,unsigned pos)
{
if(pos<=tr[d].mi) return;
if(l==tr[d].l&&r==tr[d].r) {tr[d].lz=max(pos,tr[d].lz),tr[d].mi=max(pos,tr[d].mi);return;}
as(d);
int mid=(tr[d].l+tr[d].r)>>1;
if(mid>=r) add(lc,l,r,pos);
else if(l>mid) add(rc,l,r,pos);
else add(lc,l,mid,pos),add(rc,mid+1,r,pos);
push(d);
}
unsigned query(unsigned d,unsigned pos)
{
if(tr[d].mi==0) return 0;
if(tr[d].l==tr[d].r&&tr[d].l==pos) {return tr[d].mi;}
as(d);
int mid=(tr[d].l+tr[d].r)>>1;
if(mid>=pos) return query(lc,pos);
else return query(rc,pos);
}
int main(){
int T;cin>>T;
while(T--){
int n,m;
cin>>n>>m>>x>>y>>z;
build(1,1,n);
for(int i=1;i<=m;i++){
for(int j=1;j<=3;j++){
a[j]=RNG();
}
unsigned l=min(a[1]%n,a[2]%n)+1;
unsigned r=max(a[1]%n,a[2]%n)+1;
unsigned v=a[3]%mod;
add(1,l,r,v);
}
add(1,1,n,0);
ll ans=0;
for(int i=1;i<=n;i++){
ans^=1LL*(1ll*i*1LL*query(1,i));
}
cout<<ans<<endl;
}
return 0;
}