hdu6356(线段树or反向st表)

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/qq_40858062/article/details/81583951
今日推荐