P2827 蚯蚓
题目链接
思路
如果是\(q=0\)的话,相当于维护一个集合,支持查询最大值,删除最大值,添加新值,用\(set\)即可实现
如果是\(q>0\)的话,我们可以把用刀切看成是,把最大值\(x\),分成\(\left\lfloor px\right\rfloor-q\)和\(x-\left\lfloor px\right\rfloor-q\),然后给把整个集合都加上\(q\),所以我们可以维护一个变量\(ans\)表示整个集合的偏移量,集合中的数加上\(ans\)就是真实值开始我们让\(ans=0\)
对于每一秒:
1.取出集合中的最大值x,令\(x=x+ans\)
2.把\(\left\lfloor px\right\rfloor-q\)和\(x-\left\lfloor px\right\rfloor-q\)插入集合
3.令\(ans+=q\)
用三个队列\(q1,q2,q3\)共同组成要维护的集合,\(q1\)保存初始的\(n\)个数,从大到小排序。\(q2\)存储 \(\left\lfloor px\right\rfloor\)
,\(q3\)存储 \(x-\left\lfloor px\right\rfloor\) ,每个时刻最大的数就是\(q1,q2,q3\)队首之一。
我们来证明一下集合中取出的数是单调递减的,而且新生成的数也是单调递减的
因为\(p,q\)是常数,\(0<p<1\)而且\(p\)是非负整数,设\(x_1,x_2\)是非负整数
当\(x_1>=x_2\)时,\(\left\lfloor px_1\right\rfloor+q=\left\lfloor px_1+pq\right\rfloor>=\left\lfloor px_2+pq\right\rfloor=\left\lfloor p(x_2+q)\right\rfloor\)
又因为\(x_1>x_2>=p(x_1-x_2)\)
所以\(x_1-px_1>=x_2-px_2>=x_2-p(x_2+q)\)
所以\(x_1-\left\lfloor px_1\right\rfloor+q=\left\lfloor x_1-px_1\right\rfloor+q>=\left\lfloor x_2-p(x_2+q)\right\rfloor+q>=x_2+q-\left\lfloor p(x_2+q)\right\rfloor\)
即:
若\(x_1\)在\(x_2\)之前被取出集合,那么一秒之后\(x_1\)被分成\(\left\lfloor px\right\rfloor-q\)和\(x-\left\lfloor px\right\rfloor-q\)分别不小于x_2+q分成的两个数
\(\left\lfloor x_2-p(x_2+q)\right\rfloor+q\)和\(x_2+q-\left\lfloor p(x_2+q)\right\rfloor\)
证毕(写死我了)
代码
#include<bits/stdc++.h>
#include<queue>
#define int long long int
#define p u/v
using namespace std;
int n,m,q,u,v,t,a[7004015];
int cmp(int x,int y) {
return x>y;
}
queue<int>q1,q2,q3;
int calc(int t) {
int x=0,a=0,b=0,c=0;
if(!q1.empty()) a=q1.front()+t*q;
if(!q2.empty()) b=q2.front()+t*q;
if(!q3.empty()) c=q3.front()+t*q;
x=max(a,max(b,c));
if(x==a) q1.pop();
else if(x==b) q2.pop();
else if(x==c) q3.pop();
return x;
}
signed main() {
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
cin>>n>>m>>q>>u>>v>>t;
//n只蚯蚓 m秒 p=u/v t是输出参数
for(int i=1; i<=n; ++i) cin>>a[i];
sort(a+1,a+1+n,cmp);
for(int i=1; i<=n; ++i) q1.push(a[i]);
for(int i=1; i<=m; ++i) {
int x=calc(i-1);
if(!(i%t)) cout<<x<<' ';
int now1=x*p;//注意这里要先乘后除
int now2=x-now1;
q2.push(now1-i*q);
q3.push(now2-i*q);
}
cout<<endl;
for(int i=1; i<=(n+m); ++i) {
int x=calc(m);
if(!(i%t)) cout<<x<<' ';
}
return 0;
}
P2827 蚯蚓的更多相关文章
- 洛谷P2827 蚯蚓 题解
洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...
- 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)
Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮 ...
- 洛谷 P2827 蚯蚓 解题报告
P2827 蚯蚓 题目描述 本题中,我们将用符号 \(\lfloor c \rfloor\) 表示对 \(c\) 向下取整,例如:\(\lfloor 3.0 \rfloor = \lfloor 3.1 ...
- 洛谷——P2827 蚯蚓
P2827 蚯蚓 题目描述 本题中,我们将用符号 \lfloor c \rfloor⌊c⌋ 表示对 cc 向下取整,例如:\lfloor 3.0 \rfloor = \lfloor 3.1 \rflo ...
- Luogu P2827 蚯蚓(模拟)
P2827 蚯蚓 题意 题目描述 本题中,我们将用符号\(\lfloor c\rfloor\)表示对\(c\)向下取整,例如:\(\lfloor 3.0\rfloor =\lfloor 3.1\rfl ...
- [Luogu P2827] 蚯蚓 (巧妙的模拟)
题面: 传送门:https://www.luogu.org/problemnew/show/P2827 Solution 看到这题,我们肯定会有一个大胆想法. 那就是直接用堆模拟这个过程. 对于q,我 ...
- 洛谷P2827 蚯蚓——思路题
题目:https://www.luogu.org/problemnew/show/P2827 思路... 用优先队列模拟做的话,时间主要消耗在每次的排序上: 能不能不要每次排序呢? 关注先后被砍的两条 ...
- Luogu P2827 蚯蚓
看到题目就可以想到直接开的堆模拟的过程了吧,这个还是很naive的 注意在用堆做的时候也是要明智一点的,对于蚯蚓长度的相加肯定不能直接遍历并加上,还是可以差分一下的 其实说白了就是把集体加->单 ...
- 【luogu P2827 蚯蚓】 题解
题目链接:https://www.luogu.org/problemnew/show/P2827 35分:暴力sortO(mnlogn). 80分:考虑到每次不好维护不被切的点+q,正难则反.改成维护 ...
- 洛谷 P2827 蚯蚓
题目描述 本题中,我们将用符号\lfloor c \rfloor⌊c⌋表示对c向下取整,例如:\lfloor 3.0 \rfloor= \lfloor 3.1 \rfloor=\lfloor 3.9 ...
随机推荐
- 管理ceph缓存池
目录 缓存池简介 缓存池原理 缓存池的工作模式 配置缓存池 1. 创建一个缓存池 2. 设置缓存层 3. 缓存层相关参数说明 4. 测试缓存池 删除缓存池 1. 删除read-only缓存池 2. 删 ...
- mybatis + mysql 批量插入、删除、更新
mybatis + mysql 批量插入.删除.更新 Student 表结构 批量插入 public int insertBatchStudent(List<Student> studen ...
- [转帖]k8s 如何让你的应用活的更久
k8s 如何让你的应用活的更久 https://www.jianshu.com/p/132319e795ae 众所周知,k8s 可以托管你的服务 / 应用,当出现各种原因导致你的应用挂掉之后,k8s ...
- 运维开发实践——基于Sentry搭建错误日志监控系统
错误日志监控也可称为业务逻辑监控, 旨在对业务系统运行过程中产生的错误日志进行收集归纳和监控告警.似乎有那么点曾相识?没错... 就是提到的“APM应用性能监控”.但它又与APM不同,APM系统主要注 ...
- http响应总结:常见http响应错误总结
工作中经常会被同事问这个http请求为什么调不通,我虽然能解释清楚错误是什么,但是没有总结过,想到刚开始时,也是看了别人的文章才会的,所以总结一下,贡献一下自己的经验. http 404 响应 404 ...
- .Net 获取当前周是第几周
最近项目中需要获取当前周是今年的第几周,这东西听起来不难,但是还挺有意思的. 在中国,一周是从周一开始算,周天结束,在国外就不是这样了,是从周天到周六为一个周. 有很多种方式去实现在这个功能,下面介绍 ...
- Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理
Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理 本文链接:https://blog.csdn.net/puhaiyang/article/details/78146620 ...
- Windows下分布式环境搭建以及简单测试
环境配置: 解压文件: Nginx服务器和Tomcat服务器 Tomcat服务器配置:(conf/server.xml) Nginx配置:(conf/nginx.conf) 安装memcached H ...
- ztree实现复选框单选功能
/** * ztree的默认配置项 * */ var setting = { view: { selectedMulti: false //按住ctrl是否可以多选 }, check: { enabl ...
- 安恒Red Team 内部红蓝对抗框架
0x00 准备钓鱼攻击(从公开资源) 1.常见的红队攻击向量和技术 2.常见的蓝队侦查和预防控制 0x02 发送钓鱼邮件(到目标组织员工邮箱地址) 1.常见的红队攻击向量和技术 2.常见的蓝 ...