洛谷 P5527 - [Ynoi2012] NOIP2016 人生巅峰(抽屉原理+bitset 优化背包)
一道挺有意思的题,想到了某一步就很简单,想不到就很毒瘤(
首先看到这样的设问我们显然可以想到背包,具体来说题目等价于对于每个满足 \(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 优化背包)的更多相关文章
- 洛谷 P6775 - [NOI2020] 制作菜品(找性质+bitset 优化 dp)
题面传送门 好久没写过题解了,感觉几天没写手都生疏了 首先这种题目直接做肯定是有些困难的,不过注意到题目中有个奇奇怪怪的条件叫 \(m\ge n-2\),我们不妨从此入手解决这道题. 我们先来探究 \ ...
- 【洛谷3648/BZOJ3675】[APIO2014]序列分割(斜率优化DP)
题目: 洛谷3648 注:这道题洛谷3648有SPJ,要求输出方案.BZOJ3675数据组数较多但不要求输出方案. 分析: 这可能是我第三次重学斜率优化了--好菜啊 这道题首先一看就是个DP.稍微推一 ...
- 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解
题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ...
- bzoj#4722-由乃【倍增,抽屉原理,bitset】
正题 题目链接:https://darkbzoj.tk/problem/4722 题目大意 给出一个长度为\(n\)的序列值域为\([0,v)\),要求支持操作 询问一个区间能否找到两个没有交的非空下 ...
- 【洛谷P2831】[NOIP2016]愤怒的小鸟
愤怒的小鸟 题目链接 本来是刷状压DP的,然而不会.. 搜索是比较好想的,直接dfs就行了 我们可以知道两只猪确定一条抛物线 依次处理每一只猪,有以下几种方法: 1.先看已经建立的抛物线是否能打到这只 ...
- uoj233/BZOJ4654/洛谷P1721 [Noi2016]国王饮水记 【dp + 斜率优化】
题目链接 uoj233 题解 下面不加证明地给出几个性质: 小于\(h[1]\)的城市一定是没用的 任何城市联通包含\(1\)且只和\(1\)联通一次 联通顺序从小到大最优 单个联通比多个一起联通要优 ...
- 洛谷 P1507 NASA的食物计划 【二维费用背包】 || 【DFS】
题目链接:https://www.luogu.org/problemnew/show/P1507 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力 ...
- 2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)
传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二 ...
- 洛谷P4360 [CEOI2004]锯木厂选址(dp 斜率优化)
题意 题目链接 Sol 枚举第二个球放的位置,用前缀和推一波之后发现可以斜率优化 // luogu-judger-enable-o2 #include<bits/stdc++.h> #de ...
随机推荐
- Succeed_School
# Author kevin_hou class School(object): def __init__(self,name,addr): self.name = name self.addr = ...
- RabbitMQ延时队列应用场景
应用场景 我们系统未付款的订单,超过一定时间后,需要系统自动取消订单并释放占有物品 常用的方案 就是利用Spring schedule定时任务,轮询检查数据库 但是会消耗系统内存,增加了数据库的压力. ...
- Noip模拟31 2021.8.5
T1 Game 当时先胡了一发$\textit{Next Permutation}$... 然后想正解,只想到贪心能求最大得分,然后就不会了.. 然后就甩个二十分的走了... 正解的最大得分(叫它$k ...
- wpa_supplicant启动出错rfkill: Cannot open RFKILL control device
在板子是调试网络,千辛万苦把wpa_supplicant及其依赖都移植编译进来了,在板子上调试启动的时候启动报错了 D/wpa_supplicant( 1152): wpa_supplicant v2 ...
- C++类的静态成员变量与静态成员函数
1.类的静态成员变量 C++类的静态成员变量主要有以下特性: 1.静态成员变量需要类内定义,类外初始化 2.静态成员变量不依赖于类,静态成员变量属于全局区,不属于类的空间. 3.静态成员变量通过类名访 ...
- 如何反编译微信小程序👻
如何反编译微信小程序 准备工具: 夜神模拟器(或者你可以自己准备一个安卓模拟器,有root权限.) RE文件管理器(下载地址:https://soft.ucbug.com/uploads/shouji ...
- netty系列之:搭建客户端使用http1.1的方式连接http2服务器
目录 简介 使用http1.1的方式处理http2 处理TLS连接 处理h2c消息 发送消息 总结 简介 对于http2协议来说,它的底层跟http1.1是完全不同的,但是为了兼容http1.1协议, ...
- centos 7 安装nfs 实现主机目录共享
多台服务器之间共享目录,实现每个服务器进入目录看到的内容都一样 服务器A 服务器B 1.服务器A和服务器B,安装 nfs-utils和rpcbind #yum install -y nfs-utils ...
- DOS常用基本命令
通配符* 和 ? *表示一个字符串 ?只代表一个字符 注意通配符只能通配文件名或扩展名,不能全都表示.例如我们要查找以字母y开头的所有文件,可以输入以下命令: dir y*.* 例如我要查找第二个字母 ...
- 关于 better-scroll 设置了以后无法滚动或不生效的问题
首先在mounted里面注册组件 例:let scroll = new BScroll("#commondityLeftList") 然后打印实例化对象,例:console. ...