洛谷题面传送门

一道挺有意思的题,想到了某一步就很简单,想不到就很毒瘤(

首先看到这样的设问我们显然可以想到背包,具体来说题目等价于对于每个满足 \(i\in[l,r]\) 的 \(a_i\) 赋上一个权值 \(v_i\in\{-1,0,1\}\),满足 \(\sum\limits_{i=l}^rv_ia_i=0\),这是显然可以 \(01\) 背包求解的,时间复杂度 \(qnv\),一脸过不去的亚子,可以使用 bitset 优化到 \(\dfrac{qnv}{\omega}\),但没啥卵用,还是过不去。

这时候我们就要发现一个非常强的性质了。首先比较显然的一点是这个交集为空用处不大,只要不是两个集合重合就行,因为如果交集非空那把交集的部分从两个集合中扣掉和依然是相同的。注意到对于一段区间而言,我们只用判断是否存在两个集合和相同,而对于这个区间的所有子集,它们总共可能贡献出 \(2^{r-l+1}\) 个子集,而和最大只有 \((r-l+1)·v\),因此如果区间长度 \(len\) 满足 \(len·v<2^{len}\),即 \(len\ge 14\),那根据抽屉原理就必然存在两个集合和相同,答案也就是 Yuno 了。

有了这个性质之后事情就变得容易许多。由于 \(len\ge 14\)​ 的情况已经给判掉了,我们只用判断 \(len\le 13\)​ 的情况即可,这个就按照上面的套路 bitset 优化背包即可,甚至实测折半搜 \(q·3^7\) 都可以通过。还有一个小问题是怎样处理修改操作,我们开一棵 BIT 维护每个元素被执行了多少次 \(a_i\leftarrow a_i^3\) 这样的操作,假设这个值为 \(c\),那么显然执行完 \(c\) 次操作后会有 \(a_i=a_i^{3^c}\),一个很直观的想法是扩展欧拉定理降幂,不过由于此题权值很小,可以考虑倍增。具体来说设 \(cub_{i,j}=i^{3^{2^j}}\)​,那么显然有 \(i^{3^{2^j}}=(i^{3^{2^{j-1}}})^{3^{2^{j-1}}}\),倍增一下即可。

时间复杂度 \(n\log n+\dfrac{13qv}{\omega}\)

const int MAXN=1e5;
const int MAXV=1000;
const int DLT=14002;
const int LOG_N=17;
int n,qu,p,cub[MAXV+5][LOG_N+2],t[MAXN+5],a[MAXN+5];
void add(int x,int v){for(int i=x;i<=n;i+=(i&(-i))) t[i]+=v;}
void add_range(int l,int r,int v){add(l,v);add(r+1,-v);}
int query(int x){int ret=0;for(int i=x;i;i&=(i-1)) ret+=t[i];return ret;}
int ask(int x){
int cnt=query(x),cur=a[x];
for(int i=LOG_N;~i;i--) if(cnt>>i&1) cur=cub[cur][i];
return cur;
}
bitset<DLT*2+5> bs;
int main(){
scanf("%d%d%d",&n,&qu,&p);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=0;i<p;i++) cub[i][0]=i*i*i%p;
for(int i=1;i<=LOG_N;i++) for(int j=0;j<p;j++)
cub[j][i]=cub[cub[j][i-1]][i-1];
while(qu--){
int opt,l,r;scanf("%d%d%d",&opt,&l,&r);
if(opt==1){
if(r-l+1>14) puts("Yuno");
else{
bs.reset();
for(int i=l;i<=r;i++){
int v=ask(i)+1;
bs=bs|(bs<<v)|(bs>>v);
bs.set(DLT+v);bs.set(DLT-v);
} printf("%s\n",(bs.test(DLT)?"Yuno":"Yuki"));
}
} else add_range(l,r,1);
}
return 0;
}

