题目描述
LYK在玩猜数字游戏。
总共有n个互不相同的正整数,LYK每次猜一段区间的最小值。形如[li,ri]这段区间的数字的最小值一定等于xi。
我们总能构造出一种方案使得LYK满意。直到…… LYK自己猜的就是矛盾的!
例如LYK猜[1,3]的最小值是2,[1,4]的最小值是3,这显然就是矛盾的。
你需要告诉LYK,它第几次猜数字开始就已经矛盾了。

输入格式(number.in)
第一行两个数n和T,表示有n个数字,LYK猜了T次。
接下来T行,每行三个数分别表示li,ri和xi。

输出格式(number.out)
输出一个数表示第几次开始出现矛盾,如果一直没出现矛盾输出T+1。

输入样例
20 4
1 10 7
5 19 7
3 12 8
1 20 1

输出样例
3

数据范围
对于50%的数据n<=8,T<=10。
对于80%的数据n<=1000,T<=1000。
对于100%的数据1<=n,T<=1000000,1<=li<=ri<=n,1<=xi<=n(但并不保证一开始的所有数都是1~n的)。

Hint
建议使用读入优化
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
}

分析:有点难度的一道题.

总是感觉题意自相矛盾,打的50分暴力只得了40分?最后看数据n=8, 1 8 2这种猜测竟然合法!题目中明明说了每个数字都是正整数并且互不相同,虽然最后说了并不保证一开始的所有数都是1~n的,但我并不明白这前后是啥意思.

40分暴力根据题目意思来就好了,相当于是一个1~n的全排列,每次判断这个排列到几个猜测就不合法了,记录下最大的就是答案.生成全排列可以用STL中的next_permutation.

100分的做法比较神,由于每个区间只能知道它的最小值,并不知道它在哪,其它的值是什么.现在要确定的就是怎么样才能判断一次猜测是不合法的.从题目给的样例可以看出,如果一个x较小的区间被x较大的区间给完全覆盖住了,那么这就是不合法的.根据这种判断方法,可以先对所有区间按照x从大到小排序,看这个区间有没有被之前的区间给覆盖.这就有一个问题:我不知道这个区间是第几次询问,那么二分第k次出现询问,把第一个到第k个区间排序就行了.

进行覆盖操作肯定不能一个一个暴力覆盖,可以用线段树来维护,但是会T掉两个点,正解是并查集,维护每个点能延伸到最右边的哪个点,判断是否大于当前区间的右端点.对于许多个x值相等的区间,可以证明的是最小值一定在它们的交集中,因为每个数都是正整数并且互不相等,所以只需要关注是否交集被完全覆盖了即可.如果x值一定的区间只有一个就判断这个区间是否被完整覆盖即可.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n, T, ans, fa[]; struct node
{
int l, r, x;
}p[],e[]; bool cmp(node a, node b)
{
return a.x > b.x;
} int find(int x)
{
if (x == fa[x])
return x;
return fa[x] = find(fa[x]);
} bool check(int k)
{
for (int i = ; i <= n + ; i++)
fa[i] = i;
for (int i = ; i <= k; i++)
p[i] = e[i];
sort(p + , p + + k,cmp);
int lmax = p[].l, lmin = p[].l, rmax = p[].r, rmin = p[].r;
for (int i = ; i <= k; i++)
{
if (p[i].x < p[i - ].x)
{
if (find(lmax) > rmin)
return true;
for (int j = find(lmin); j <= rmax; j++)
fa[find(j)] = find(rmax + );
lmin = lmax = p[i].l;
rmin = rmax = p[i].r;
}
else
{
lmin = min(lmin, p[i].l);
lmax = max(lmax, p[i].l);
rmin = min(rmin, p[i].r);
rmax = max(rmax, p[i].r);
if (find(lmax) > rmin)
return true;
}
}
if (find(lmax) > rmin)
return true;
return false;
} int main()
{
scanf("%d%d", &n, &T);
for (int i = ; i <= T; i++)
scanf("%d%d%d", &e[i].l, &e[i].r, &e[i].x);
int l = , r = T;
ans = T + ;
while (l <= r)
{
int mid = (l + r) >> ;
if (check(mid))
{
ans = mid;
r = mid - ;
}
else
l = mid + ;
}
printf("%d\n", ans); return ;
}

