很有代表性的一道题,什么都想不出来

首先有一个套路:区间的问题可以通过前缀和化成两点的问题

然后就是在区间找任意一/两个点的异或值最大,

在trie树上按二进制位从大到小贪心找就可以了

多组询问,所以可持久化

然后题解就分块了,设f【i】【j】为 区间(第i块第一个元素 ,j)的答案

然后询问直接整块找+不足块的暴力,就可以n根nlogn卡过

注:1、 持久化差分和前缀和是两个在区间外的,差分在前缀和以前

2、 查找按ch的时候要注意对应的二进制位

3、 注意第一个块特判-1;

码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
ll n,m,q,cnt,i,j,lin,f[120][12005],t,ans,l[12000*40],r[12000*40],sz[12000*40],tot,er[50],a[12005],rt[12005],x,y,a2,b,c;
void jia(int last,int o,ll v,int wei)
{sz[o]=sz[last]+1;if(wei==0)return;
l[o]=l[last];
r[o]=r[last];
if(v&er[wei-1])
{r[o]=++tot;jia(r[last],r[o],v,wei-1);
}else
{l[o]=++tot;jia(l[last],l[o],v,wei-1);
}
}
void cha(int last,int o,ll v,int wei)
{if(wei==0)return;if(v&er[wei-1]){if(sz[l[o]]-sz[l[last]]>0)cha(l[last],l[o],v,wei-1);else{c-=er[wei-1];cha(r[last],r[o],v,wei-1);            }}else{if(sz[r[o]]-sz[r[last]]>0)c+=er[wei-1],cha(r[last],r[o],v,wei-1);else{cha(l[last],l[o],v,wei-1);            }}
}
int main()
{scanf("%lld%lld",&n,&q);cnt=sqrt(n);if(cnt*cnt<n)++cnt;er[0]=1;
for(i=1;i<=33;i++)
er[i]=er[i-1]*2;
rt[0]=++tot;
jia(rt[0],rt[0],0,32);for(i=1;i<=n;i++){rt[i]=++tot;scanf("%lld",&a[i]);a[i]^=a[i-1];jia(rt[i-1],rt[i],a[i],32);       }for(i=1;i<=cnt;i++){for(j=(i-1)*cnt+1;j<=n;j++){c=a[j];if(i==1){     cha(rt[(i-1)*cnt],rt[j],a[j],32);f[i][j]=max(f[i][j-1],c);f[i][j]=max(f[i][j],a[j]);}else{cha(rt[(i-1)*cnt-1],rt[j],a[j],32);f[i][j]=max(f[i][j-1],c);}      //  cout<<f[i][j]<<" ";       }   }while(q--){scanf("%lld%lld",&x,&y);a2 = min ( ((x+ans) % n)+1 , ((y+ans) %n)+1 );b = max ( ((x+ans) % n)+1 , ((y+ans) %n)+1 );
ans=0;lin=0;
x=a2;
y=b;
//cout<<x<<" "<<y<<endl;
for(i=1;i<=cnt;i++)
{if(x<=(i-1)*cnt+1&&(i-1)*cnt+1<=y){ans=f[i][y];lin=i;  break;}
}if(lin){for(i=x-1;i<(cnt*(lin-1))+1;i++)    {c=a[i];cha(rt[x-2],rt[y],a[i],32);ans=max(ans,c);            }}else{for(i=x-1;i<=y;i++){c=a[i];cha(rt[x-2],rt[y],a[i],32);ans=max(ans,c);}}printf("%lld\n",ans);  }} 

2017.10.14 【FOTILE模拟赛】L 失败总结相关推荐

  1. BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)

    题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...

  2. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  3. 洛谷 10月 csp-s 模拟赛 T1,T2解析及代码

    洛谷 10月 csp-s 模拟赛 T1,T2解析及代码 T1 Magenta Potion 题目描述 给定一个长为 nnn 的整数序列 aaa,其中所有数的绝对值均大于等于 222.有 qqq 次操作 ...

  4. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  5. BZOJ2741 【FOTILE模拟赛】L

    一个上午两道题,妥妥的作死... 首先还是按照之前思路建立可持久化trie,然后发现了点问题... trie只能支持对于给定v求出最大xor值,也就是说我们要枚举a[i] (i ∈ [l, r]),于 ...

  6. BZOJ2741 【FOTILE模拟赛】L 【可持久化trie + 分块】

    题目 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj) ...

  7. 2017年蓝桥杯模拟赛

    1.标题:算年龄 英国数学家德摩根出生于19世纪初叶(即18xx年). 他年少时便很有才华.一次有人问他的年龄,他回答说: "到了x的平方那年,我刚好是x岁". 请你计算一下,德摩 ...

  8. 2017.9.2 校内模拟赛

    中规中矩的一套题. 然而辣鸡的我日常跪 卡SPFA是要哪样啊...再也不写SPFA了 100 + 0 + 70 = 170 "与" (and.pas/.c/.cpp) 时间限制:1 ...

  9. 2017年蓝桥杯模拟赛-7礼物盒

     小y 有一个宽度为 100cm,高度为 20cm,深度为 1cm 的柜子,如下图. 小y 还有 363636 个礼物盒,他们的深度都为 1cm. 他们对应的宽度和高度如下,单位(cm). 1 1 ...

最新文章

  1. houdini + maya的pulldownit
  2. 中科院智能乒乓球桌登上Nature:检测球速跟踪路径,准确找到击球位置
  3. linux中mbr最大多少分区,Linux与磁盘分区介绍(MBR,GPT)
  4. NVelocity的宏使用
  5. 下载文件(弹出迅雷来下载)
  6. php 伪造请求连接,phpcurl发送伪造请求
  7. asp.net Core 中间件Hello world
  8. Python 标准库 —— string
  9. php的instanceof和判断闭包Closure
  10. C/C++函数调用方式
  11. glob-parent Regular expression denial ofservice
  12. win10计算机系统慢,升级Win10后电脑变慢了?老电脑装Win7、Win10流畅性测试
  13. macOS中安装secoclient
  14. t470键盘拆解_张大妈 ThinkPad T470p 首篇 开箱拆机晒物
  15. 福州古刹梅花盛开 古装赏梅成“娇点”
  16. 印第安人与中国人的关系
  17. 浏览器广告屏蔽插件推荐(Chrome与Firefox)
  18. [Previous line repeated 995 more times]RecursionError: maximum recursion depth exceeded
  19. 【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
  20. linux中设置gvim高亮光标所在行和所在列

热门文章

  1. KafkaAPI实战
  2. Mac系统下安装MySQL详细步骤
  3. WordPress无其他语言解决方法
  4. SQL Server between...and...语句使用举例
  5. 山东大学2021-2022学年校历
  6. dubbo分布式系统链路追踪_zipkin
  7. getter 和 setter方法
  8. Java实现二维码生成
  9. python编程语言模块_Python基础编程常用模块汇总
  10. notes java api_如何使用Java来调用Notes API发送邮件(包括附件)