首页 > 其他分享 >P2898 [USACO08JAN] Haybale Guessing G 题解

P2898 [USACO08JAN] Haybale Guessing G 题解

时间:2023-12-31 15:22:53浏览次数:31  
标签:USACO08JAN int 题解 long Haybale return find define

题目传送门

前置知识

二分答案 | 并查集

解法

对条件的合法性判断其他题解已经讲得很明白了,这里不再赘述。这里主要讲一下用并查集实现黑白染色问题。

以下内容称被覆盖为黑色,不被覆盖为白色。

本题因为是单向染色,即从白到黑,故可类似 luogu P1840 Color the AxisD 的并查集或线段树做法;如果是双向染色,则需要 CF915E Physical Education Lessons 的珂朵莉树或线段树做法。

luogu P1840 Color the Axis 在染色的过程中,我们只关注白色的数量。题意可以转换为给定 \(n\) 棵树组成的森林,每次操作将 \([l_i,r_i]\) 的树删除,求每个操作执行后剩余的树的个数。删除第 \(i\) 棵树等效替代于将第 \(i\) 棵树和第 \(i-1\) 或第 \(i+1\) 棵树合并为一棵树。为方便理解,我们将第 \(i\) 棵树和第 \(i+1\) 棵树合并为以 \(i+1\) 为父亲节点,以 \(i\) 为子节点的一棵(子)树。本题要求求该位置是否为黑色,但同样可以用类似的方法进行合并。

  • 例子:设 \(n=5,m=1\) 时操作为将 \([2,4]\) 的树删除。过程如下

  • 这里可以感性理解下。作者语文功底不是很好,可能解释不是很清楚。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
struct node
{
	int l,r,x;
}a[1000002],b[1000002];
int f[1000002];
bool cmp(node a,node b)
{
	if(a.x==b.x)
	{
		if(a.l==b.l)
		{
			return a.r<b.r;
		}
		else
		{
			return a.l<b.l;
		}
	}
	else
	{
		return a.x>b.x;
	}
}
int find(int x)
{
	return (f[x]==x)?x:f[x]=find(f[x]);
}
bool check(int mid,int n)
{
	int i,j,maxl,maxr,minl,minr,ls;
	for(i=1;i<=n+1;i++)//第n棵树要和第n+1棵树合并
	{
		f[i]=i;
	}
	for(i=1;i<=mid;i++)
	{
		b[i].l=a[i].l;
		b[i].r=a[i].r;
		b[i].x=a[i].x;
	}
	sort(b+1,b+1+mid,cmp);
	ls=b[1].x;
	maxl=minl=b[1].l;
	maxr=minr=b[1].r;
	for(i=2;i<=mid;i++)
	{
		if(ls==b[i].x)
		{
			maxl=max(maxl,b[i].l);
			minl=min(minl,b[i].l);
			maxr=max(maxr,b[i].r);
			minr=min(minr,b[i].r);
			if(maxl>minr)
			{
				return false;
			}
		}
		else
		{ 
			if(find(maxl)>minr)
			{
				return false;
			}
			else
			{
				for(j=find(minl);j<=maxr;j=find(j+1))//将第j棵树和第j+1棵树合并为同一棵树
				{
					f[j]=f[j+1];
				}
				ls=b[i].x;
				maxl=minl=b[i].l;
				maxr=minr=b[i].r;
			}
		}
	}
	return find(maxl)<=minr;
}
int main()
{
	int n,m,i,l=0,r,mid;
	cin>>n>>m;
	r=m;
	for(i=1;i<=m;i++)
	{
		cin>>a[i].l>>a[i].r>>a[i].x;
	}
	while(l<=r)
	{
		mid=(l+r)/2;
		if(check(mid,n)==true)
		{
			l=mid+1;
		}
		else
		{
			r=mid-1;
		}
	}
	cout<<((r==m)?0:l)<<endl;//注意当没有矛盾时输出0
	return 0;
}

