P4754 True Vegetable
题目描述
小A现在有 NN 道题,编号为 1,2,\cdots,N1,2,⋯,N 。每道题的起始毒瘤程度为 00 或 11 。在每回合,小A可以将编号连续的 KK 道题的毒瘤程度+1。但小B因为本身比较菜,不是很愿意小A出毒瘤题,所以在 w_iwi 回合开始时可以向第 x_ixi 题传播 v_ivi 点的菜气,使得第 x_ixi 的毒瘤程度减少 v_ivi 点(减后可以为负)。这里我们假定菜是有限的,在释放了 v_ivi 点的菜气后,小B需要至少 r_{v_i}rvi 个回合不能释放菜气。现在小A知道了小B释放菜气的计划,他想知道他至少需要多少个回合可以使得每道题的毒瘤程度至少为 11 。
输入输出格式
输入格式:
第一行输入四个整数, N,M,K,LN,M,K,L ,分别为题目的数量,小B的操作数量,每次连续增加毒瘤程度题目的数量和释放菜气的最大值。
第二行输入 NN 个整数 a_1,a_2,\cdots,a_Na1,a2,⋯,aN ,分别为 NN 个题目的毒瘤程度。
第三行输入 LL 个整数 r_1,r_2,\cdots,r_Lr1,r2,⋯,rL ,分别为释放 11 到 LL 点菜气的冷却回合数。
接下来有 MM 行,每行输入三个整数 w_i,x_i,v_iwi,xi,vi ,表示小B在第 w_iwi 回合开始时向第 x_ixi 题释放了 v_ivi 点的菜气。保证 \{w_i\}{wi} 为递增序列。
输出格式:
请输出小A将每道题的毒瘤程度加到至少为 11 最少需要的回合数。
输入输出样例
6 1 3 2
0 0 0 0 0 0
1 2
2 1 1
3
6 1 3 2
1 0 0 0 0 0
1 2
2 1 1
2
6 1 6 2
0 0 0 0 0 0
1 2
2 1 1
1
说明
1≤N,M≤5×105
1≤K≤N
1≤L≤100
a[i]∈{0,1}
1=r1<r2<⋯<rL≤2×L
1≤wi≤N+L
wi+rvi≤wi+1
1≤xi≤N
1≤vi≤L
Solution:
本题也是贼有意思,考查细心读题。
题目中明确的说了$w_i+r_{v_i}\leq w_i+1$,于是可以想到,当某个位置的值减少后,完全可以通过冷却的时间来恢复。
令被减去的时间为时间点,考虑二分被减的时间点,然后将难度先减去要减的值,因为减难度的冷却时间不小于需要加的数量,被减的数量可以用相同数量的时间填补,所以当一个时间点可以达到目标时,下一个时间点必然也能达到目标。
然后在时间点上计算出需要的时间。二分时间点,在减去生效的操作后,我们可以贪心地从左到右地考虑,当位置$i$小于$1$时,考虑贪心地将$[i,i+k-1]$这个区间加$1$,可以使需要的回合数尽量小。当确定小B有哪些操作生效时,这样就可以求出满足条件的准确最小时间,若这个时间小于下个时间点,那么check()就是有效的。
时间复杂度$O(n\log n)$
代码:
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
int n,m,k,L,a[N],R[N],tp[N],b[N];
struct node {
int w,x,v;
}t[N]; il int gi(){
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=;
while(x>=''&&x<='')a=(a<<)+(a<<)+x-,x=getchar();
return f?-a:a;
} il int check(int mid){
For(i,,n) tp[i]=a[i],b[i]=;
For(i,,mid) tp[t[i].x]-=t[i].v;
int tmp=,tot=,dis;
For(i,,n){
if(tp[i]+tmp<){
dis=-tp[i]-tmp;
tot+=dis;
b[i]+=dis;
if(i+k-<=n) b[i+k-]-=dis;
}
tmp+=b[i];
}
return max(t[mid].w,tot);
} int main(){
n=gi(),m=gi(),k=gi(),L=gi();
For(i,,n) a[i]=gi(); For(i,,L) R[i]=gi();
For(i,,m) t[i].w=gi(),t[i].x=gi(),t[i].v=gi();
t[].w=,t[m+].w=;
int l=,r=m,mid,ans;
while(l<=r){
mid=l+r>>;
if(check(mid)<t[mid+].w) ans=mid,r=mid-;
else l=mid+;
}
cout<<check(ans);
return ;
}
P4754 True Vegetable的更多相关文章
- 洛谷 P4754 True Vegetable 解题报告
P4754 True Vegetable 题目描述 小A现在有N道题,编号为1,2,⋯,N.每道题的起始毒瘤程度为0或1.在每天,小A可以将编号连续的K道题的毒瘤程度+1.但小B因为本身比较菜,不是很 ...
- 【LGR-049】洛谷7月月赛
Preface Luogu八月月赛都结束了我才来补七月月赛 这次月赛还是很狗的,在绍一的晚上恰逢刮台风,然后直接打到一半断网了 结果都没有交上去GG 感觉这次难度适中,解法也比较清新自然吧,十分给个九 ...
- php使用microtime(true)查看代码执行时间
microtime() 函数返回当前 Unix 时间戳和微秒数. 如果带个 true 参数, 返回的将是一个浮点类型 round() 取出小数点后 3 位 $t1 = microtime(true); ...
- JS中字符串的true转化为boolean类型的true
var a="True"; a = eval(a.toLowerCase()); alert(typeof a); //boolean alert(a);//true 正解,eva ...
- 继承 原生js 与 $.extend(true,default,opts||{});
$.extend(true,default,opts||{}); var obj1={ name:'liu', sex:'m', work:'pc' } var obj2={ sex:'w' } va ...
- IOS中div contenteditable=true无法输入
在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...
- <%@ page trimDirectiveWhitespaces="true" %>
我们经常会在JSP页面上使用: <%@ page trimDirectiveWhitespaces="true" %> 这个命令可以使jsp输出的html时去除多余的空 ...
- mysql 数据库连接超时的问题 autoReconnect=true
最近在使用spring-jdbc数据库连接管理时,出现一个奇怪问题,当天部署运行没问题,第二天再试就报以下异常问题 org.springframework.dao.RecoverableDataAcc ...
- jsp include flush true
设置flush为true,就是说,如果你的缓冲区的内容很多了,就将数据读出,以免数据泄漏,造成错误服务器端页面缓冲,大致的意思是,在将生成的HTML代码送到客户端前,先在服务器端内存中保留,因为解释J ...
随机推荐
- 转:Java子线程中的异常处理(通用)
引自:https://www.cnblogs.com/yangfanexp/p/7594557.html 在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally . ...
- 为什么我用了$().height()还是对不齐呢?
有一个这样的需求:有两个显示内容的框,要使他们高度一致,因为他们存放的内容多少和结构不一样,左边内容少,右边内容多.这就导致了右边会比左边高,解决方法就是超出部分用滚轮显示,那这时就先要调整右边的高度 ...
- Mysqldump自定义导出n条记录
很多时候DBA需要导出部分记录至开发.测试环境,因数据量需求较小,如果原库的记录多,且表数量也多,在用mysqldump命令导出时可以添加一个where参数,自定义导出n条记录,而不必全量导出. 示例 ...
- 点按钮ajax get方法修改0或1状态封装成函数
最终效果 列表页面表格里点击按钮修改状态 按钮样式要引入bootstrap才可以用 本文件用的是laravel框架环境 larave路由里 Route::get('category/changesta ...
- 001---C/S架构
C/S 架构介绍 什么是C/S架构 C:client,客户端 S:server,服务端 实现客户端和服务端之间的网络通信 什么是网络 人与人之间交流是通过语言,才能彼此理解对方的意思.但是地球上有多个 ...
- 03---Nginx配置文件
#启动子进程程序默认用户#user nobody;#一个主进程和多个工作进程.工作进程是单进程的,且不需要特殊授权即可运行:这里定义的是工作进程数量worker_processes 1; #全局错误日 ...
- HyperLedger Fabric 1.4 关键技术(6.4)
本节介绍从最底层的账本开始,逐一讲解账本的结构和存储.智能合约的编写和部署.通道的操作.节点的背书和提交.排序的共识和客户端SDK的接口调用,与交易流程顺序相反,由里及表的说明Fabric最关键的技术 ...
- xss挑战赛小记 0x01(xsstest)
0x00 今天在先知社区看到了一个xss挑战赛 结果发现比赛已经结束 服务器也关了 百度找了个xss挑战赛来玩一下 正好印证下xss的学习--- 地址 http://test.xss.tv/ ...
- EF使用报错说缺少引用
在程序中已经引用了EF,也引用了System.Data,但是一起报这个错误: 在类前面也已经写了 using System.Data.Entity,百思不得其解,最后才发 ...
- 小程序如何去掉button组件的边框
小程序获取用户授权不再支持wx.getUserInfo方法,改为用button获取,格式如下 <button class="btn btn" open-type=" ...