2017.10.14 【FOTILE模拟赛】L 失败总结
很有代表性的一道题,什么都想不出来
首先有一个套路:区间的问题可以通过前缀和化成两点的问题
然后就是在区间找任意一/两个点的异或值最大,
在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 失败总结相关推荐
- BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)
题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...
- 2017.6.11 校内模拟赛
题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...
- 洛谷 10月 csp-s 模拟赛 T1,T2解析及代码
洛谷 10月 csp-s 模拟赛 T1,T2解析及代码 T1 Magenta Potion 题目描述 给定一个长为 nnn 的整数序列 aaa,其中所有数的绝对值均大于等于 222.有 qqq 次操作 ...
- 10.30 NFLS-NOIP模拟赛 解题报告
总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...
- BZOJ2741 【FOTILE模拟赛】L
一个上午两道题,妥妥的作死... 首先还是按照之前思路建立可持久化trie,然后发现了点问题... trie只能支持对于给定v求出最大xor值,也就是说我们要枚举a[i] (i ∈ [l, r]),于 ...
- BZOJ2741 【FOTILE模拟赛】L 【可持久化trie + 分块】
题目 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj) ...
- 2017年蓝桥杯模拟赛
1.标题:算年龄 英国数学家德摩根出生于19世纪初叶(即18xx年). 他年少时便很有才华.一次有人问他的年龄,他回答说: "到了x的平方那年,我刚好是x岁". 请你计算一下,德摩 ...
- 2017.9.2 校内模拟赛
中规中矩的一套题. 然而辣鸡的我日常跪 卡SPFA是要哪样啊...再也不写SPFA了 100 + 0 + 70 = 170 "与" (and.pas/.c/.cpp) 时间限制:1 ...
- 2017年蓝桥杯模拟赛-7礼物盒
小y 有一个宽度为 100cm,高度为 20cm,深度为 1cm 的柜子,如下图. 小y 还有 363636 个礼物盒,他们的深度都为 1cm. 他们对应的宽度和高度如下,单位(cm). 1 1 ...
最新文章
- houdini + maya的pulldownit
- 中科院智能乒乓球桌登上Nature:检测球速跟踪路径,准确找到击球位置
- linux中mbr最大多少分区,Linux与磁盘分区介绍(MBR,GPT)
- NVelocity的宏使用
- 下载文件(弹出迅雷来下载)
- php 伪造请求连接,phpcurl发送伪造请求
- asp.net Core 中间件Hello world
- Python 标准库 —— string
- php的instanceof和判断闭包Closure
- C/C++函数调用方式
- glob-parent Regular expression denial ofservice
- win10计算机系统慢,升级Win10后电脑变慢了?老电脑装Win7、Win10流畅性测试
- macOS中安装secoclient
- t470键盘拆解_张大妈 ThinkPad T470p 首篇 开箱拆机晒物
- 福州古刹梅花盛开 古装赏梅成“娇点”
- 印第安人与中国人的关系
- 浏览器广告屏蔽插件推荐(Chrome与Firefox)
- [Previous line repeated 995 more times]RecursionError: maximum recursion depth exceeded
- 【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
- linux中设置gvim高亮光标所在行和所在列
热门文章
- KafkaAPI实战
- Mac系统下安装MySQL详细步骤
- WordPress无其他语言解决方法
- SQL Server between...and...语句使用举例
- 山东大学2021-2022学年校历
- dubbo分布式系统链路追踪_zipkin
- getter 和 setter方法
- Java实现二维码生成
- python编程语言模块_Python基础编程常用模块汇总
- notes java api_如何使用Java来调用Notes API发送邮件(包括附件)