题意:有N个大小各不相同的点,给定Q个询问,格式为q1,q2,A,表示区间q1~q2的最小值是A,问第一个与之前询问结果出现冲突的询问。

分析:

1、二分询问的标号mid,查询1~mid是否出现询问冲突。

2、用并查集判断是否冲突。

3、已知若一区间的最小值是A,A>B,那么若这个区间的某一子区间为B,那么一定是矛盾的。

4、因此将前mid个询问按A从大到小排序,先染色区间里A值较大的区间,若A值较小的区间完全在已染色的区间内,则一定矛盾。

5、此外,由于N值各不相同,所以不可能出现两个彼此无交集的区间A值相同---Find(lr) < rl。

6、将某一区间染色后,这一区间的所有点以这一区间第一个点的前一个点为父亲。

#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
const double eps = 1e-8;
inline int dcmp(double a, double b){
if(fabs(a - b) < eps) return 0;
return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 25000 + 10;
const int MAXT = 1000000 + 10;
using namespace std;
int N, Q;
int fa[MAXT];
struct Node{
int q1, q2, A;
void read(){
scanf("%d%d%d", &q1, &q2, &A);
}
bool operator < (const Node& rhs)const{
return A > rhs.A;
}
}num[MAXN], tmp[MAXN];
int Find(int x){
return fa[x] = (fa[x] == x) ? x : Find(fa[x]);
}
bool judge(int x){
for(int i = 0; i <= N; ++i) fa[i] = i;
for(int i = 1; i <= x; ++i){
tmp[i] = num[i];
}
sort(tmp + 1, tmp + x + 1);
for(int i = 1; i <= x;){
int ll, lr, rl, rr;
ll = rl = tmp[i].q1;
lr = rr = tmp[i].q2;
int j;
for(j = i + 1; j <= x && tmp[j].A == tmp[i].A; ++j){
ll = Min(ll, tmp[j].q1);
rl = Max(rl, tmp[j].q1);
lr = Min(lr, tmp[j].q2);
rr = Max(rr, tmp[j].q2);
}
i = j;
if(Find(lr) < rl) return false;
while(1){
int u = Find(rr);
if(u < ll) break;
fa[u] = ll - 1;
rr = u - 1;
}
}
return true;
}
int solve(){
int l = 1, r = Q;
while(l < r){
int mid = l + (r - l + 1) / 2;
if(judge(mid)) l = mid;
else r = mid - 1;
}
if(l == Q) return 0;
return l + 1;
}
int main(){
scanf("%d%d", &N, &Q);
for(int i = 1; i <= Q; ++i){
num[i].read();
}
printf("%d\n", solve());
return 0;
}

  

POJ - 3657 Haybale Guessing(二分+并查集)的更多相关文章

  1. POJ 3657 Haybale Guessing(区间染色 并查集)

    Haybale Guessing Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2384   Accepted: 645 D ...

  2. poj 2236:Wireless Network(并查集,提高题)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 16065   Accepted: 677 ...

  3. HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)

    HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...

  4. 洛谷P2498 [SDOI2012]拯救小云公主 【二分 + 并查集】

    题目 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1 ...

  5. 洛谷:P1783 海滩防御(二分+并查集 最短路 最小生成树)

    题意: 给定长度为N的海滩,然后有M做防御塔,给出每座塔的位置Xi,到海岸的距离Yi. 求防御塔上最小观测半径Ri,使得海滩被封锁. 思路:要使左边界和右边界连通. 很nice,可以二分+并查集做. ...

  6. POJ2349二分+并查集,类似最小树的贪心

    题意:       给你n个点,你的任务是构建一颗通讯树,然后给你一个s表示可以选出来s个点两两通讯不花钱,就是费用是0,其他的费用就是两点的距离,有个要求就是其他的费用中最大的那个最小. 思路:   ...

  7. poj 1182:食物链(种类并查集,食物链问题)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44168   Accepted: 12878 Description ...

  8. POJ 1456 Supermarket 区间问题并查集||贪心

    F - Supermarket Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  9. POJ 1182 食物链(种类并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 63592   Accepted: 18670 Description ...

随机推荐

  1. 005-PHP函数输出一行内容

    <?php function printBold($inputText) //定义function printBold() { print("<B>" . $in ...

  2. 初学者的困惑:OOP与一般编程的区别

    *在写<程序猿的思维修炼>随笔中,我们大概猜想到了,OOP的思想更趋于模块化,更独立,因此称为一个个对象,本次随笔将对OOP和一般编程的区别有更详细的解释 面向对象编程的含义: 面向对象编 ...

  3. java 根据值获取枚举对象

    关键方法: /** * 值映射为枚举 * * @param enumClass 枚举类 * @param value 枚举值 * @param method 取值方法 * @param <E&g ...

  4. Golang的运算符-算数运算符

    Golang的运算符-算数运算符 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.算术运算符概述 常见的算术运算符: +: 可表示正号,如",结果为"Jaso ...

  5. POJ 2309:BST lowbit

    BST Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9140   Accepted: 5580 Description C ...

  6. CentOS7 静默安装Oracle XE 11g

    Oracle XE简介 Oracle Database 11g 快捷版 (Oracle Database XE) 是一款基于 Oracle Database 11g 第 2 版代码库的小型入门级数据库 ...

  7. Percona-Toolkit 之 pt-kill 低效SQL

    [root@ tools]#vi ptkill_master.confuser=rootpassword=asd.123port=3306busy-time=5printkill /u01/soft/ ...

  8. ROS常用库(一) fake_localization

    wiki是最好的学习资料,以下直接参考了wiki官网.另外po出官网网址,建议英语较好的朋友之接看原版 http://wiki.ros.org/fake_localization 概述 fake_lo ...

  9. 如何通过 Python 和 OpenCV 实现目标数量监控?

    今天我们将利用python+OpenCV实现对视频中物体数量的监控,达到视频监控的效果,比如洗煤厂的监控水龙头的水柱颜色,当水柱为黑色的超过了一半,那么将说明过滤网发生了故障.当然不仅如此,我们看的是 ...

  10. 五十、在SAP程序中应用其他单元,INCLUDE的用法

    一.在SAP程序中写入以下代码 二.双击引用的单元,会弹出以下窗口 三.点击是 四.点击保存 五.保存在本地 六.此文件被包含进来 七.我们把在GET_DATA和SHOW_DATA写到INCLUDE里 ...