首页 > 其他分享 >P8081 [COCI2011-2012#4] ZIMA 题解

P8081 [COCI2011-2012#4] ZIMA 题解

时间:2023-05-25 21:59:18浏览次数:38  
标签:ch 标记 int 题解 ZIMA long 冰期 P8081 define

题意

给定一个长度为 \(n\) 的序列。

当连续 \(T\) 天温度都小于 \(0\) 时,则称这 \(T\) 天为一个冰期,冰期来临之前的 \(2T\) 天都被标记为警示状态.

特殊地,如果一个冰期最长,那么它的前 \(3T\) 天会被标记为警示状态。如果有多个冰期最长,选一个。

思路

模拟

  • 预处理出每个冰期的长度和起始天数,然后在起始天数的前 \(2T\) 天打上标记(注意不要越界)。
  • 对长度进行排序,找出最长天数。在最长天数中比较变成 \(3T\) 后哪一个原先没打上标记现在打上标记的个数最多,找到这个增量。用前缀和数组维护之前被打上标记的个数,以此来找到增量。
  • 最后的结果就是原先标记的个数加上这个增量。

代码实现

#include<bits/stdc++.h>
//#define int long long
#define ll long long
#define next nxt;
#define re register
#define il inline
const int N=1e5+10;
using namespace std;

int a[N];
struct node{
	int l,r;
	int day;
}icy[N];int cnt;/*icy数组记录冰期左右端点,和持续的时间*/
int ice[N],add[N],l,r,tot;/*ice数据就是标记,add数组是前缀和数组*/

il int read()
{
	int f=0,s=0;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) f |= (ch=='-');
	for(; isdigit(ch);ch=getchar()) s = (s<<1) + (s<<3) + (ch^48);
	return f ? -s : s;
}

il bool mysort(node a,node b) 
{
	if(a.day == b.day) return a.l > b.l;
	else return a.day > b.day;/*按天数从大到小排序*/
}

int n,ans;

signed main()
{
	n=read();
	for(re int i=1;i<=n;i++)	a[i]=read();
	for(re int i=1;i<=n;i++)
		if(a[i] < 0)
		{
			icy[++cnt].l=i;
			while(a[i]<0 && i<=n) i++; i-=1;/*找冰期的左右端点和持续时间*/
			icy[cnt].r=i;
			icy[cnt].day=icy[cnt].r-icy[cnt].l+1;
		}
	for(re int i=1;i<=cnt;i++)
		for(re int j=max(1,icy[i].l-icy[i].day*2);j<=icy[i].l-1;j++)/*给每个冰期的前2T天打上标记,注意不要越界*/
			ice[j]=1; 
	for(int i=1;i<=n;i++) add[i]=add[i-1]+ice[i];/*求前缀和数组*/
	sort(icy+1,icy+cnt+1,mysort);/*从大到小排序*/
	int maxday=icy[1].day,maxcover=0;/*maxcover就是那个增量*/
	for(int i=1;i<=cnt;i++)
	{
		if(icy[i].day <	maxday) break;/*不是最长天就可以break了*/
		r=icy[i].l-icy[i].day*2-1;/*因为前2T天我们已经打上标记了,我们只需要判断最左边的T的增量就可以了*/
		l=icy[i].l-icy[i].day*3;
		if(r<=0) continue;/*越界了就continue*/
		if(l<=0) l=1;/*l越界了r没有越界,就把l设成1*/
		tot=r-l+1;/*计算总共的天数*/
		if(maxcover < tot-(add[r]-add[l-1])) maxcover = tot-(add[r]-add[l-1]);/*tot是总天数*/
	}/*add[r]-add[l-1]是标记过的天数,一相减,就是变成3T后多出来的个数,即增量*/
	printf("%d",maxcover + add[n]); /*增量 + 原先的个数*/
	return 0;
}

标签:ch,标记,int,题解,ZIMA,long,冰期,P8081,define
From: https://www.cnblogs.com/bloodstalk/p/17433057.html

相关文章

  • AT2395 [ARC071C] TrBBnsformBBtion 题解
    题目大意有两个只包含\(A\)和\(B\)的字符串,给出两种操作A可以变为BB,B可以变为A;AAA可以消去,BBB也可以消去。思路找规律。这里我们以A为主,将B全部变为A。因为可以无限次操作,那么就代表如果两个字符串可以相等,那么他们就一定能够经过转化后变成同一个字......
  • CF714B Filya and Homework 题解
    题意给定一个长度为\(n\)的数组。我们可以给一些数加上一个\(x\),也可以减去一个\(x\),也可以不加也不减。问:是否存在一个数\(x\),使得这个数组里各个数都相等。思路一道思维题首先考虑,在这个数组中,相同的元素,我们一定是给它做相同的操作,否则一定不相等,根据这个思想,......
  • UVA1514 Piece it together 题解
    图论题还是在于建图题意给定一个长度为\(n\timesm\)的网格图,有的地方是白方块,有的是黑方块,有的啥也没用。给你如下四种\(L\)形方块,询问是否存在方法,让这些方块正好就是给出的图的形状。$L$形方块如下思路二分图首先我们要想,为什么需要二分图:若能拼成,那么就说......
  • SP15637 Mr Youngs Picture Permutations 题解
    题意给定一个最多有\(5\)排的一个队伍,每一个位置对应一个同学,给定总人数和第\(i\)排要站\(n_i\)个人。要求每行左边的同学身高要大于右边的,每列从上往下要从大到小。问:满足要求的一共有多少种方案。思路DP首先考虑,在这个题目中,有用的状态有每列最后的人的高度,每行......
  • P8584 探索未知 题解
    题意给你\(n\)个分数,每个分数后面跟着一个操作符\(op\),如果为\(1\)就是加上这个分数,是\(2\)就减去。初始时是\(0\),询问\(n\)次操作后最后的分数是多少,化成最简分数。特殊地,如果最后是个整数,直接以整数的形式输出。思路模拟考试的时候一看就想到了[NOIP2020]......
  • P8587 新的家乡 题解
    题意给定\(n\)个高度分别为\(h_i\)的柱子,两个柱子能合并成一个\(h_i+h_j\)的新柱子,每根柱子至多被使用一次。询问最多能建出多少根高度相同的柱子,并且最优答案下柱子的高度有多少种情况。\(1\leqn\leq10^6\),\(1\leqh_i\leq3\times10^3\)。思路爆搜!首先我们......
  • P8585 球状精灵的传说 题解
    很好的一个题题意给你\(n\)个三元组\((r_1,r_2,r_3)\),并定义\(ρ=\lfloor\frac{1}{4}min(r_1,r_2,r_3)^3\rfloor\)。两个三元组能合并当且仅当这两个三元组有至少两个值相同,即从\((x_1,y,z)\)和\((x_2,y,z)\)变为\((x_1+x_2,y,z)\)。\((x,y,z)\)的位置不固定......
  • Android 修改 android/hardware/interfaces 下HIDL接口编译报异常问题解决
    最近要增加hostapd的一个HIDL接口,修改android/hardware/interfaces/wifi/hostapd/1.2/IHostapd.hal文件后编译报错如下:ERROR:[email protected]::IHostapdhashashacaed0a159a521bd4964e0fb8117320849109d3eeaff6a08b4d2506156ce6987whichdoesnotmatch......
  • P2480 古代猪文 题解
    题意:求\[g^{\sum_{k\midn}{n\choosek}}\]对\(999911659\)取模。\(1\len,g\le10^9\)。思路:首先根据欧拉定理,题目转化为求\(\displaystyle\sum_{k\midn}{n\choosek}\)对\(999911658\)取模的值。模数为合数不是很好做,因式分解发现\(999911658=2\times3\times467......
  • JOISC 2021 题解
    JOISC21フードコート(FoodCourt)首先我们发现我们这个删除实际上可以假删除,我们每次问询时求出这个队列目前被删了几个(维护区间加,区间\(\max(0,A-x)\))就可以把删除操作给弄掉了。然后我们考虑对商店做扫描线!因为我们现在其实就是对商店的单点问询,我们这个加入操作也可以在左......