洛谷 P5527 - [Ynoi2012] NOIP2016 人生巅峰(抽屉原理+bitset 优化背包)的更多相关文章

  1. 洛谷 P6775 - [NOI2020] 制作菜品(找性质+bitset 优化 dp)

    题面传送门 好久没写过题解了,感觉几天没写手都生疏了 首先这种题目直接做肯定是有些困难的,不过注意到题目中有个奇奇怪怪的条件叫 \(m\ge n-2\),我们不妨从此入手解决这道题. 我们先来探究 \ ...

  2. 【洛谷3648/BZOJ3675】[APIO2014]序列分割(斜率优化DP)

    题目: 洛谷3648 注:这道题洛谷3648有SPJ,要求输出方案.BZOJ3675数据组数较多但不要求输出方案. 分析: 这可能是我第三次重学斜率优化了--好菜啊 这道题首先一看就是个DP.稍微推一 ...

  3. 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解

    题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ...

  4. bzoj#4722-由乃【倍增,抽屉原理,bitset】

    正题 题目链接:https://darkbzoj.tk/problem/4722 题目大意 给出一个长度为\(n\)的序列值域为\([0,v)\),要求支持操作 询问一个区间能否找到两个没有交的非空下 ...

  5. 【洛谷P2831】[NOIP2016]愤怒的小鸟

    愤怒的小鸟 题目链接 本来是刷状压DP的,然而不会.. 搜索是比较好想的,直接dfs就行了 我们可以知道两只猪确定一条抛物线 依次处理每一只猪,有以下几种方法: 1.先看已经建立的抛物线是否能打到这只 ...

  6. uoj233/BZOJ4654/洛谷P1721 [Noi2016]国王饮水记 【dp + 斜率优化】

    题目链接 uoj233 题解 下面不加证明地给出几个性质: 小于\(h[1]\)的城市一定是没用的 任何城市联通包含\(1\)且只和\(1\)联通一次 联通顺序从小到大最优 单个联通比多个一起联通要优 ...

  7. 洛谷 P1507 NASA的食物计划 【二维费用背包】 || 【DFS】

    题目链接:https://www.luogu.org/problemnew/show/P1507 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力 ...

  8. 2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)

    传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二 ...

  9. 洛谷P4360 [CEOI2004]锯木厂选址(dp 斜率优化)

    题意 题目链接 Sol 枚举第二个球放的位置,用前缀和推一波之后发现可以斜率优化 // luogu-judger-enable-o2 #include<bits/stdc++.h> #de ...

随机推荐

  1. C#特性知识图谱-一、委托

    一. 委托 1.1 委托定义 委托可以看成是一个方法的容器,将某一具体的方法装入后就可以把它当成方法一样调用.一个委托类型的变量可以引用任何一个满足其要求的方法.委托类似于C语言中的函数指针,但并不完 ...

  2. 自定义注解结合切面和spel表达式

    在我们的实际开发中可能存在这么一种情况,当方法参数中的某些条件成立的时候,需要执行一些逻辑处理,比如输出日志.而这些代码可能都是差不多的,那么这个时候就可以结合自定义注解加上切面加上spel表达式进行 ...

  3. stm32直流电机驱动与测速学习总结

    通过实验发现,定时器的一个通道控制一个pwm信号. 在正式开始之前也可以参考这个视频学习资料 (stm32直流电机驱动) http://www.makeru.com.cn/live/1392_1218 ...

  4. Linux有什么可取之处竟如此受欢迎

    什么是Linux? Linux是一个操作系统软件.和Windows不同的是,Linux是一套开放源代码程序的.并可以自由传播的类Unix操作系统,它是一个支持多用户.多任务.多线程和多CPU的操作系统 ...

  5. hdu 2860 Regroup(并查集)

    题意: AP x yA recruit with ability rate x were asked to join company y. (0<=x<2^31, 0<=y<n ...

  6. 一、spring 环境搭建

    一.springtoolSuite4下载 1.概述 Spring Tools 4 是适用于您最喜欢的编码环境的下一代 Spring 工具.它主要从头开始重建,为开发基于 Spring 的企业应用程序提 ...

  7. C++ IO基础

    一:c++I/O处理,按照数据输入输出的过程,形象的将其看做流.数据在流中进行传播. 所有的流有两个基类:ios和streambuf类 streambuf:提供对缓冲区的基本操作,设置缓冲区等 ios ...

  8. SpringCloud概念

    SpringCloud概述 1.SpringCloud是什么? 官方解释:  官网: https://spring.io/projects/spring-cloud/  SpringCloud是一系列 ...

  9. HTML基本使用

    HTML初识 (Hyper Text Markup Language): 超文本标记语言 「HTML骨架格式」 <!-- 页面中最大的标签 根标签 --> <html> < ...

  10. Python推导式详解,带你写出比较精简酷炫的代码

    Python推导式详解,带你写出比较精简酷炫的代码 前言 1.推导式分类与用法 1.1 列表推导 1.2 集合推导 1.3 字典推导 1.4 元组推导?不存在的 2.推导式的性能 2.1 列表推导式与 ...