线段树模板(HDU 6356 Glad You Came)

题目:

HDU 6356

http://acm.hdu.edu.cn/showproblem.php?pid=6356

很裸的线段树

#include<bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pqueue priority_queue
#define NEW(a,b) memset(a,b,sizeof(a))
#define si(x) scanf("%lld",&x)
#define lowbit(x) (x&(-x))
#define lc (d<<1)
#define rc (d<<1|1)
#define eps 1e-9
const double pi=4.0*atan(1.0);
const double e=exp(1.0);
const int maxn=1e7+8;
typedef long long LL;
typedef unsigned long long ULL;
//typedef pair<LL,LL> P;
const LL mod=1024*1024*1024;
const ULL base=1e7+7;
using namespace std;
unsigned x,y,z,w;
unsigned RNG(){
    x=x^(x<<11);
    x=x^(x>>4);
    x=x^(x<<5);
    x=x^(x>>14);
    w=x^(y^z);
    x=y;
    y=z;
    z=w;
    return z;
}
struct node{
    int l,r,mi,lz;
}a[maxn];
void build(int l,int r,int d){
    a[d].l=l;
    a[d].r=r;
    a[d].mi=a[d].lz=0;
    if(l!=r){
        int mid=(a[d].l+a[d].r)>>1;
        build(l,mid,lc);
        build(mid+1,r,rc);
    }
}
void add(int l,int r,int d,int x){
    if(l==a[d].l&&r==a[d].r){
        a[d].lz=max(x,a[d].lz);
        a[d].mi=max(x,a[d].mi);
        return ;
    }
    if(x<=a[d].mi){
        return ;
    }
    int mid=(a[d].l+a[d].r)>>1;
    if(a[d].lz!=0){
        add(a[d].l,mid,lc,a[d].lz);
        add(mid+1,a[d].r,rc,a[d].lz);
        a[d].lz=0;
    }
    if(l>mid){
        add(l,r,rc,x);
    }
    else if(r<=mid){
        add(l,r,lc,x);
    }
    else{
        add(l,mid,lc,x);
        add(mid+1,r,rc,x);
    }
    a[d].mi=min(a[lc].mi,a[rc].mi);
}
int query(int l,int r,int d){
    if(l==a[d].l&&r==a[d].r){
        return a[d].mi;
    }
    int mid=(a[d].l+a[d].r)>>1;
    if(a[d].lz!=0){
        add(a[d].l,mid,lc,a[d].lz);
        add(mid+1,a[d].r,rc,a[d].lz);
        a[d].lz=0;
    }
    if(l>mid){
        return query(l,r,rc);
    }
    else if(r<=mid){
        return query(l,r,lc);
    }
}
int main(){
    fio;
    int t;
    cin>>t;
    int n,m;
    while(t--){
        w=0;
        cin>>n>>m>>x>>y>>z;
        build(1,n,1);
        unsigned f1,f2,f3;
        LL l,r,v;
        for(int i=1;i<=m;i++){
            f1=RNG();
            f2=RNG();
            f3=RNG();
            l=min((f1%n)+1,(f2%n)+1);
            r=max((f1%n)+1,(f2%n)+1);
            v=f3%mod;
            add(l,r,1,v);
        }
        LL res=0;
        for(int i=1;i<=n;i++){
            res^=1ll*i*(query(i,i,1));
        }
        cout<<res<<endl;
    }
}

 

posted @ 2018-08-10 16:56  我要见血小板  阅读(316)  评论(0编辑  收藏  举报