[bzoj4722]由乃
身为10班人,就凭标题,这道题是一定要做的。
但是做了才发现有毒。。。。所以是信念和题解和大腿支撑了我!
先“假设”自己实力过硬,推出了结论:当区间过大时,必定存在一种方案可以输出”Yuno“。剩下就是这区区几个数的乱搞了。
数据结构学傻先不动声色地敲了一个线段树维护所有的立方操作,并且我发现自从noip2015挂过lazy tag以后就再也不会写错了。。。。这就是传说中教训的力量
然后我还是请教了一些更优秀的维护方法,不过万变不离其宗,这个常数说不要就不要了吧。。。。
接下来,我开始想当然:差不多了。。。再敲个快速幂。。。随便搞下。。。差不多了。。。
后来幸好看了下V,不是质数,那又要求phi啊?!
而且不一定互质,不仅要求phi而且要提取质因数啊?!
不想写啊,只能向倍增势力低头。
再后来,思考“区区几个数的乱搞”,好像并不容易。看了题解说得很含蓄,发现是个乱搞的思想。
对于区间【L,R】,以mid为界,左边枚举两个不相交子集,右边枚举两个不相交子集,判断它们的合法性。
于是就T了,原来我的复杂度和常数达到了十分可怕的境地。这就很不爽了。因为我不会卡常。
再回过头来看那个“假设”,有实力的人证一证,没实力的人写个暴力找下规律,发现可以把题解中的下界13改为10,这样就卡过去了。
(当然,你写9也能A)。。。。数据太随机了。
事情还没结束,time排名垫底了,原来是我乱搞写错了。四重循环,不挂才怪。正确做法还得写一个桶,把左边所有值扔进桶里,这样询问就飞起来了。
最后shy说:你这样也能过,说明常数实在太小了。
2333
改了一下。。。仍旧快垫底?
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 200020
#define ll long long
],tree[N*];ll fa[N][];
],V[];
ll a[N],b[N];
void push_down(int p,int st,int ed){
){
f[p+p]+=f[p];f[p+p+]+=f[p];;
tree[p+p]+=f[p]*(mid-st+);tree[p+p+]+=f[p]*(ed-mid);
f[p]=;
}
}
void update(int L,int R,int st,int ed,int p){
;;
)push_down(p,st,ed);
if(R<=mid)update(L,R,st,mid,p+p);else
,ed,p+p+);else
update(L,mid,st,mid,p+p),update(mid+,R,mid+,ed,p+p+);
}
int query(int x,int st,int ed,int p){
if(st==x&&ed==x)return tree[p];
)push_down(p,st,ed);
;
if(x<=mid)return query(x,st,mid,p+p);else
,ed,p+p+);
}
ll quickmi(ll x,ll k){
ll tmp=,a=x;
){
==){tmp=tmp*a%mo;}
a=a*a%mo;k=k/;
}return tmp;
}
void work(int st,int ed,int cc){
;
<<(mid-st+))-,l2=(<<(ed-mid))-;
;u<=l1;u++)
;v<=l1-u;v++))||v!=){
,a2=,a3=,a4=;
for(int i=st;i<=mid;i++){
<<(i-st);
)a1+=b[i]+;)a2+=b[i]+;
}
if(a1>a2)std::swap(a1,a2);
;return;}
V[a2-a1]=;tot++;bb[tot]=a2-a1;
}
;x<=l2;x++)
;y<=l2-x;y++))||y!=){
,a2=,a3=,a4=;
;i<=ed;i++){
<<(i-mid-);
)a3+=b[i]+;)a4+=b[i]+;
}
if(a3>a4)std::swap(a3,a4);
;return;}
){fool=;return;}
}
}
int main()
{
//freopen("yono.in","r",stdin);//freopen("my.out","w",stdout);
scanf("%d%d%d",&n,&m,&mo);
;i<=n;i++)scanf("%lld",&a[i]);
;i<mo;i++) fa[i][]=i*i%mo*i%mo;
;j<=;j++)
;i<mo;i++)
fa[i][j]=fa[fa[i][j-]][j-];
;cc<=m;cc++){
int op,L,R;scanf("%d%d%d",&op,&L,&R);
){update(L,R,,n,);continue;}
>)printf("Yuno\n");else{
for(int i=L;i<=R;i++){
ll tt=query(i,,n,),x=tt,tmp=,now=a[i];
b[i]=a[i];
;j>=;j--)<<j)){
x-=<<j;b[i]=fa[b[i]][j]%mo;
}
}
fool=;tot=;
work(L,R,cc);
;i<=tot;i++)V[bb[i]]=;
)printf("Yuno\n");else printf("Yuki\n");
}
}
}
bzoj4722
[bzoj4722]由乃的更多相关文章
- 【BZOJ4722】由乃
[BZOJ4722]由乃 题面 bzoj 题解 考虑到区间长度为\(14\)时子集个数\(2^{14}>14\times 1000\),由抽屉原理,区间长度最多为\(13\)(长度大于这个值就一 ...
- [BZOJ4722]由乃[鸽巢原理+bitset+倍增]
题意 给定长为 \(n\) 序列 \(a\) ,要求支持两种操作: \(1.\) 询问在一个区间 \([l,r]\) 中,是否能够选出两个交集为空的集合 $ \rm X ,Y$, 使得 \(\sum_ ...
- [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
4722: 由乃 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 360 Solved: 131[Submit][Status][Discuss] D ...
- $bzoj4722$ 由乃 搜索
正解:搜索 解题报告: 传送门$QwQ$ 首先发现长度为$len$的子集的值域为$[0,v\cdot len+len]$,数量为$2^{len}$.所以当$2^{len}\geq v\cdot len ...
随机推荐
- 仅用aspx文件实现Ajax调用后台cs程序。(实例)
仅用aspx文件实现Ajax调用后台cs无刷新程序.(实例) 两个文件:aaa.aspx 和aaa.aspx.cs 一.aaa.aspx <script type="text/java ...
- C和指针 第十五章 输入输出缓冲
对于C,所有的I/O操作都只是简单的从程序移进或移出字节,这种字节流便成为流(stream),我们需要关心的只是创建正确的输出字节数据,以及正确的输入读取数据,特定的I/O设备细节都是对程序隐藏的. ...
- 为什么类和接口不能使用private和protected?接口的方法不能使用private、protected、default
对于java程序员来说,java的访问权限修饰词public.protected.default.private的区别和使用肯定都不是问题,这里也不再啰嗦了,反正度娘一搜就一大把.最近在整理java ...
- Deep Residual Learning
最近在做一个分类的任务,输入为3通道车型图片,输出要求将这些图片对车型进行分类,最后分类类别总共是30个. 开始是试用了实验室师姐的方法采用了VGGNet的模型对车型进行分类,据之前得实验结果是训练后 ...
- oracle 学习笔记(一)
1. 数据库原理 1.1. 数据库简介 1.1.1. 文件存储 对数据的存储需求一直存在.保存数据的方式,经历了手工管理.文件管理等阶段,直至数据库管理阶段. 文件存储方式保存数据的弊端: 缺乏对数据 ...
- 常用js函数封装
see them... // 获取网址的get参数 var GET = function(name) { var reg = new RegExp("(^|&)" + na ...
- repo 修改邮箱地址
需要重新运行 repo init 被带上参数: --config-name xx@a.com
- ADT for Eclipse无法升级到23.0的解决方法(确保您的网络能够访问google的地址)
进行以下步骤时,请确保您的网络能够访问google的地址,因为有可能是无法访问google地址导致无法升级,该文不是为了解决这个问题!!! 最近一次的升级,ADT无法从ADT 22.X升级到23.0. ...
- qt 导入现有的工程不能运行的问题
新导入的工程需在qtcreator的项目选项的构建位置配置一下
- 在Nodejs中如何调用C#的代码
最近需要在Nodejs中用到C#的代码,从网上了解到可以采用Edgejs来实现Nodejs与C#的代码交互, 直接复制网上的代码运行总是出各种错,填了不少坑,现在把自己的案例代码大致整理一下,方便以后 ...