Description

为了提高智商,锻炼思维能力,奶牛设计了一个猜数游戏。游戏开始前,贝西会在牛棚后面摆上N个数字。所有数字排成一条直线,按次序从1到N编号。每个数字在1到10^9之间,没有两个数字是一样的。

游戏开始后,其他奶牛将会轮流询问贝西Q个问题,每个问题的格式都是一样的:

“位置在Ql到Qr的数字中,最小的数字是多少?”

对每个问题,贝西都会回答一个数字A,不过,她的回答可能是不正确的。请你帮助其他奶牛判断一下,贝西从哪里开始已经出现矛盾了。

Input Format

第一行:两个用空格分开的整数:N和Q,1 ≤ N ≤ 106,1 ≤ Q ≤ 25000

第二行到第Q + 1行:每行三个用空格分开的整数,Ql,Qr和A,表示一个查询,1 ≤ Ql ≤ Qh ≤ N

Output Format

第一行:如果完全没有矛盾,输出0,否则输出最先造成矛盾的查询编号

------------------------------------------------------------------

正解 = 找规律+并查集

Orz 神大胖指导。
正如题目所说,这 n 个数中不会有重复的,
   因此对于相同的值的询问如果不存在交集便是一个矛盾,
   如果存在交集,那这个数必然就在这个区间中,
   但如果之前的询问已覆盖了这个区间
           A:如果询问值比该数小,这是种合法情况,
           因为之前的询问还能覆盖该区间外的地方,
           B:如果询问值比该数大,显然矛盾.
得到一个判断一段查询是否合法的算法:
   将所给的询问按数值排序(从大到小),
   对于同个数值进行合并操作, 
   如不存在交集 =>存在矛盾
   否则对询问交集中是否已被在比该数值大的值所覆盖,
   由于已经按从小到大排过序,如果交集中有值必然比该数值大
   所以,如果区间中不存在未覆盖的位置 = > 存在矛盾
   否则说明至此未产生矛盾:
   对于该同数值的询问的并集中未覆盖的部分进行覆盖
如果进行完所有操作未发现矛盾,则该区间不存在矛盾.
由于仅对区间中的未覆盖的位置进行查询及修改,可以用并查集进行加速.
在上述算法的基础上,我们可以对矛盾区间进行二分查找,不难得到答案.
Ps.笔者打的递归并查集爆(W)栈(T)了(F),不能忍,该模拟栈了- =.
代码如下:

 #include<cstring>
#include<algorithm>
#include<cstdio>
#include<string>
#include<iostream>
#include<queue>
#define INF 99999999
#define min(X,Y) if(X>Y) X=Y
#define max(X,Y) if(X<Y) X=Y
#define N 1000122
#define M 25022
using namespace std;
int f[N],n,Q,mid,ans;
int q[N];
struct Query{
int l,r,v;
}a[M],b[M];
bool cmp(const Query&X,const Query&Y){
return X.v>Y.v;
}
int find(int now){
int tail=;
q[++tail]=now;
while(){
now=q[tail];
if(now==f[now]) break;
q[++tail]=f[now];
}
while(tail) f[q[tail--]]=now;
return now;
}
bool check(){
for(int i=;i<=n+;i++) f[i]=i;
memcpy(b,a,sizeof(Query)*(mid+));
sort(b+,b++mid,cmp);
for(int i=;i<=mid;i++){
int Min=b[i].l,Max=b[i].r;
int L=b[i].l ,R=b[i].r;
for(;i<=mid&&b[i].v==b[i+].v;){
++i;
min(Min,b[i].l);
max(Max,b[i].r);
if(L>b[i].r||R<b[i].l) return false ;
max(L,b[i].l);
min(R,b[i].r);
}
if(find(L)>R) return false ;
for(int k=find(Min);k<=Max;k=f[k])
f[k]=find(k+);
}
return true;
}
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].v);
int Le=,Ri=Q;
while(Ri>=Le){
mid=(Le+Ri)>>;
if(!check()){
Ri=mid-;
ans=mid;
} else Le=mid+;
}
printf("%d",ans);
}

