Description

隔壁村的阿黑的Dog没有跑, 但Dog已经15岁了, 相当于人类达到了79岁.

为了防止Dog患上犬类认知障碍 (Canine cognitive dysfunction, CCD), 阿黑决定陪Dog玩猜数游戏.

游戏开始前,阿黑会在Dog后面摆上\(N\)个数字. 所有数字排成一条直线,按次序从\(1\)到\(N\)编号,每个位置的数字均不同.

游戏开始后,Dog将会询问阿黑\(Q\)个问题,每个问题的格式都是一样的:

"位置在\(l\)到\(r\)的数字中,最小的数字是多少?"

对每个问题,阿黑都会回答一个数字\(A\). 但阿黑的回答可能不正确.

年迈的Dog想知道阿黑从哪里开始已经出现了矛盾, 可惜的是, Dog其实已经患上了严重的犬类认知障碍, 于是这就成了一道机考题.

Input

输入的第一行有两个用空格分开的整数\(N\)和\(Q\), 含义如上.

接下来\(Q\)行, 每行有三个用空格分开的整数\(l, r, A\), 含义如上.

Output

如果完全没有矛盾,输出\(0\),否则输出最先造成矛盾的问题编号

Sample Input

20 4

1 10 7

5 19 7

3 12 8

11 15 12

Sample Output

3

这道题我们可以这样想,如果我们按照询问数值的某种顺序来排序,是不是会好做一点。这个时候我们只要套上一个二分,一样可以求出最小是哪个询问不满足。

如果我们从小到大排序,由于每个位置的值不同,数值相同的区间要两两相交才行。并且如果这些区间的并中包含之前某个数值区间的交也不行(稍微YY下吧)。这个算法可以用set写,但是很复杂啊。

但是我们可以从大到小排序,过程刚好相反。数值相同的区间要两两相交才行,并且这些区间的交不能包含别的区间。这个我们可以用并查集实现。一段区间表示一个集合,集合的代表元便是区间右端点\(+1\)(方便实现)。

具体实现看代码:

#include<set>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
using namespace std; #define inf (1<<29)
#define maxn (1000010)
int ans,N,Q,father[maxn],tmp[maxn],cnt;
struct node
{
int L,R,V,id;
friend inline bool operator <(const node &a,const node &b) { return a.V > b.V; }
inline void read(int i) { scanf("%d %d %d",&L,&R,&V); id = i; }
}query[maxn]; inline int find(int x)
{
for (;x != father[x];x = father[x]) tmp[++cnt] = x;
while (cnt) father[tmp[cnt--]] = x;
return x;
} inline bool check(int mid)
{
for (int i = 1;i <= N+1;++i) father[i] = i;
for (int i = 1,j;i <= Q;i = j)
{
int jl = -inf,jr = inf,bl = inf,br = -inf;
for (j = i;j <= Q&&query[j].V == query[i].V;++j)
{
if (query[j].id > mid) continue;
jl = max(jl,query[j].L); bl = min(bl,query[j].L);
jr = min(jr,query[j].R); br = max(br,query[j].R);
if (jl > jr) return false;
}
if (jl == -inf) continue;
if (find(jl)-1 >= jr) return false;
int f = find(br+1);
for (int k = find(bl);k <= br;++k) father[k] = f;
}
return true;
} inline void work()
{
int l = 1,r = Q,mid;
while (l <= r)
{
mid = (l+r) >> 1;
if (check(mid)) l = mid + 1;
else r = mid - 1,ans = mid;
}
} int main()
{
freopen("1586.in","r",stdin);
freopen("1586.out","w",stdout);
scanf("%d %d",&N,&Q);
for (int i = 1;i <= Q;++i) query[i].read(i);
sort(query+1,query+Q+1);
work(); printf("%d",ans);
fclose(stdin); fclose(stdout);
return 0;
}

