题意:有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. HihoCoder第四周:Trie图

    第四周的题目是前两周的综合,综合在一个是KMP算法的思想,一个是树的这么一个数据结构. 题目 : Trie图 输入 每个输入文件有且仅有一组测试数据. 每个测试数据的第一行为一个整数N,表示河蟹词典的 ...

  2. 图形与动画在Android中的实现

    public class MyView extends View{ Bitmap myBitmap; Paint paint; public MyView(Context context, Attri ...

  3. PHP mb_substr mbstring 函数

    定义和用法 mb_substr - 获取部分字符串 版本支持 PHP4 PHP5 PHP7 支持 支持 支持 5.4.8 length 传入 NULL,则从 start 提取到字符串的结尾处. 在之前 ...

  4. 063、Java中输出信息

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  5. leetcode1 twoSum

    """ Given an array of integers, return indices of the two numbers such that they add ...

  6. Python中语法糖及带参语法糖

    在python中,@符号常被称作语法糖(装饰器),在某函数定义时,用以包装该函数,以达到截取,控制该函数的目的. def d(f): print('d...') k=f #此处保留了传进来的原函数 f ...

  7. 整合 nginx php-fpm

    start 继上一篇 整合两个images  完成 LNMP github  https://github.com/shiphp/nginx-env     稍加修改 vim   dockerfile ...

  8. Golang函数-函数的基本概念

    Golang函数-函数的基本概念 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数的概述 1>.函数定义语法格式 Go语言函数定义格式如下: func 函数名( 函数参 ...

  9. P1055 集体照

    P1055 集体照 转跳点:

  10. 通过html5 touch事件封装手势识别组件

    html5移动端新增了touchstart,touchmove,touchend事件,利用这3个事件,判断手指的点击和划动轨迹,我们可以封装各种手势的识别功能, 这3个事件和pc端的mousedown ...