noip模拟赛 猜数字的更多相关文章

  1. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...

  2. Nescafe #29 NOIP模拟赛

    Nescafe #29 NOIP模拟赛 不知道这种题发出来算不算侵权...毕竟有的题在$bz$上是权限题,但是在$vijos$似乎又有原题...如果这算是侵权的话请联系我,我会尽快删除,谢谢~ 今天开 ...

  3. 2016-06-19 NOIP模拟赛

          2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...

  4. 【HHHOJ】NOIP模拟赛 玖 解题报告

    点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...

  5. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  6. 2014-10-31 NOIP模拟赛

        10.30 NOIp  模拟赛   时间 空间 测试点 评测方式 挖掘机(dig.*) 1s 256M 10 传统 黑红树(brtree.*) 2s 256M 10 传统 藏宝图(treas. ...

  7. NOIP模拟赛 篮球比赛2

    篮球比赛2(basketball2.*) 由于Czhou举行了众多noip模拟赛,也导致放学后篮球比赛次数急剧增加.神牛们身体素质突飞猛进,并且球技不断精进.这引起了体育老师彩哥的注意,为了给校篮球队 ...

  8. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  9. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

随机推荐

  1. bzoj 1741: [Usaco2005 nov]Asteroids 穿越小行星群【最大点覆盖】

    二分图最大点覆盖模型,因为对于一个点(x,y)显然只要选x或者y就好了,于是连边,跑最大匹配=最大点覆盖(不会证) #include<iostream> #include<cstdi ...

  2. Web Api之Cors跨域(干货)---大家一定要看清我写的内容哦

    Web Api之Cors跨域 要想跨域需要准备一下几步骤 1.创建WebAPI(请按照图片先后顺序来) 2.进入NuGet包管理搜 Microsoft.AspNet.WebApi.Cors 进行下载 ...

  3. 【懒人专用系列】Xind2TestCase的初步探坑

    公司最近说要弄Xind2TestCase,让我们组先试用一下 解释:https://testerhome.com/topics/17554 github项目:https://github.com/zh ...

  4. [ZJOI2008]杀蚂蚁

    题意翻译 注意在(0,0)已经有蚂蚁的时候是不会生成新蚂蚁的 还有如果有蚂蚁扛着蛋糕,但是不在某个炮的范围内,炮仍然会打最近的蚂蚁 题目描述 最近,佳佳迷上了一款好玩的小游戏:antbuster. 游 ...

  5. Http协议对格式、请求头、方法

    ######### #概览 ######### 超文本传输协议(Http: Hyper Text Transfer Protocol) :用于发送WWW方式的数据.采用TCP/IP协议,是一个无状态协 ...

  6. 【转】数据倾斜是多么痛?spark作业/面试/调优必备秘籍

    原博文出自于: http://sanwen.net/a/gqkotbo.html 感谢! 来源:数盟 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性 ...

  7. Jayway JsonPath实例

    开源:https://github.com/json-path/JsonPath 引入库: <dependency> <groupId>com.jayway.jsonpath& ...

  8. esp8266 SOC方案经过半年沉淀之后再度重启二

    2018-08-2014:16:10 以下是输出控制 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);      GPIO_OUTPUT_SET ...

  9. 初始MongoDB------将MongoDB创建为Windows服务

    上一遍我写的是关于基本的MongoDB的安装,可能不是很详细,也写得很不好,不过这次我们会详细的说说,如果将MongoDB部署在你的Windows电脑上. 1.配置环境变量 如果每次都要在CMD进入M ...

  10. Laravel 网站项目目录结构规划

    最近在用Laravel这个PHP框架搭网站,大致了解这个框架的目录结构之后感觉学到了不少东西. 首先安装好包管理器: PHP部分当然用composer,安装在全局目录下方便一点. 前端部分,我没有选择 ...