usaco 猜数游戏的更多相关文章

  1. 【BZOJ 1594】 [Usaco2008 Jan]猜数游戏 (二分+并查集)

    1594: [Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面 ...

  2. (一)Python之猜数游戏

    猜数游戏由简如深的编码学习过程: 3次机会: print('------------------我爱鱼C工作室------------------')count=0while count < 3 ...

  3. 猜数游戏-flag的运用

    package my;import java.util.Scanner;public class MyJava {        public static void main(String[] ar ...

  4. Java课程设计——猜数游戏(201521123111 陈伟泽)

    Java课程设计--猜数游戏(201521123111 陈伟泽) 1.团队课程设计博客链接 博客作业--猜数游戏 2.个人负责模块或任务说明 Answer:一些基础界面的构造,排行榜的构造,用文件录入 ...

  5. JAVA课程设计 猜数游戏 团队

    团队名称,成员介绍 名称: 猜数游戏 成员: 网络1514 201521123086 周颖强 网络1514 201521123087蒋勃超 项目git地址 git.oschina.net/jbc113 ...

  6. BZOJ 2222: [Cqoi2006]猜数游戏【神奇的做法,傻逼题,猜结论】

    2222: [Cqoi2006]猜数游戏 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 604  Solved: 260[Submit][Status ...

  7. 从scratch到python——猜数游戏

    ` 之前讲解了从scratch到python,基于python turtle库的实现,讲解了用scratch和python turtle绘图的实现,以及让小猫动起来和当角色被单击的例子. 本节课讲继续 ...

  8. VBS猜数游戏

    VBS 猜数游戏 2018-11-09  21:19:11 by xutao msgbox "The Swami" ,,"Game" msgbox " ...

  9. 【BZOJ1594】[Usaco2008 Jan]猜数游戏 二分答案+并查集

    [BZOJ1594][Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在 ...

随机推荐

  1. python 自动化之路 day 02

    本节内容: 列表.元组操作 字符串操作 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 1 names = ['Alex',&qu ...

  2. 常用命令ls cd cp mv touch mkdir pwd rm cut sort tr more less

    ls  -ldhtai 显示目录下面的文件 ls -l 显示详细信息 ls -d 显示当前目录 ls -t 以时间先后顺序显示 ls -a 列出所有文件包括隐藏文件 ls -i 显示文件的inode号 ...

  3. 使用Fiddler提高前端工作效率 (实例篇)

    上篇中,我们对Fiddler Web Debugger有了简单的接触,也许你已经开始在用Fiddler进行HTTP相关的调试,在这一篇,我们将通过一个实例了解Fiddler的神奇魔法. 在我们前端开发 ...

  4. 商务通简单弹窗样式 V1.0

    代码为: document.writeln('<style>*{margin:0; padding:0;}</style>');//创建中间弹框    document.wri ...

  5. Delphi实用小function

    Write Log // strLog : the log content need write to log file; // strFile: the compliete file path(in ...

  6. hadoop1中partition和combiner作用

    ---恢复内容开始--- 1.解析Partiton 把map任务的输出的中间结果按照key的范围进行划分成r份,r代表reduce任务的个数.hadoop默认有个类HashPartition实现分区, ...

  7. 远程连接sql server 数据库的方法

    今天找了半天,终于解决了如何从本地连接到远程sql server服务器的方法. 1.首先确保打开远程服务器的sql server配置管理器,确保TCP/IP协议开启 2.WebConfig的连接字符格 ...

  8. 【转】mybatis在xml文件中处理大于号小于号的方法

    http://blog.csdn.net/zheng0518/article/details/10449549 第一种方法: 用了转义字符把>和<替换掉,然后就没有问题了. SELECT ...

  9. Mac下获取AppStore安装包文件路径

    通过远在大洋彼岸的苹果服务器下载东西,确实有够慢啊!AppStore更甚:甚至都经常提示连不上服务器,而有些软件呢,还必须从AppStore下载安装,所以没办法,谁让上了苹果的贼船呢!公司的网速更是不 ...

  10. Cloud Test 在手,宕机时让您不再措手不及

    1月28日,Github 上午 10:04 分宕机了,导致全球各地的用户不能访问.官方回复可能是网络中断引起的,到 10:28 分已经可以正常访问. 对于互联网公司来说,一旦宕机就会措手不及,如何才能 ...