首页 > 其他分享 >[Codeforces] CF1704C Virus

[Codeforces] CF1704C Virus

时间:2023-12-09 17:57:13浏览次数:38  
标签:int Codeforces 房子 保护 Virus ans CF1704C now

CF1704C Virus

题意

有一个长度为\(n\)的环,即对于\(1\leq i\leq n\),满足第\(i\)个与第\(i+1\)个房子相邻,特别地,第 \(n\) 个房子与第 \(1\) 个房子也相邻。

一开始,这 \(n\) 个房子中有 \(m\) 个房子被病毒感染了。在之后的每天早上,都可以选择一个未被感染的房子并对其进行保护,被保护过的房子不会被病毒感染。随后,被染上病毒的房子都会传染他两边的房子,被保护的房子除外。

Cirno 想要阻止病毒的传播,若他采用最优策略去保护房子,请求出最终被感染房子数的最小值。

思路

我们可以将题目中的\(n\)个房子以被感染的房子为端点分成若干段。

很明显,如果我们想要尽量多的保护房子,那么就应该优先对长度较大的进行操作

那么,假设在决定保护这一段房子之前已经过了\(k\)天,那么这个段房子中就已经被感染了\(4k\)个,而如果想把这一段都保护起来,就需要将他的两段都封住。

那么在第\(k\)天决定保护这段房子,到第\(k+1\)天把他的端点都峰上,就一共需要牺牲\(4k+1\)个房子

需要注意,如果剩下的线段只剩\(1\)个房子了,那他就只需要保护一端(毕竟一端其实就相当于两端),需要特判一下

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Maxn=1e5+10;
int n,m,now,ans;
int a[Maxn],f[Maxn];
void run()
{
	cin>>n>>m;now=0;ans=0;a[0]=1;
	for(int i=1;i<=m;i++) cin>>a[i];
	sort(a+1,a+m+1);
	for(int i=1;i<=m;i++) f[i]=a[i]-a[i-1]-1;
	f[1]+=(n-a[m])+1;
	sort(f+1,f+m+1);
	for(int i=m;i>=1;i--)
	{
		if(f[i]-now==1) ans+=1; 
		else ans+=max((int)0,f[i]-now-1);
		now+=4;
	}
	cout<<n-ans<<endl;
}
signed main()
{
	int t;
	cin>>t;
	while(t--) run();
} 

标签:int,Codeforces,房子,保护,Virus,ans,CF1704C,now
From: https://www.cnblogs.com/lyk2010/p/17891254.html

相关文章

  • [Codeforces] CF1703E Mirror Grid
    CF1703EMirrorGrid题意给定一个\(n\timesn\(n\le100)\)的01矩形,求至少修改多少次后能使矩形旋转0°,90°,180°,270°后所形成的矩形都完全相同。思路吸纳分为两种情况讨论:\(n\)为奇数那么会出现这种情况:(以\(5\times5\)为例)如上图,我们就可以将其分为五个部分,每个......
  • Codeforces Round 811 (Div. 3)
    基本情况ABC秒了。DE都给了我希望,但都做不下去。两道题反复横跳,结果最后谁也没做出来。E还是比D亲切的,先补E吧。E.AddModulo10做的时候想着说对每个个位数的变化找找规律,但是没有进一步的发现。实际上就应该从这里下手。首先共识:相同的两个数经过操作后必然相同。分析......
  • Codeforces Round 913 (Div. 3)
    A.Rook打印出象棋车的下一步usingnamespacestd;voidsolve(){ strings; cin>>s; chara=s[0]; charb=s[1]; set<string>ans; for(chari='1';i<='8';i++){ stringt=""; t+=a; t+=i; ans.insert(t); } for(chari......
  • Codeforces Round 894 G
    玩一下样例就能知道这个是和每个seg的最大间隔相关为了好写我们可以直接写成元素间隔这样我们用两个multiset维护元素间隔以及元素即可注意删除的时候我们只删一个值需要删指针还有考虑长度为1的情况multiset<int>st,st1;voidErase(intx){autoit=st1.lower_bound......
  • Codeforces Round 913 (Div. 3)
    CodeforcesRound913(Div.3)比赛链接ROOK题目思路:我没有下过国际象棋,但这个题跟国际象棋真是没有一点关系,就是一个简单的输出代码:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){//intn;strings;cin>>s;in......
  • CodeForces 1901F Landscaping
    洛谷传送门CF传送门还是很有趣的一道题。场上直接暴拆式子,要维护动态凸包,本来以为是\(\log^2\)的,写着写着发现是\(\log^3\),遂弃。显然梯形面积最小等价于\(y_0+y_1\)最小,而\(y_0+y_1\)最小等价于梯形在\(m=\frac{n}{2}\)处最小。把上凸包建出来,发现过\(x=m......
  • Codeforces Round 913 (Div. 3)
    CodeforcesRound913(Div.3)div3两题新纪录..我再也不喝完酒打cf了A.Rook#include<bits/stdc++.h>//#defineintlonglong#defineendl'\n'usingnamespacestd;intboard[10][10];voidsolve(){strings;cin>>s;intx=s[0]-&#......
  • 【题解】CodeForces 1902F Trees and XOR Queries Again
    传送门:https://codeforces.com/contest/1902/problem/F数据结构题,这里讲两种思路。$ST$表思路:判定“从若干个数中能否取出其中一些,使得异或和为$x$”的问题,第一时间想到线性基,本题要做的显然就是快速求出询问路径上所有数的线性基。两组数的线性基可以合并,方法为“暴力将......
  • Educational Codeforces Round 158 (Rated for Div. 2)
    Preface补题,妈的现在EduE都做不来这搞毛啊A.LineTrip签到#include<cstdio>#include<iostream>#include<utility>#include<vector>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>#include<queue&......
  • Codeforces Round 913 (Div. 3)(A~F)
    A.Rook题意:在一个国际象棋棋盘中,横坐标为a-h,纵坐标为1-8,字母在前,数字在后,输入一个棋子的位置,输出该棋子所在的行与列中非棋子本身位置的所有位置。分析:模拟。代码:#include<iostream>#include<algorithm>usingnamespacestd;typedeflonglongll;constintN=2e5......