题目链接:Codeforces - Ivan and Burgers


读题之后发现,比较显然的做法就是线段树维护线性基。(不过复杂度过高,一直没卡过去)。

我们可以尝试离线的做法、先按照右端点排序。

一次插入线性基当中,怎么保证当前对答案异或的时候,这个基底是存在于[l,r]当中的呢?我们每次插入线性基的时候记录一个时间戳即可。如果当前的时间戳大于等于L,就可以异或。

因为我们是从前往后面扫,所以时间戳每次选最大的更新。


卡常失败的代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=5e5+10;
int n,c[N],q;
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read(){int x=0,f=1; char ch=gc();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}return x*f;
}
struct lb{int d[30];inline void insert(int x){for(int i=20;i>=0;i--)   if(x>>i&1){if(d[i])   x^=d[i];else{d[i]=x;  return ;}}}inline void insert(lb &x){for(int i=20;i>=0;i--)    if(x.d[i])  insert(x.d[i]);}
}t[N<<2],res;
void change(int p,int l,int r,int x,int v){t[p].insert(v);if(l==r)    return ;    int mid=l+r>>1;if(x<=mid)   change(p<<1,l,mid,x,v);else   change(p<<1|1,mid+1,r,x,v);
}
void ask(int p,int l,int r,int ql,int qr){if(l==ql&&r==qr)  return res.insert(t[p]),void();int mid=l+r>>1;if(qr<=mid)   ask(p<<1,l,mid,ql,qr);else if(ql>mid)  ask(p<<1|1,mid+1,r,ql,qr);else ask(p<<1,l,mid,ql,mid),ask(p<<1|1,mid+1,r,mid+1,qr);
}
inline int calc(){int s=0;for(int i=20;i>=0;i--)  if((s^res.d[i])>s)   s^=res.d[i];return s;
}
signed main(){n=read();for(int i=1;i<=n;i++)    c[i]=read(),change(1,1,n,i,c[i]);q=read();for(int i=1,l,r;i<=q;i++){l=read(),r=read();   memset(res.d,0,sizeof res.d);ask(1,1,n,l,r);    printf("%d\n",calc());}return 0;
}

AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=5e5+10;
int n,d[25],dfn[25],c[N],q,res[N];
struct node{int l,r,id;}t[N];
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read(){int x=0,f=1; char ch=gc();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}return x*f;
}
int cmp(node a,node b){return a.r<b.r;}
inline void insert(int x,int id){for(int i=20;i>=0;i--)    if(x>>i&1){if(!d[i]){d[i]=x; dfn[i]=id; return;}if(dfn[i]<id)    swap(d[i],x),swap(dfn[i],id);x^=d[i];}
}
inline int ask(int id){int res=0;for(int i=20;i>=0;i--)   if(dfn[i]>=id&&(res^d[i])>res)   res^=d[i];return res;
}
signed main(){n=read();for(int i=1;i<=n;i++)    c[i]=read();q=read();for(int i=1;i<=q;i++) t[i].l=read(),t[i].r=read(),t[i].id=i;sort(t+1,t+1+q,cmp);    int ed=1;for(int i=1;i<=q;i++){while(ed<=t[i].r)    insert(c[ed],ed),ed++;res[t[i].id]=ask(t[i].l);}for(int i=1;i<=q;i++) printf("%d\n",res[i]);return 0;
}

