首页 > 其他分享 >题解:CF1623B Game on Ranges

题解:CF1623B Game on Ranges

时间:2024-03-28 21:11:07浏览次数:29  
标签:CF1623B 题解 int Game 端点 删去 区间 操作 集合

题意理解(建议先自己把原题描述看一遍再来看我的理解)

有一个集合,这个集合的元素是区间,一开始集合里只有一个元素就是 \([1,n]\) 的区间,对这个集合我们可以选择其中的一个元素(区间),然后在区间内选一个数d,以 \([l,d-1]\) 和 \([d+1,r]\) 这两个区间替换掉我们选择的这个区间( \(l\) 和 \(r\) 分别是我们从集合里面选择出来的这个元素的左端点和右端点)。当然这两个新区间必须存在才行,左端点小于等于右端点。如果不存在就不加入到集合中。我们选择\(n\)个数后,集合内元素个数为 \(0\),也就是区间个数为 \(0\) 时结束。

现在题目给出的是每次操作时选择的那个区间,要你推出对应的d。比如现在有一个集合 \(S\),里面有一个元素,区间\([1,6]\)。

    第一次操作,选[1,6],d取2,对S,删去[1,6],加入[1,1]和[3,6],现S={[1,1],[3,6]}。

    第二次操作,选[1,1]进行操作,d取1,对S,删去[1,1],现S={[3,6]}。

    第三次操作,选[3,6]进行操作,d取6,对S,删去[3,6],加入[3,5],现S={[3,5]}。

    第四次操作,选[3,5]进行操作,d取3,对S,删去[3,5],加入[4,5],现S={[4,5]}。

    第五次操作,选[4,5]进行操作,d取5,对S,删去[4,5],加入[4,4],现S={[4,4]}。

    第六次操作,选[4,4]进行操作,d取4,对S,删去[4,4],现S为空,游戏结束。

现题目打乱顺序的给出 $[1,6],[1,1],[3,6],[3,5],[4,5],[4,4] $这六个区间,要求你推出每个区间对应的d,并输出,可以不按照题目的顺序。

题解

看似很复杂的一道题,我们可以从简单的角度入手,对于左右端点相等的区间,\(d\) 只能选择端点值,所以我们先确定所有左右端点相等区间对应的 \(d\) 值。其实我们可以简单的理解为每次操作删掉 \([1,n]\) 之间的一个数,所以删过的数就不可能再次出现,也就是每个区间对应的\(d\)值都不相同。所以我们标记掉出现过的 \(d\)。于是我们有了这样一个思路,随着迭代的进行被标记的 \(d\) 越来越多,对于区间越来越大,但是找到 \(d\) 的难度相当,因为区间越大时被标记的 \(d\) 就越多。我们将区间以从小到大的顺序排列,对于长度为 \(1\) 的区间直接找到 \(d\) 值,对于长度为 \(2\) 的区间只有两个可能的 \(d\) 值,但此前我们标记了一个 \(d\) 值,所以对于长度为 \(2\) 的区间也只有一个确定的 \(d\) 值,以此类推。所有的区间我们都能找到一个 \(d\) 值与之对应。


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define LM LLONG_MAX
#define IM INT_MAX
#define N 1001
struct pair1{
	int l;
	int r;
	int len;
	int d=0;
};
bool cmp(pair1 a,pair1 b){
	return a.len<b.len;
}
 
int main(){
	int t;
	
	cin>>t;
	while(t--){
		bool vis1[N]={0};
		int n,ans[N];
		cin>>n;
		pair1 a[N];
		for(int i=1;i<=n;i++){
			cin>>a[i].l>>a[i].r;
			a[i].len=a[i].r-a[i].l;
		}
		sort(a+1,a+1+n,cmp);
		for(int i=1;i<=n;i++){
			if(a[i].l==a[i].r){
				a[i].d=a[i].l;
				vis1[a[i].d]=true;
			}
			else {
				for(int j=a[i].l;j<=a[i].r;j++){
					if(!vis1[j]){
						a[i].d=j;
						vis1[j]=true;
					}
				}
			}
		}
		for(int i=1;i<=n;i++) cout<<a[i].l<<" "<<a[i].r<<" "<<a[i].d<<endl;
	}
}