sjtu1586 Dog的更多相关文章

  1. [ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG

    引言:硬件中的看门狗,不是门卫的意思,而是一只很凶的狗!如果你不按时喂它,它就会让系统重启!这反而是我们想要的功能~ 1.看门狗概述 看门狗定时器(WDT,Watch Dog Timer)是单片机的一 ...

  2. 斑点检测(LoG,DoG)(下)

    斑点检测(LoG,DoG)(下) LoG, DoG, 尺度归一化 上篇文章斑点检测(LoG,DoG)(上)介绍了基于二阶导数过零点的边缘检测方法,现在我们要探讨的是斑点检测.在边缘检测中,寻找的是二阶 ...

  3. 斑点检测(LoG,DoG) [上]

    斑点检测(LoG,DoG) [上] 维基百科,LoG,DoG,DoH 在计算机视觉中,斑点检测是指在数字图像中找出和周围区域特性不同的区域,这些特性包括光照或颜色等.一般图像中斑点区域的像素特性相似甚 ...

  4. ural 1246. Tethered Dog

    1246. Tethered Dog Time limit: 1.0 secondMemory limit: 64 MB A dog is tethered to a pole with a rope ...

  5. Cat VS Dog

    Cat VS Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)Total ...

  6. DoG 、Laplacian、图像金字塔详解

    DoG(Difference of Gaussian) DoG (Difference of Gaussian)是灰度图像增强和角点检测的方法,其做法较简单,证明较复杂,具体讲解如下: Differe ...

  7. HDU 3289 Cat VS Dog (二分匹配 求 最大独立集)

    题意:每个人有喜欢的猫和不喜欢的狗.留下他喜欢的猫他就高心,否则不高心.问最后最多有几个人高心. 思路:二分图求最大匹配 #include<cstdio> #include<cstr ...

  8. 编写一个Animal类,具有属性:种类;具有功能:吃、睡。定义其子类Fish 和Dog,定义主类E,在其main方法中分别创建其对象并测试对象的特性。

    package animal; public class Animal { //成员属性 private String kind; public String getKind() { return k ...

  9. SIFT算法:DoG尺度空间生产

    SIFT算法:DoG尺度空间生产  SIFT算法:KeyPoint找寻.定位与优化 SIFT算法:确定特征点方向  SIFT算法:特征描述子 目录: 1.高斯尺度空间(GSS - Gauss Scal ...

随机推荐

  1. Python 基础【第十篇】内置类型

    一.integral 类型 Python提供了两种integral类型,即int(整数)与bool(布尔值). 1.1.整数 整数的相关运算符.函数.数据类型转换 1.1.1.整数的运算符 前面已经讲 ...

  2. show status详解

    Aborted_clients 某种原因客户程序不能正常关闭连接而导致失败的连接的数量.没有正常关闭 Aborted_connects 指出试图连接到MYSQL的失败的次数.这种情况在客户尝试用错误的 ...

  3. 20150503-struts2入门-标签

    一.几个标签介绍 1.property标签 property标签用于输出指定值: <s:set name="name" value="'kk'" /> ...

  4. Sqlserver 理解子查询

    理解子查询: 理解子查询: 多表连接查询往往也可以用子查询进行替代 子查询本质是嵌套进其他 select update insert Delete 语句的一个被限制的select语句,在子查询中,只有 ...

  5. Microsoft Word 的键盘快捷方式

    Microsoft Word 的键盘快捷方式 全部显示 全部隐藏 本帮助文章中描述的键盘快捷方式适用于美式键盘布局.其他键盘布局的键可能与美式键盘上的键 不完全对应. 注释   本文不介绍如何为宏或自 ...

  6. Hibernate+struts+JqueryAjax+jSON实现无刷新三级联动

    看网上JqueryAjax三级联动的例子讲不是很全,代码也给的不是很全,给初学者带来一定的难度.小弟自己写了一个,可能有些地方不是很好,希望大家能够提出建议. 用的是Hibernate+struts2 ...

  7. 敌情篇 ——DDoS攻击原理

    敌情篇 ——DDoS攻击原理 DDoS攻击基础 DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是 ...

  8. 用法简单的图片和视频播放的框架Demo

    最近在恶补自己不足的基础知识,偶然在一个QQ群里看到作为同行业的大神们在开源自己的代码.并且在炫耀说让我们找Bug,于是出于好奇就看了下,点开了一个关于图片和视频播放的Demo.也就是接下来我要说的这 ...

  9. 第四篇、CSS选择器

    <html> <head> <meta charset="UTF-8"> <title>CSS选择器</title> & ...

  10. 学习之spring注解DI疑惑

    接口定义 package com; public interface IPaly { void say(); } 接口实现类 package com; import org.springframewo ...