poj-3657 Haybale Guessing(二分答案+并查集)
http://poj.org/problem?id=3657
下方有中文版,不想看英文的可直接点这里看中文版题目
Description
The cows, who always have an inferiority complex about their intelligence, have a new guessing game to sharpen their brains.
A designated 'Hay Cow' hides behind the barn and creates N (1 ≤ N ≤ 1,000,000) uniquely-sized stacks (conveniently numbered 1..N) of hay bales, each with 1..1,000,000,000 bales of hay.
The other cows then ask the Hay Cow a series of Q (1 ≤ Q ≤ 25,000) questions about the the stacks, all having the same form:
What is the smallest number of bales of any stack in the range of stack numbers Ql..Qh (1 ≤ Ql ≤ N; Ql ≤ Qh ≤ N)?
The Hay Cow answers each of these queries with a single integer A whose truthfulness is not guaranteed.
Help the other cows determine if the answers given by the Hay Cow are self-consistent or if certain answers contradict others.
Input
* Line 1: Two space-separated integers: N and Q
* Lines 2..Q+1: Each line contains three space-separated integers that represent a single query and its reply: Ql, Qh, and A
Output
* Line 1: Print the single integer 0 if there are no inconsistencies among the replies (i.e., if there exists a valid realization of the hay stacks that agrees with all Q queries). Otherwise, print the index from 1..Q of the earliest query whose answer is inconsistent with the answers to the queries before it.
Sample Input
Sample Output
说明
The minimum number of bales in stacks 1..10 is 7, the minimum number of bales in stacks 5..19 is 7, the minimum number of bales in stacks 3..12 is 8, and the minimum number of bales in stacks 11..15 is 12.
Query 3 ("3 12 8") is the first that is inconsistent with those before it. From queries 1 and 2 and the fact that all hay stacks have a distinct number of bales, we deduce that one of stacks 5..10 must contain exactly 7 bales. However, this stack contradicts the answer to query 3.
中文版
题意:
给一段长度为n,每个位置上的数都不同的序列a[1..n]和q和问答,然后给出q个区间及其区间最小值,求出到第几个区间会出现矛盾
思路:
1.二分+线段树(暂时不会,以后填坑)
2.二分+并查集(并查集用来区间染色)//并查集有个经典用法--区间染色,所以用并查集维护
首先 如果我们想知道这头奶牛之前的奶牛回答的是不是错的怎么办呢?
把回答的A从大到小排个序。这里有几种矛盾的方式:
- 如果后面的区间完全被前面的区间包含,这是错的
- 如果有两个不相交的区间的A是一样的,这也是错的(题目保证没有两堆干草的数量是一样的)
注意取相同A的区间的时候不要超过当前二分的mid
以下题解部分参考于:https://blog.csdn.net/wang2147483647/article/details/60142150
由于每个位置的数唯一,对于两个区间[l,r]最小值为a、[L,R]最小值为A。
若区间[l,r]被区间[L,R]完全包含且a<A,此时存在矛盾且为唯一的矛盾。
则可以二分询问Q,判断1---tot内的询问是否合法。每次二分时,将1---tot之间的询问按照最小值从大到小排序(优先处理大数,以后判断时仅需判断小数所在的区间是否被大数所在区间包含)。
由于每个数唯一,对于每个最小值相同的区间,判断其交集是否为空或者是否在更大最小值的区间中,此时出现矛盾,继续二分。
若未出现矛盾,则将其并集染色(这样判断矛盾时若交集所在区间中无未染色区间,则交集在最小值更大的区间中(最小值从大到小排序,更大最小值的区间已被全部染色,若无未染色区间,则说明此区间在最小值更大区间中))。
染色若用线段树,则无优化下会超时,所以可用并查集处理染色:对于一段区间[l,r]若将其染色,则设fa[r]=l-1(不可为l,因为l也为已染色点,例如数据 1 2 1和1 2 2),代表[l,r]中的数已全部染色(从后向前找对于每一个区间中的点都可以直接跳到其父节点,因为该区间已被全部染色),则判断时若l>Find(r)则说明该区间中无未染色点。
代码如下:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <queue>
#include <set>
const int INF=0x3f3f3f3f;
using namespace std;
#define maxn 1000010 struct node{
int l;
int r;
int num;
}; int n,q;
int fa[maxn];
node a[maxn];
node tmp[maxn]; int Find(int x)
{
return x==fa[x]?x:fa[x]=Find(fa[x]);
} bool cmp(node a,node b)
{
return a.num>b.num;
} bool judge(int tot)
{
for(int i=;i<=n;i++)
fa[i]=i;
for(int i=;i<=tot;i++)
tmp[i]=a[i];
sort(tmp+,tmp++tot,cmp);
for(int i=,j;i<=tot;i=j+)
{
j=i;
int l=tmp[i].l;
int r=tmp[i].r;
int L=tmp[i].l;
int R=tmp[i].r;
while(j<tot&&tmp[j].num==tmp[j+].num)
{
j++;
l=max(l,tmp[j].l);//取交集
r=min(r,tmp[j].r);
L=min(L,tmp[j].l);//取并集
R=max(R,tmp[j].r);
}
if(l>r||l>Find(r))//为空或无未染色点
return ;
while(L<=R)
{
if(Find(R)==R)
{
fa[R]=Find(L-);//染色
R--;
}
else
R=fa[R];//直接跳转到其父节点
}
}
return ;
} int main()
{
scanf("%d %d",&n,&q);
for(int i=;i<=q;i++)
{
scanf("%d %d %d",&a[i].l,&a[i].r,&a[i].num);
}
int L=;
int R=q;
int ans=;
while(L<=R)
{
int mid=(L+R)/;
if(judge(mid))
L=mid+;
else
{
ans=mid;
R=mid-;
}
}
printf("%d\n",ans);
return ;
}
poj-3657 Haybale Guessing(二分答案+并查集)的更多相关文章
- [HNOI2006]公路修建问题 (二分答案,并查集)
题目链接 Solution 二分答案+并查集. 由于考虑到是要求花费的最小值,直接考虑到二分. 然后对于每一个二分出来的答案,模拟 \(Kruskal\) 的过程再做一遍连边. 同时用并查集维护联通块 ...
- POJ - 3657 Haybale Guessing(二分+并查集)
题意:有N个大小各不相同的点,给定Q个询问,格式为q1,q2,A,表示区间q1~q2的最小值是A,问第一个与之前询问结果出现冲突的询问. 分析: 1.二分询问的标号mid,查询1~mid是否出现询问冲 ...
- POJ 3657 Haybale Guessing(区间染色 并查集)
Haybale Guessing Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2384 Accepted: 645 D ...
- 洛谷P1991无线通讯网[kruskal | 二分答案 并查集]
题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...
- BZOJ 1196 [HNOI2006]公路修建问题(二分答案+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1196 [题目大意] 对于每条可能维修的公路可选择修一级公路或者二级公路,价值不同 要求 ...
- HDU-3081-Marriage Match 2(最大流, 二分答案, 并查集)
链接: https://vjudge.net/problem/HDU-3081 题意: Presumably, you all have known the question of stable ma ...
- [NOI2014] 魔法森林 (二分答案,并查集)
本思路仅供参考,数据强一点应该该会被卡. 本蒟蒻没有打 \(link\) - \(cut\) - \(tree\) . 而是用暴力水了过去. 具体思路很简单,先二分最少的 \(a_i\) , 再在 \ ...
- HNOI2006-公路修建问题(二分答案+并查集)
公路修建问题 OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织成立了,旨 ...
- BZOJ 1196 二分答案+并查集
http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题目大意:n个城市,m-1条路,每条路有一级公路和二级公路之分,你要造n-1条路,一级公路至少 ...
随机推荐
- 大数据高可用集群环境安装与配置(02)——配置ntp服务
NTP服务概述 NTP服务器[Network Time Protocol(NTP)]是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精 ...
- 基本pipline用法
#!groovynode { stage('代码获取') { checkout([$class: 'SubversionSCM', additionalCredentials: [], exclude ...
- 【2017西安邀请赛:A】XOR(线段树+线性基)
前言:虽然已经有很多题解了,但是还是想按自己的理解写一篇. 思路:首先分析题目 一.区间操作 —— 线段树 二.异或操作 —— 线性基 这个两个不难想,关键是下一步的技巧 “或”运算 就是两个数的二进 ...
- C语言I作业博客07
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/9935 我在这个课程的目 ...
- Centos7开机启动自己的脚本
1. 自己新建一个脚本,如centnet-service.sh 经过后面的几个步骤后,这个脚本在开机的时候会执行,在这个脚本里面可以写你开机的时候想执行的命令,如启动tomcat,oracle等服务. ...
- VUE- 访问服务器端数据 Vue-resource
VUE- 访问服务器端数据 Vue-resource 1. 安装 vue-resource cnpm install vue-resource --save 安装完毕后,在main.js中导入,如下所 ...
- 操作实践:maven工程查找工程中多余的jar包
声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 版本迭代过程中对jar的依赖可能会产生变化,一些本不必再依赖的jar包可以因为没有清除而依然留在版本的发布 ...
- Java中包的基本管理与编译
在写程序的过程中,总会出现代码编译过关,但是项目偏偏报错的情况,遇到几种情况,都在此一一记录,希望以后少走弯路. 1.添加jsp文件的时候,会报错 Multiple annotations found ...
- runlevel 运行级别
linux启动过程 关于Ubuntu 12.04修改默认运行级别,启动字符界面的个人理解 网上通常的做法是:(亲自试验,不管用),如果想直接操作请看绿色字体部分 (1)第一种方法: 由于Red ...
- 17. docker 网络 host 和 none
1.none network 创建一个 none 网络的 container test1 docker run --name test1 --network none busybox /bin/sh ...