其他分享
首页 > 其他分享> > CodeForces 1100F Ivan and Burgers

CodeForces 1100F Ivan and Burgers

作者:互联网

CodeForces题面

<iframe frameborder="0" height="900px" id="frame-description" scrolling="no" src="https://vjudge.net/problem/description/110004?1564798626000" style="box-sizing: inherit; height: 2538.11px;" width="100%"> </iframe>

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\)个询问,每次询问一个区间内数字的异或最大值。

解题思路

我用的下面第一个思路,还没仔细想证明啊……为什么可以直接把线性基里靠前的那些替换掉而不改变线性基的性质呢……

又有了3道题要补

源代码

#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;
}

标签:loc,en,wide,int,pos,CodeForces,Burgers,Ivan,include
来源: https://www.cnblogs.com/wawcac-blog/p/11326516.html