首页 > 其他分享 >CF1993C Light Switches 题解

CF1993C Light Switches 题解

时间:2024-08-05 15:39:51浏览次数:7  
标签:cnt 映射 read 题解 偏移量 Switches 端点 Light mx

CF1993C Light Switches 题解

题目大意

有 \(n\) 盏灯,第 \(i\) 盏灯亮着的时间为 \([a_i+bk,a_i+(b+1)k-1]\),其中 \(k\) 为给定常数,\(b\) 为任意非负偶数。求一个最小的 \(t\),使得在时间 \(t\) 所有灯都是亮着的。

Solve

令 \(m=2k\),显然所有灯的开关状态以 \(m\) 为周期,所以我们考虑把所有灯的开关状态映射到 \([0,m)\),并求出每个灯映射的偏移量 \(d_i\),即需要往前推多少个周期才能把开关状态映射到 \([0,m)\),显然有 \(d_i=\lfloor{a_i\over m}\rfloor\),那么映射后,这盏灯开着的区间即为 \([a_i\bmod m,a_i\bmod m+k-1]\)。

对于答案,取 \(\min\limits_{cnt_t=n}\{t+mx_t\times m\}\),其中 \(t=0,1,\dots,m-1\),\(cnt_t\) 为在 \(t\) 时刻为开着的灯的个数,\(mx_t\) 为在 \(t\) 时刻为开着的灯的偏移量的最大值。

但有一些细节。考虑有一些灯的开关状态在 \([0,m)\) 内可能是 11100011 这样的,\(1\) 在两边。这时候左边的 \(1\) 的偏移量为 \(\lfloor{a_i\over m}\rfloor+1\),右侧的 \(1\) 的偏移量为 \(\lfloor{a_i\over m}\rfloor\)。

至于具体怎么维护 \(cnt_t\) 和 \(mx_t\),显然可以上数据结构比如线段树,但这里提供一种不用数据结构的方法。

考虑借用扫描线的思想,对于每个 \(a_i\),将对应区间左端点的 \(cnt\) 加上 \(1\),右端点的 \(cnt\) 减去 \(1\)(相当于差分),遍历 \(t\) 时前缀和统计即可。而对于 \(mx\),考虑在区间左端点插入二元组 \((d_i,1)\),右端点插入二元组 \((d_i,0)\)。遍历 \(t\) 时,先操作 \(t\) 上的所有二元组,开一个 set,若二元组第二维是 \(1\),则将 \(d_i\) 加入,否则删除。那么 \(mx_t\) 即为 set 的末尾元素。

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read()
{
	short f=1;
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9')	{if(c=='-')	f=-1;c=getchar();}
	while(c>='0'&&c<='9')	x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
const int N=2e5+10;
int t,n,k,c[N<<1],ans,m;
struct zzn{int x;bool op;};
vector<zzn>q[N<<1];
multiset<int>s;//注意可能有相等的元素,故需要multiset
signed main()
{
	t=read();
	while(t--)
	{
		n=read();k=read();ans=1e18;m=k<<1;
		s.clear();
		for(int i=0;i<m;i=-~i)	c[i]=0,q[i].clear();
		for(int i=1,a;i<=n;i=-~i)
		{
			a=read();
			c[a%m]++,q[a%m].push_back({a/m,1});
			if(a%m+k<m)
				c[a%m+k]--,q[a%m+k].push_back({a/m,0});
			else//对应上文中 1 在左右两侧的情况
				c[0]++,q[0].push_back({a/m+1,1}),
				c[(a%m+k)%m]--,q[(a%m+k)%m].push_back({a/m+1,0});
		}
		for(int i=0,cnt=0;i<m;i=-~i)
		{
			cnt+=c[i];
			for(zzn j:q[i])
			{
				if(j.op)	s.insert(j.x);
				else	s.erase(s.find(j.x));//相等的元素只删除一个
			}
			if(cnt==n)	ans=min(ans,i+(*--s.end())*m);
		}
		if(ans==1e18)	puts("-1");
		else	printf("%lld\n",ans);
	}
	return 0;
}

标签:cnt,映射,read,题解,偏移量,Switches,端点,Light,mx
From: https://www.cnblogs.com/sorato/p/18343327

相关文章

  • P5086 的题解
    (一)将输入的四个数差分得到三个值,这三个值相同的两个坐标符合条件。用map存储记录这三个值的结构体,然后用vector存储下标。(二)AC代码。#include<bits/stdc++.h>#definedbdouble#definepbpush_back#definefifirst#definesesecond#definemkpmake_pair#defin......
  • [ARC118C] Coprime Set 题解
    题目传送门(洛谷)题目传送门(atcoder)Step1理解题意输入一个数nnn要求你构造一个长度为n......
  • 洛谷P10839 【MX-J2-T0】Turtle and Equations题解
    灰常简单!蒟蒻带您写代码!题目理解题目传送门题目描述给你四个正整数。现在你有一条算式。你需要判断能否在两个方框内分别填入三种运算符 之一(运算符可以重复使用),使得算式运算的结果等于。题目分析分析后我们能够发现,只要一一列举出所有能够输出的情况,剩下的输出即可......
  • 若依框架导入阿里OSS报错问题解决方案
    [INFO]ruoyi-quartz.......................................FAILURE[0.504s][INFO]ruoyi-generator....................................SKIPPED[INFO]ruoyi-admin........................................SKIPPED[INFO]---------------------------------......
  • 洛谷P4910题解
    题目大意现在穿T次手串,每根手串的长度分别为不同的n,有木和金两种珠子,相邻两颗珠子必须有一个是金。题目思路分析我们现在设穿到第n个珠子时用金的方案数为f[1][n],用木的方案数为f[0][n]如果第n个珠子为金,那么前一颗珠子是什么都可以,因此f[1][n]=f[1][n-1]+f[0][n-1]而如果......
  • ARC181题解(A-D)
    A-SortLeftandRight答案为0即已经排序。考虑答案为1的情况:一定是存在一个\(p\),使得\(\min_{i=1}^{p}a_i=p\)且\(a_p=p\),这时只要选择\(p\)即可。考虑答案为2的情况:如果\(a_1\neqn\operatorname{or}a_n\neq1\),一定可以通过先操作某个数,把\(1\)或者\(n\)......
  • Java环境变量配置的最佳实践和常见问题解决方案
    Java环境变量配置的最佳实践和常见问题解决方案大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,环境变量的配置是保证应用程序顺利运行的关键。无论是在本地开发环境还是生产环境,正确配置Java环境变量不仅能提升开发效率,还能避免许多常见......
  • Codeforces Round 891 (div.3) D题解析
    CodeForcesRound898(div4)D题.StrongVertices大致思路对于题目的给的式子,au-av>=bu-bv,我们可以通过移项得到au-bu>=av-bv,这样就能够构造出来一个ai-bi的项出来对于构造出来的项,我们可以遍历一遍用数组把每一个项存起来,找到值最大的项,值最大的项所对应的下标就是强顶......
  • 【秋招笔试】2024-08-03-科大讯飞秋招笔试题(算法岗)-三语言题解(CPP/Python/Java)
    ......
  • Luogu P1777 帮助 题解 [ 紫 ] [ 线性 dp ] [ 状压 dp ]
    帮助:大毒瘤!!!调了我2h,拍了我2h,最后没调出来,重写才AC。wdnmd。思路这题主要是线性dp,而状压dp只是最后在统计答案时的一个辅助。首先定义\(dp[i][j][k]\)为考虑前\(i\)本书,已经抽出来了\(j\)本,最后没被抽出来的一本书是高度\(k\)的最小混乱度。每次放入的书与最后一位......