标签:CF1623B,题解,int,Game,端点,删去,区间,操作,集合
From: https://www.cnblogs.com/deviance/p/18102628

相关文章

  • 【Gradle测试】OOM问题解决方案
    文章目录概要问题场景问题复现解决方案相关资源概要分享开发过程中遇到的Gradle测试OOM问题的解决方案。问题场景当运行Gradle测试的时候,如果测试用例比较多,并且运行过程中创建的对象所占用的内存超过了Gradle测试默认的最大内存,则会发生OOM。问题复现由于本地......
  • P1037 [NOIP2002 普及组] 产生数 python 题解
    原题链接:产生数原理解释本题就是基本的dfs,对每一个数遍历深搜,得到他能变化的所有情况,最后相乘就是结果,网上都是c的解法,需要用到高精度,但是python可以处理大数,不需要。vis[]判断该数是否变换过,防止重复以n=123,k=2,变换列表x=[1,3],y=[3,4],即1->3,3->4:先遍历1:遍历......
  • CF1392H ZS Shuffles Cards 题解
    题目传送门前置知识概率DP解法设\(f_{i}\)表示有\(i\)张数字牌没进入\(S\),即\(S\)中只有\(n-i\)张数字牌时的期望轮数,有\(f_{i}=\frac{i}{i+m}f_{i-1}+\frac{m}{i+m}(f_{i}+1)\),解得\(f_{i}=f_{i-1}+\frac{m}{i}\),边界为\(f_{0}=1\)。由于每一张数字牌在joke......
  • 20240328每日一题题解
    20240328每日一题题解摘要本文对于2024年3月28日的每日一题进行了问题重述,并将问题拆解为五个步骤,分别进行了详细的讨论与求解,实现了整型与字符串类型的互相转换。并且还指出,在编写C++程序时,需要观察数据范围,在有必要时使用长整型(longlong)存储数据,以免出现整型溢出现象。关键......
  • Spring Boot 工程开发常见问题解决方案,日常开发全覆盖
    本文是SpringBoot开发的干货集中营,涵盖了日常开发中遇到的诸多问题,通篇着重讲解如何快速解决问题,部分重点问题会讲解原理,以及为什么要这样做。便于大家快速处理实践中经常遇到的小问题,既方便自己也方便他人,老鸟和新手皆适合,值得收藏......
  • P2421-荒岛野人Savage题解
    好久没写题解了啊洛谷P2421荒岛野人题目大意:有一个有很多洞的岛上,住了\(n\)个野人,每个野人的初始位置为\(c[i]\),换洞的速度为\(p[i]\),寿命为\(l[i]\)。要求求出洞的最少个数\(M\)满足每个野人在生存状态下不会在同一年和其他野人住在同一个山洞里。概括版:很多个青蛙的约会。......
  • 【题解】AGC007E | 二分答案 复杂度分析
    首先考虑题目要求每条边被经过两次,这说明了我们进入一个子树后一定会处理完子树内所有的叶子后离开该子树,否则子树上端那条边会进出至少两次,即经过至少四次。所以这说明了子树之间的独立性:某个子树在答案中一定是一个连续的区间,这引导我们从有根树信息自下向上拼接的角度考虑。我......
  • SP2426 PLD - Palindromes 题解
    题目传送门题目大意给定一个字符串,请你求出这个字符串中所有长度为kkk的回文串的个数。解题思路我们只需要枚举每个字串的起始位置......
  • [USACO24FEB] Bessla Motors G 题解
    题目大意对于每个充电站找它所能去到的非充电站的点TTT($C<T$同时两点的距离在RR......
  • GAMES01 Geometry
    生活中有许多曲面、曲线需要去表示。这里也有许多表示几何的方法:Implicitalgebraicsurfacelevelsetsdistancefunctions...Explicitpointcloudpolygonmeshsubdivision,NURBS...Implicit表达通常,隐式表达被定义为f(x,y,z)=0,其中f(x,y,z)是一个xyz的关系表达式......