[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++

原文地址:https://www.cnblogs.com/wzc521/p/11551339.html

时间: 2024-11-08 03:51:55

[CSP-S模拟测试]:C(三分+贪心)的相关文章

[CSP-S模拟测试]:赛(贪心+三分)

题目描述 由于出题人思维枯竭所以想不出好玩的背景.有$n$个物品,第$i$个物品的价格是$v_i$,有两个人,每个人都喜欢$n$个物品中的一些物品.要求选出正好$m$个物品,满足选出的物品中至少有$k$个物品被第一个人喜欢,$k$个物品被第二个人喜欢.并求出最小的价格和. 输入格式 第一行三个数$n,m,k$.第二行$n$个数,第$i$个数表示$v_i$.第三行包含一个数$a$,表示第一个人喜欢的物品数.第四行包含$a$个数,表示第一个人喜欢的物品是哪几个.第五行包含一个数$b$,表示第二个人喜

[CSP-S模拟测试]:Tree(贪心)

题目描述 给定一颗$n$个点的树,树边带权,试求一个排列$P$,使下式的值最大 $$\sum \limits_{i=1}^{n-1}maxflow(P_i,P_{i+1})$$ 其中$maxflow(s,t)$表示从点$s$到点$t$之间的最大流,即从$s$到$t$的路径上最小的边权 输入格式 第一行一个整数$n$,表示点数下接$n−1$行,每行三个数$u,v,w$表示一条连接点$u$和点$v$权值为$w$的边 输出格式 输出一行一个整数,表示答案 样例 样例输入: 21 2 2333 样例输出

[CSP-S模拟测试]:d(贪心+树状数组)

题目传送门(内部题65) 输入格式 第一行,一个自然数$T$,代表数据组数.对于每组数据:第一行,一个正整数$n$,一个自然数$m$.接下来$n$行,每行两个正整数,$a_i,b_i$. 输出格式 对于每组数据,输出一行,一个整数,代表答案. 样例 样例输入: 3 2 0 5 10 5 5 2 1 1 1 2 2 3 1 3 5 4 4 5 3 样例输出: 25412 数据范围与提示 保证$0\leqslant m<n,a_i,b_i\leqslant 10^5$. 题解 题目并不难,考虑贪心,

[CSP-S模拟测试]:优化(贪心+DP)

题目描述 $visit\text{_}world$发现有下优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:现在有长度为$N$的整数序列$\{ a_i\}$,你需要从中选出$K$个不想叫的连续子区间(可以存在元素不被选),从左到右记它们的和为$s_1,s_2,...,s_k$,我们的优化目标是最大化下述和式:$$\sum \limits_{i=1}^{k-1}|s_i-s_{i+1}|$$你只需要输出这个最大的和即可. 输入格式 第一行两个整数$N,K$,意义如上.接下来一行$N$个整

[CSP-S模拟测试]:爬(贪心)

题目传送门(内部题134) 输入格式 第一行两个数$N,L$. 接下来$N$行每行两个数$A_i,B_i$. 接下来$N$行每行一个整数$C_i$. 输出格式 一行一个整数表示答案,无解输出$-1$. 样例 样例输入1: 3 96 35 23 1222 样例输出1: 2 样例输入2: 5 203 24 26 38 410 542345 样例输出2: -1 数据范围与提示 对于$40\%$的数据,$N\leqslant 1,000$: 对于额外$20\%$的数据,$B_i=0$: 对于额外$20\

[考试反思]0929csp-s模拟测试55:沦陷

菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3暴力之后回T1打对拍瞬间爆炸. 于是又重新打了一个2k,WA0.对拍发现. 然后考试就没几分钟了交暴力走了. 不要打完就跑,记得早点对拍改进思路. T1: 的确是挺裸的线段树.离散化或者权值线段树都可以. 但是考场上两个都打出来都死了. 最后用离散化A的. 1 #include<cstdio> 2

2018冬令营模拟测试赛(三)

2018冬令营模拟测试赛(三) [Problem A]摧毁图状树 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 这题没想到贪心 QwQ,那就没戏了-- 贪心就是每次选择一个最深的且没有被覆盖的点向上覆盖 \(k\) 层,因为这个"最深的没有被覆盖的点"不可能再有其它点引出的链覆盖它了,而它又

2018冬令营模拟测试赛(十九)

2018冬令营模拟测试赛(十九) [Problem A]小Y 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 目前未知. 这题目前就能做到 \(O(n \sqrt{M} \log n)\),其中 \(M\) 是逆序对数,然而会被卡 \(T\):当然这题暴力可以拿到和左边那个算法一样的分数,只要暴力加一个剪枝:当左

[考试反思]1002csp-s模拟测试56:凌乱

放假回来状态回升??(玩够了-但是稍困) T1打的不完全对,但是过掉了.很快的想到了二分吧喇叭啦.. 然后T2也挺快想出来了但是挂细节没发现,考试快结束的时候才发现出锅了. 改了过来是正解,但是出题人无良卡了线段树强制树状数组,T了一个子任务,卡常到飞起. T3暴力没什么问题. 卡常是一种习惯.要注意题目数据范围观察是否卡常. T1: 所有的决策都是一条一次函数. 分两类,斜率正或斜率非负. 如果第二类的直线里有在T=0时符合要求的,那么答案就是0,所以check(0)一下. 如果非负的直线都在

模拟测试68,69

68: 32 AlpaCa 41 03:08:20 31 02:46:16 30 02:46:28 102 03:08:20 69: 28 AlpaCa 20 02:51:15 60 03:05:32 0 01:39:45 80 03:05:32 彻底挂掉了呢. 不过也还好吧,至少之后的考试不会有那么大压力了吧(出第一机房是肯定的事了),那利用之后几场考试就调整好状态,下次再来嘛. 但是最近炸了那么多场还是要反思一下,其实不只是心态的问题,自身实力,考试技巧,时间分配等方面好像都有点问题. 69