标签:USACO08JAN,int,题解,long,Haybale,return,find,define
From: https://www.cnblogs.com/The-Shadow-Dragon/p/17937523

相关文章

  • 二叉树面试题解析
    二叉树面试题解析判断相同的树/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNode......
  • 剑指Offer Java题解(前3道题)
    目录1.二维数组中的查找2. 替换空格3. 从尾到头打印链表1.二维数组中的查找题目链接:传送。方法一,暴力枚举。参考代码:packageproblem01;/***@Authorsyrdbt*@Date2019/7/314:05*二维数组中的查找*方法一,暴力枚举*/publicclassSolution{publicboole......
  • 杭州电子科技大学2023新生赛 E 树 题解
    Question杭州电子科技大学2023新生赛E树给定一颗包含\(n\)个节点的带边权的树,定义\(xordist(u,v)\)为节点\(u\)到\(v\)的简单路径上所有边权值的异或和有\(q\)次询问,每次给出lrx求\(\sum_{i=l}^rxordist(i,x)\)的值Solution考试的时候脑子坏了对于一条......
  • 【省选联考2020】树 题解
    省选题解第一发~【省选联考2020】树我和这道题还挺有缘分的。有一次看大佬的省选游记(不知道是哪一年),然后提到有一道是01trie整体加一,当时我就印象深刻,然后在oiwiki上看了一下,心想这整体加一也只能从低位到高位维护01trie啊,又不能查询最大值,有什么卵用(划掉)。这是两周前的事......
  • 题解 [SDOI2016] 游戏
    可以看出来出题人很想出一道把李超和别的什么东西凑起来的题目,于是给了这么一个缝合怪。https://www.luogu.com.cn/problem/P4069符号有点混乱。比如箭头又可以表示路径又可以表示赋值,代入语境应该还是好理解的。看到\(a\timesdis+b\)就应激反应出来是李超了,看到\(s\to......
  • CF1884D Counting Rhyme 题解
    Problem-D-CodeforcesCountingRhyme-洛谷法1:我们之前肯定看过这样一道非常经典的题:求\(a_i\)中有多少对\((i,j)\),满足\(\gcd(a_i,a_j)=1\)\(n\leq10^6\)这题是莫反板子题,但显然可以不用莫反做。先不说这题怎么做,我们发现这道题和CF1884D的不同之处在......
  • [ABC334C] Socks 2 题解
    题目传送门一道贪心题。数量为\(2\)的袜子不用考虑,因为最好的情况就是相同颜色的配一对。我们只需要考虑那\(k\)种只有\(1\)个的袜子,如果\(k\)为偶数,答案为相邻两数之差之和;如果\(k\)为奇数,就枚举删掉一个数,让剩下的数按照\(k\)为偶数的情况做,最后取一个最小值。这......
  • [ABC334E] Christmas Color Grid 1 题解
    题目传送门一道dfs题。先统计出绿连通块数量,然后对于每个红色方块统计涂成绿色方块后会变成多少个连通块。正常涂成绿色后应该会增加一个大小为\(1\)的绿连通块,但若是有不同的绿连通块与其相邻,答案又会减少\(1\)。Code#include<bits/stdc++.h>constlonglongIMX=1......
  • CF1917F Construct Tree 题解
    Description给你一个数组\(l_1,l_2,\dots.l_n\)和一个数字\(d\)。问你是否能够构造一棵树满足以下条件:这棵树有\(n+1\)个点。第\(i\)条边的长度是\(l_i\)。树的直径是\(d\)。只需要判断是否有解即可。\(2\len\le2000,1\led\le2000,1\lel_i\led\)。Solutio......
  • 【题解】BZOJ 4403序列统计
    tg.BZOJ4403序列统计pj.BZOJ4403序列统计没啥用的题解\(QWQ\)——无脑思考首先要想怎么求单调不上升序列的个数,因为可能会有重复的数,所以不能直接用排列组合。那这道题怎么打呀?我不知道啊\(\dots\)\((~:\)因为原来是单调不下降序列,将第\(i\)位上的数加\(i\),于是......