[CSP-S模拟测试]:C(三分+贪心)
题目传送门(内部题46)
输入格式
第一行$3$个整数$n,m,t$。
第二行$n$个整数,表示$P_i$。
接下来$m$行每行两个整数,表示$L_i,R_i$。
输出格式
一行一个整数表示答案。
样例
样例输入:
3 3 2
6 2 5
1 1
2 2
3 3
样例输出:
11
数据范围与提示
样例解释:
最优方案为使用$2$次特殊加热器,$4$次$1$号加热器,$3$次$3$号加热器。
数据范围:
对于前$20\%$的数据:$t\geqslant n$
对于另$30\%$的数据:$P_i\leqslant 30$
对于所有数据:
$1\leqslant n,m,t\leqslant {10}^5$
$1\leqslant L_i,R_i\leqslant n$
$1\leqslant P_i\leqslant {10}^7$
题解
首先,如果你不傻,特殊加热器肯定是在一开始使用。
然而随着我们使用次数的增加,普通加热器所减少的费用也越来越小,所以这是一个上凸函数,所以我们考虑三分使用次数。
剩下的贪心即可。
时间复杂度:$\Theta(n\log_{1.5}(\max(P_i)))$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec{int L,R;}e[100001];
int n,m;
long long t;
int P[100001];
int cnt[100001];
long long ans=1LL<<60;
int h[100001],tag[100001];
long long judge(int x)
{
for(int i=1;i<=n;i++)h[i]=max(0,P[i]-x);
long long res=x*t;
int flag=0;
for(int i=1;i<=n;i++)
{
flag-=tag[i];
tag[i]=0;
h[i]=max(0,h[i]-flag);
res+=h[i];
flag+=h[i];
tag[cnt[i]+1]+=h[i];
}
return res;
}
int main()
{
scanf("%d%d%lld",&n,&m,&t);
for(int i=1;i<=n;i++)cnt[i]=-1;
for(int i=1;i<=n;i++)scanf("%d",&P[i]);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&e[i].L,&e[i].R);
cnt[e[i].L]=max(cnt[e[i].L],e[i].R);
}
int lft=0,rht=0;
for(int i=1;i<=n;i++)
{
if(cnt[i-1]>=i)
{
rht=max(rht,cnt[i]);
cnt[i]=rht;
}
if(cnt[i]==-1)lft=max(lft,P[i]);
}
rht=10000000;
while(lft<=rht)
{
int mid=(lft+rht)>>1;
long long flagl=judge(mid),flagr=judge(mid+1);
if(flagl>=flagr)
{
lft=mid+1;
ans=min(ans,flagr);
}
else
{
rht=mid-1;
ans=min(ans,flagl);
}
}
printf("%lld",ans);
return 0;
}
rp++
[CSP-S模拟测试]:C(三分+贪心)的更多相关文章
- [CSP-S模拟测试]:赛(贪心+三分)
题目描述 由于出题人思维枯竭所以想不出好玩的背景.有$n$个物品,第$i$个物品的价格是$v_i$,有两个人,每个人都喜欢$n$个物品中的一些物品.要求选出正好$m$个物品,满足选出的物品中至少有$k ...
- [CSP-S模拟测试]:Blue(贪心)
题目描述 $Blue$是个动物学家,不仅喜欢研究猫和老鼠,还喜欢研究青蛙.他最近开始研究青蛙过河的问题,可以简化成:数轴上$0$为岸边,$L$为河对岸.$(0,L)$中间存在$n$个石子.已知青蛙一跳 ...
- [CSP-S模拟测试]:爬(贪心)
题目传送门(内部题134) 输入格式 第一行两个数$N,L$. 接下来$N$行每行两个数$A_i,B_i$. 接下来$N$行每行一个整数$C_i$. 输出格式 一行一个整数表示答案,无解输出$-1$. ...
- [CSP-S模拟测试]:午餐(贪心+最短路)
题目传送门(内部题115) 输入格式 第一行两个正整数$n,m$. 接下来$m$行,每行$4$个正整数$u_j,v_j,L_j,R_j$. 接下来一行$n$个数,若第$i$个数为$1$,则$i$号同学 ...
- [CSP-S模拟测试]:格式化(贪心)
题目传送门(内部题105) 输入格式 每组数据第一行一个正整数$n$,表示硬盘块数,接下来$n$行,每行两个正整数,第一个正整数为硬盘格式化前的容量,第二个正整数为格式化之后的容量. 输出格式 对每组 ...
- [CSP-S模拟测试]:优化(贪心+DP)
题目描述 $visit\text{_}world$发现有下优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:现在有长度为$N$的整数序列$\{ a_i\}$,你需要从中选出$K$个不想叫的连 ...
- [CSP-S模拟测试]:梦境(贪心+小根堆)
题目描述 智者奥尔曼曾说过:有缘的人即使相隔海角天涯,也会在梦境中相遇. $IcePrince\text{_}1968$和$IcePrincess\text{_}1968$便是如此.有一天$IcePr ...
- [CSP-S模拟测试]:d(贪心+树状数组)
题目传送门(内部题65) 输入格式 第一行,一个自然数$T$,代表数据组数.对于每组数据:第一行,一个正整数$n$,一个自然数$m$.接下来$n$行,每行两个正整数,$a_i,b_i$. 输出格式 对 ...
- [CSP-S模拟测试]:Tree(贪心)
题目描述 给定一颗$n$个点的树,树边带权,试求一个排列$P$,使下式的值最大 $$\sum \limits_{i=1}^{n-1}maxflow(P_i,P_{i+1})$$ 其中$maxflow( ...
- [CSP-S模拟测试]:E(贪心)
题目传送门(内部题48) 输入格式 第一行一个整数$n$.接下来$n$行每行两个整数$x_i,y_i$. 输出格式 一行一个整数表示答案. 样例 样例输入$1$: 23 72 5 样例输出$1$: 样 ...
随机推荐
- 修改git默认的编辑器nano为vim的方法
git默认的编辑器是nano,使用起来不易操作,下面介绍两种方法将git默认的编辑器修改为vim. git config --global core.editor vim .git/config文件 ...
- webpack整合 vue-router 路由,模块嵌套,整合Mint UI,MUI
webpack整合 vue-router 结构 各个文件内容,一共八个文件, 还有src components 目录 Login.vue <template> <div> &l ...
- vue中移动端滚动事件,点击一次触发了事件两次(better-scroll)
解决办法一: 将button标签换成a标签 问题代码: <span class="submitBtn" @click.stop="replyReport()&quo ...
- get获取后台数据
let url = $.getCookie('prefixUrl')+'/currencyRatesManage/getCurrency'; let vm=this; $.ajax({ url: ur ...
- go语言时间函数
以YY-mm-dd HH:MM:SS.9位 输出当前时间: func main() { fmt.Println(time.Now()) // 2019-11-15 16:26:12.4807588 + ...
- 实现单点登录功能的思路以及kafka同步数据
单点登录以及用户数据同步思路与方案 当公司业务分布于多个子系统时, 同一用户在A系统注册,即可在其他所有关联系统使用, 并支持登录A系统后,自动在其他系统登录,退出同理. 在A平台修改通用的用户数据( ...
- 【异常】The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
1 详细异常信息 The last packet sent successfully to the server was milliseconds ago. The driver has not re ...
- 6、SSH远程管理服务实战
1.SSH基本概述 SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输.确保了数据传输安全.那SSH服务主要功能有哪些呢? 1.提供远程连接服务器的服务. 2.对传输 ...
- 超简单!教你如何修改源列表(sources.list)来提高软件访问速度
因为Ubuntu官方的源地址不在国内,所以在国内的访问速度非常慢,比如:我们要下载或是更新软件那速度比蜗牛还慢.所以,我们需要改成国内的镜像服务器,这样,我们在下载或更新软件的时候就会很快了. 配置步 ...
- da面板修改SSH端口号
进入da面板,找到管理工具菜单下的文件编辑器,点击进入,选择所要编辑的文件/etc/ssh/sshd_config 点击右侧的显示文件,即可打开该文件进行编辑,例如可以将原始端口22修改为 33 #P ...