P2898 [USACO08JAN] Haybale Guessing G 题解
前置知识
解法
对条件的合法性判断其他题解已经讲得很明白了,这里不再赘述。这里主要讲一下用并查集实现黑白染色问题。
以下内容称被覆盖为黑色,不被覆盖为白色。
本题因为是单向染色,即从白到黑,故可类似 luogu P1840 Color the Axis 和 D 的并查集或线段树做法;如果是双向染色,则需要 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;
}
P2898 [USACO08JAN] Haybale Guessing G 题解的更多相关文章
- 题解—P2898 [USACO08JAN]Haybale Guessing G
pre 首先注意一下翻译里面并没有提到的一点,也是让我没看懂样例的一点,就是这个长度为 \(n\) 的数组里面的数各不相同. 有很多人用并查集写的这道题,题解里面也有一些用线段树写的,不过我认为我的做 ...
- 洛谷 P2898 [USACO08JAN]haybale猜测Haybale Guessing 解题报告
[USACO08JAN]haybale猜测Haybale Guessing 题目描述 给一段长度为\(n\),每个位置上的数都不同的序列\(a[1\dots n]\)和\(q\)和问答,每个问答是\( ...
- [USACO08JAN]Haybale Guessing(LuoguP2898)
The cows, who always have an inferiority complex about their intelligence, have a new guessing game ...
- POJ 3657 Haybale Guessing(区间染色 并查集)
Haybale Guessing Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2384 Accepted: 645 D ...
- Haybale Guessing
Haybale Guessing Time Limit: 1000MS Memory Limit: 65536K Description The cows, who always ha ...
- 洛谷P3104 Counting Friends G 题解
题目 [USACO14MAR]Counting Friends G 题解 这道题我们可以将 \((n+1)\) 个边依次去掉,然后分别判断去掉后是否能满足.注意到一点, \(n\) 个奶牛的朋友之和必 ...
- 洛谷P2115 Sabotage G 题解
题目 [USACO14MAR]Sabotage G 题解 本蒟蒻又来了,这道题可以用二分答案来解决.我们可以设答案最小平均产奶量为 \(x \ (x \in[1,10000])\) .然后二分搜索 \ ...
- [USACO08JAN]haybale猜测Haybale Guessing
题目描述 The cows, who always have an inferiority complex about their intelligence, have a new guessing ...
- 【[USACO08JAN]haybale猜测Haybale Guessing】
抄题解.jpg 完全完全不会啊,这道题简直太神了 不过抄题解可真开心 首先这道题目保证了每一个位置上的数都是不同的,那么就能得到第一种判断不合法的方式 如果两个区间的最小值一样,但是两个区间的交集为空 ...
- [USACO 08JAN]Haybale Guessing
Description The cows, who always have an inferiority complex about their intelligence, have a new gu ...
随机推荐
- 小白学标准库之反射 reflect
1. 反射简介 反射是 元编程 概念下的一种形式,它在运行时操作不同类型的对象,检查对象的类型,大小等信息,对于没有源代码的包反射尤其有用. 设想一个场景,读取一个包中变量 a 的类型,并打印该类型的 ...
- Java标签在循环中的使用
定义 标签,类似--label1: 放在循环外部,用于内部多重循环语句的跳出 例子 public static void main(String[] args) { Scanner sc = new ...
- 基于React开发的chatgpt网页版(仿chatgpt)
在浏览github的时候发现了一个好玩的项目本项目,是github大神Yidadaa开发的chatgpt网页版,该开源项目是跨平台的,Web / PWA / Linux / Win / MacOS都可 ...
- 【转帖】读懂什么是RDMA
一.什么是RDMA1.RDMA主要体现 2.如何理解RDMA和TCP技术的区别?3.使用RDMA的好处包括: 二.什么是RoCE?1. RDMA协议包含:Infiniband(IB)2. 为什 ...
- 兼容微信支付宝抖音小程序的工具推荐!还能将小程序搬到自己的app里面
事情的起因是这样的. 之前在微信.支付宝和抖音开放平台都上架了自己的小程序,虽然几个平台有自己的开发标准,但是都是基于 JavaScript 这种已经被广泛使用的编程语言进行开发的,对于开发者而言学习 ...
- TypeScript中的元组 Tuple
元组类型 // 元组类型:表示一个已知元素数量和类型的数组,各元素的类型不必相同 let undata: [string, '男'| '女']; //已知数量是两个.类型分别是字符串和男或者女 und ...
- 基于spring security创建基本项目框架
SpringBoot建项目步骤 建表 新建项目 (package name可以自定义,整个项目只能在该包下) 选择可能有到的依赖 (别忘了勾选SQL中的Mybatis Framework,创建项目 如 ...
- 【JS 逆向百例】拉勾网爬虫,traceparent、__lg_stoken__、X-S-HEADER 等参数分析
关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...
- windows幻灯片壁纸
设置为10秒 win+r输入regedit 查找路径 HKEY_CURRENT_USER\Control Panel\Personalization\Desktop Slideshow 修改inter ...
- TienChin 活动管理-修改活动
后端 ChannelController.java @PreAuthorize("hasPermission('tienchin:channel:edit')") @GetMapp ...