CodeForces 1100F Ivan and Burgers

CodeForces题面

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道题可以补了

  • [x] CodeForces 1100F Ivan and Burgers 单纯询问区间异或最大值
  • [ ] HDU 6579 Operation 多了个末尾插入数据的操作,还有强制在线
  • [ ] BZOJ 4184 shallot 这题还多了插入和删除的操作。居然是权限题……本地测一下算了。
  • [ ] UVALive 8514 XOR 2017ICPC西安的一道题,操作都差不多

源代码

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

原文地址:https://www.cnblogs.com/wawcac-blog/p/11326516.html

时间: 2024-10-05 11:36:02

CodeForces 1100F Ivan and Burgers的相关文章

codeforces 1100F Ivan and Burgers 线性基 离线

题目传送门 题意: 给出 n 个数,q次区间查询,每次查询,让你选择任意个下标为 [ l , r ] 区间内的任意数,使这些数异或起来最大,输出最大值. 思路:离线加线性基. 线性基学习博客1 线性基学习博客2 对于此题,先把区间按照 r 从小到大排序,然后依次处理这些区间,每次插入线性基时,优先保留下标比较大的线性基.查询时,只异或上下标大于 l 的值. 记住异或的符号的优先级很低,所以  if( res^p[i] > res )这样的代码是会wa死的,要注意(这道题这么写,样例都过不了) #

F. Ivan and Burgers(线性基,离线)

题目链接:http://codeforces.com/contest/1100/problem/F 题目大意:首先输入n,代表当前有n个数,然后再输入m,代表m次询问,每一次询问是询问区间[l,r],这段区间内的数的最大异或值. 具体思路:贪心,我们按照右边界的大小进行排序,小的在上面,大的往下安排,然后每一次我们寻找1--> r区间内的线性基,如果当前的线性基能往后移动,我们就选取后面的这个线性基(因为我们对输入的数据进行了排序,后面的r肯定是大的,所以我们将选取的线性基尽量的往后安排肯定是没

Codeforces 1100F(线性基+贪心)

题目链接 题意 给定序列,$q(1\leq q \leq 100000) $次询问,每次查询给定区间内的最大异或子集. 思路 涉及到最大异或子集肯定从线性基角度入手.将询问按右端点排序后离线处理询问,对线性基的每一位贪心的保留靠后的. 代码 #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " << x << endl; using namespace std;

【CF1100F】Ivan and Burgers(线性基,分治)

题意:给定n个数,每个数为c[i],有q个询问,每次询问从第l个到第r个数字的最大xor和 n,q<=5e5,c[i]<=1e6,时限3s 思路:直接线段树维护区间线性基是3个log 做法1:因为不是强制在线把询问分治能降到2个log 1 #include<bits/stdc++.h> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath>

Educational Codeforces Round 71 (Rated for Div. 2) A - There Are Two Types Of Burgers

原文链接:https://www.cnblogs.com/xwl3109377858/p/11404050.html Educational Codeforces Round 71 (Rated for Div. 2) A - There Are Two Types Of Burgers There are two types of burgers in your restaurant — hamburgers and chicken burgers! To assemble a hamburg

There Are Two Types Of Burgers (Educational Codeforces Round 71)

There are two types of burgers in your restaurant — hamburgers and chicken burgers! To assemble a hamburger you need two buns and a beef patty. To assemble a chicken burger you need two buns and a chicken cutlet. You have b buns, p beef patties and f

Codeforces Round #594 (Div. 2) B C - Ivan the Fool and the Probability Theory

题目链接:https://codeforces.com/contest/1248/problem/C 赛后补的,已经有很详细的题解了,这里只作一个记录. 每相邻两行只可能完全相同或者完全不同,而每一行只有1010101010……和01010101010……是没有连续相邻的(有连续相邻的下一行只能完全不同,即有连续相邻的从第一行开始后面的就已经固定了),n=1时答案是递推数列,F[n] = F[n-1] + F[n-2].当第一行为10101010……或0101010101时每一行只有两种状态,此

Codeforces Round #594 (Div. 2) C. Ivan the Fool and the Probability Theory

题目原址:C. Ivan the Fool and the Probability Theory 题意:n×m的网格中填黑白格,最多有两个相邻,共用一条边为相邻,有几种填法. 思路:这题比赛写自闭了,一直觉得自己的思路没错,然后就残酷打脸,超级难受的那种. 从不能有3个及以上相邻可以得出,只要有两个相邻的就能确定全部的分布,那就变成了求一行的方法数量,再减去黑白相间的两种,而剩下就是黑白相间两种情况时有多少种了. 一行的求法:dp[ i ] [ 0 ]表示在第 i 个格子里放白色的放法有多少,d

Codeforces 1248 div2 C. Ivan the Fool and the Probability Theory (思维)

题意:给一个n×m的网格,只涂黑白,问再没有三个联通方格的情况下涂色,有多少种涂法?结果mod 1e9+7 直接说解法: 首先判断第一行的情况,做递推关系式F[ i ],F[ 1 ]显然为2,F[ 2 ]也可以任意,显然为4. 接下来F[ 3 ],需要分这个的前两个是否为连续相同的色块,如果是连续相同的色块,那么只能与前一个色块不同.我们把F[i]拓展为F[i][j],i表示到第几个块,j表示第i个的前两个是否为连续两块.那么F[ i ]的种类数分为: (1):前面是两个连续相同,那么F[ i