标签:greedy opera div swa origin ring http f11 mat
Time limit 3000 ms
Memory limit 262144 kB
Source Codeforces Round #532 (Div. 2)
Tags data structures divide and conquer greedy math *2600
Editorial
英文题面还是没读太懂……其他博客是这么说的——一个长度为\(n\)的序列,\(m\)个询问,每次询问一个区间内数字的异或最大值。
我用的下面第一个思路,还没仔细想证明啊……为什么可以直接把线性基里靠前的那些替换掉而不改变线性基的性质呢……
又有了4道题可以补了
#include<cstdio>
#include<cstring>
#include<algorithm>
const int MAXN=1e6+5;
const int wide=31;
int T;
int n,m;
int p[MAXN][wide+2],pos[MAXN][wide+2];
void insert(int loc,int val)//location和value
{
    for(int i=wide;~i;i--)
    {
        p[loc][i]=p[loc-1][i];
        pos[loc][i]=pos[loc-1][i];
    }
    int temp=loc;
    for(int i=wide;~i;i--)
    {
        if((val>>i)&1)
        {
            if(!p[loc][i])
            {
                p[loc][i]=val;
                pos[loc][i]=temp;
                return;
            }
            if(pos[loc][i]<temp)//????????????????????????这里目前还没有想通
            {
                std::swap(pos[loc][i],temp);//????????????????????????
                std::swap(p[loc][i],val);
            }
            val^=p[loc][i];
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1,v;i<=n;i++)
    {
        scanf("%d",&v);
        insert(i,v);
    }
    scanf("%d",&m);
    int lastans=0;
    while(m--)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        int ans=0;
        for(int i=wide;~i;i--)
        {
            if((ans^p[r][i])>ans&&pos[r][i]>=l)
                ans^=p[r][i];
        }
        printf("%d\n",ans);
    }
    return 0;
}
CodeForces 1100F Ivan and Burgers
标签:greedy opera div swa origin ring http f11 mat
原文地址:https://www.cnblogs.com/wawcac-blog/p/11326516.html