Codeforces - Ivan and Burgers相关推荐

  1. 【Codeforces Round #532 (Div. 2) F. Ivan and Burgers】离线+线性基

    F. Ivan and Burgers 题意 n个数,q次询问,每次询问一个区间内选出任意个数的异或最大值. 1<=n<=5∗1051<=n<=5*10^51<=n< ...

  2. Codeforces 1100 F - Ivan and Burgers

    F - Ivan and Burgers 思路:线性基+贪心,保存线性基中每一位的最后一个 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #p ...

  3. CF1100F Ivan and Burgers

    CF1100F Ivan and Burgers 静态区间,选取任意个数使得它们的异或和最大 \(n,\ m\leq5\times10^5,\ a_i\in[0,\ 10^6]\) lxl ST表,线 ...

  4. F. Ivan and Burgers(前缀线性基模板)

    前缀线性基模板 F. Ivan and Burgers /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) ...

  5. Ivan and Burgers(CF-1100F)

    Problem Description Ivan loves burgers and spending money. There are nn burger joints on the street ...

  6. Codeforces Round #532 (Div. 2) F. Ivan and Burgers(可持久化异或线性基+双指针)

    题意 给n个数,q组询问,每次询问l到r的最大异或和 思路来源 某cf奆神代码 题解 本来应该是线性基上分治的 这里一发基数+贪心也能过 真是神仙代码啊 双指针的经典应用: 对于每个询问[l,r],r ...

  7. 【CF1100F】 Ivan and Burgers (分治+线性基)

    description 戳我看题目(づ ̄3 ̄)づ╭❤- solution 异或和最大 --关联线性基 线性基: 原序列的每一个数都能由线性基里若干个数异或得到 线性基里若干个数的异或结果不可能为0 如 ...

  8. CF1100F Ivan and Burgers(线性基)

    解析 做幸运数字的时候逛题解区爬过来的 挺妙的 把所有询问离线下来,按右端点排序 贪心的让最高位更高的向量出现的尽可能向右 实现上可以把线性基里的向量和当前的数swap来实现 代码就非常好写了 代码 ...

  9. 【CodeForces 1100F】异或线性基 | 贪心 | 离线区间最大异或和 | E

    补题ing- 真的不应该错过这场比赛的 qwq 1100F. Ivan and Burgers time limit per test: 3 seconds memory limit per test ...

  10. BZOJ 4184 shallot

    目录 解题思路 裸的想法 优化一下线性基的储存 另外两种优化思路 源代码 假的题面 可用的题面 离线BZOJ好啊 Time limit 30000ms Memory limit 131072 kB O ...

最新文章

  1. VirtualApp技术黑产利用研究报告
  2. 聊一聊双十一背后的技术 - 不一样的秒杀技术, 裸秒
  3. oracle ora 02020,ORA-02020 too many database links in use再现
  4. 2021牛客暑期多校训练营2 L-WeChat Walk(分块)
  5. GCC + pthread
  6. java js中 function函数报错_浅析JS中对函数function的理解(基础篇)
  7. 周末生活日记|我们和楠哥
  8. mysql 四种存储引擎
  9. 满足多个条件的JAVA语句_关于Java:关于具有多个条件的If语句的快速问题
  10. Script标签与访问HTML页面
  11. SQL Server报表生成器中的R脚本词云
  12. 开头什么的肯定要自我介绍然后把它扔到置顶咯_~
  13. 研究生文献笔记(obsidian模板分享!!):zotero+bookxnote pro+obsidian
  14. Chevereto网站存放图像至相应二级分类文件夹
  15. [历年IT笔试题]美团2015校园招聘笔试题
  16. vs2008中文版 下载
  17. 关于加速器加速后进入游戏显示WiFi功能丢失的解决方法(maybe)
  18. sbit在c语言中作用,sbit在单片机中的表示和作用?
  19. “PE文件格式”1.9版 完整译文(附注释)
  20. 物流公司的发出时间在哪里查询,快递单号查询方法

热门文章

  1. matlab做拉普拉斯反演,拉普拉斯变换性质和反演.ppt
  2. CryEngine5.3 问题
  3. c语言中文网va_list,深入C语言可变参数(va_arg,va_list,va_start,va_end,_INTSIZEOF)
  4. 数据科学家:人工智能领域的知识图谱理论总结
  5. MATLAB如何创建新文件夹-mkdir函数,如何进入指定文件夹-cd函数
  6. 幼儿园体育游戏电子计算机教案,【小班体育活动】_小班体育教案100篇_小班体育游戏活动教案5篇...
  7. 幻云蜜网筑迷阵 春秋靶场信安大赛从攻击者角度看安全
  8. 简单明了的java反射机制
  9. akka typed mysql_akka-typed(8) - CQRS读写分离模式
  10. 【概率论与数理统计】1.5 独立性