【bzoj1594-猜数游戏】线段树
题解:
矛盾只有两种情况:
一.先前确定了x在区间(l,r),但是现在发现x在区间(l1,r1),并且两个区间不相交。
二.一个区间的最小值是x,这个区间中有一个子区间的最小值比x更小。
首先可以明确,对于每个x,我们可以不断地缩小x的范围(取区间的交集)。
那就先处理第一种矛盾,假设第一种矛盾第一次出现是在信息i。
那么我们就在信息1~i中寻找是否有第二种矛盾(此时保证了1~i中不会有第一种矛盾)。
每个信息有l,r,d三个值,我们按照d排序。那就在扫到下面那个区间的时候,我们一定已经有了上面的区间。
然后我们在线段树里面看红色的这个区间是否已经被完整地覆盖了。
线段树每个节点维护覆盖这个节点的最前面一个信息(因为题目要求最前的信息)。
如果红色区间被多个区间加在一起完整覆盖,那我们要去这多个区间的信息的max值(必须等到它也出现了才能完整覆盖)
最后维护一下ans。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<ctime>
#include<queue>
#include<algorithm>
using namespace std; const int N=,INF=(int)1e9;
struct node{int l,r,lc,rc,id,lazy;}t[*N];
struct nod{int d,id;}p[N];
struct nd{int l,r,d,id;}q[N];
int n,m,tl,L[N],R[N]; bool cmp_nod(nod x,nod y){return x.d<y.d;}
bool cmp_nd(nd x,nd y)
{
if(x.d!=y.d) return x.d>y.d;
return x.id<y.id;
}
int minn(int x,int y){return x<y ? x:y;}
int maxx(int x,int y){return x>y ? x:y;} int buildtree(int l,int r)
{
int x=++tl;
t[x].l=l;t[x].r=r;
t[x].lc=t[x].rc=;
t[x].id=INF;t[x].lazy=INF;
if(l<r)
{
int mid=(l+r)/;
t[x].lc=buildtree(l,mid);
t[x].rc=buildtree(mid+,r);
}
return x;
} void upd(int x)
{
if(t[x].lazy==INF) return ;
int id=t[x].lazy,lc=t[x].lc,rc=t[x].rc;
t[x].lazy=INF;
t[x].id=minn(t[x].id,id);
if(lc) t[lc].lazy=minn(t[lc].lazy,id);
if(rc) t[rc].lazy=minn(t[rc].lazy,id);
} void change(int x,int l,int r,int id)
{
upd(x);
if(t[x].l==l && t[x].r==r)
{
t[x].lazy=minn(t[x].lazy,id);
upd(x);
return ;
}
int lc=t[x].lc,rc=t[x].rc,mid=(t[x].l+t[x].r)/;
if(r<=mid) change(lc,l,r,id);
else if(l>mid) change(rc,l,r,id);
else
{
change(lc,l,mid,id);
change(rc,mid+,r,id);
}
int now=maxx(t[lc].id,t[rc].id);
if(now<INF) t[x].id=now;//debug 一个小区间都被覆盖了,大区间也会被覆盖。
} int query(int x,int l,int r)
{
upd(x);
if(t[x].l==l && t[x].r==r) return t[x].id;
int lc=t[x].lc,rc=t[x].rc,mid=(t[x].l+t[x].r)/;
if(r<=mid) return query(lc,l,r);
else if(l>mid) return query(rc,l,r);
else return maxx(query(lc,l,mid),query(rc,mid+,r));
} int main()
{
// freopen("a.in","r",stdin);
freopen("bales.in","r",stdin);
freopen("bales.out","w",stdout);
scanf("%d%d",&n,&m);
tl=;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].d);
q[i].id=i;
p[i].d=q[i].d;p[i].id=i;
}
sort(p+,p++m,cmp_nod);
int mx=;p[].d=;
for(int i=;i<=m;i++)
{
if(p[i].d!=p[i-].d) mx++;
q[p[i].id].d=mx;
}
for(int i=;i<=mx;i++) L[i]=,R[i]=n;
int ans=INF;
for(int i=;i<=m;i++)
{
int x=q[i].d;
if(q[i].l>R[x] || q[i].r<L[x]) {ans=i;m=i-;break;}
L[x]=maxx(L[x],q[i].l);
R[x]=minn(R[x],q[i].r);
}
// printf("%d\n",ans);
buildtree(,n);
sort(q+,q++m,cmp_nd);
for(int i=;i<=mx;i++) L[i]=,R[i]=n;
int x,now,j=;
for(int i=;i<=m;i++)
{
while(j<i && q[j].d!=q[i].d)
{
change(,q[j].l,q[j].r,q[j].id);
j++;
}
x=q[i].d;
L[x]=maxx(L[x],q[i].l);
R[x]=minn(R[x],q[i].r);
now=query(,L[x],R[x]);
ans=minn(ans,maxx(q[i].id,now));
}
if(ans<INF) printf("%d\n",ans);
else printf("0\n");
return ;
}
【bzoj1594-猜数游戏】线段树的更多相关文章
- BZOJ 1594: [Usaco2008 Jan]猜数游戏 线段树 + 思维 + 二分
Code: #include<bits/stdc++.h> #define maxn 3000000 using namespace std; void setIO(string s) { ...
- BZOJ 1594 [Usaco2008 Jan]猜数游戏(线段数)
1594: [Usaco2008 Jan]猜数游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 626 Solved: 260[Submit][S ...
- bzoj 1594: [Usaco2008 Jan]猜数游戏——二分+线段树
Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面摆N(1 <= N<= 1,000,00 ...
- 【BZOJ1594】[Usaco2008 Jan]猜数游戏 二分答案+并查集
[BZOJ1594][Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在 ...
- 【bzoj1594】猜数游戏
1594: [Usaco2008 Jan]猜数游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 556 Solved: 225 Descripti ...
- 【BZOJ 1594】 [Usaco2008 Jan]猜数游戏 (二分+并查集)
1594: [Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面 ...
- usaco 猜数游戏
Description 为了提高智商,锻炼思维能力,奶牛设计了一个猜数游戏.游戏开始前,贝西会在牛棚后面摆上N个数字.所有数字排成一条直线,按次序从1到N编号.每个数字在1到10^9之间,没有两个数字 ...
- (一)Python之猜数游戏
猜数游戏由简如深的编码学习过程: 3次机会: print('------------------我爱鱼C工作室------------------')count=0while count < 3 ...
- 猜数游戏-flag的运用
package my;import java.util.Scanner;public class MyJava { public static void main(String[] ar ...
- Java课程设计——猜数游戏(201521123111 陈伟泽)
Java课程设计--猜数游戏(201521123111 陈伟泽) 1.团队课程设计博客链接 博客作业--猜数游戏 2.个人负责模块或任务说明 Answer:一些基础界面的构造,排行榜的构造,用文件录入 ...
随机推荐
- 11.24Daily Scrum(2)
人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.996 数据库测试 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.997 实现视频浏览的功能 王 ...
- sql查询 同一个字段下另一个字段个数
select seriesid , count(reportid) from reportsystem group by seriesidhaving count(reportid) > 1
- joomla 出现The file Cache Storage is not supported on this platform;
错误提示:The file Cache Storage is not supported on this platform:在这个平台上不支持文件缓存存储 出现这样的原因很简单,有两个文件夹不可写,这 ...
- 第二章 shell的语法
变量:字符串.数字.环境和参数 获取变量内容可以在变量前使用$字符,使用echo指令可以将变量内容输出到终端. wuchao@wuchao-Lenovo:~$ var=hello wuchao@wuc ...
- 【Mysql】- Mysql 8.0正式版新亮点
MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8 ...
- ExtremeComponents源码解析(一)
一.前言 因参与公司框架改造,在负责前端table组件选型时,原本选了jqGrid和Bootstraptable作为备选方案,评审会上,武哥提了EXtremeComponents,让我也去了解下,看下 ...
- jstat查看jvm的GC
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上 ...
- vs2015常用代码块与自定义代码块
常用代码块 代码段名 描 述 #if 该代码段用#if和#endif命令围绕代码 #region 该代码段用#region和#endregion命令围绕代码 ~ 该代码段插入一个析构函数 att ...
- 第71天:jQuery基本选择器(二)
jQuery选择器 一.内容过滤选择器 选择器 描 述 返 回 示 例 :contains(text) 匹配含有文本内容text的元素 集合元素 $(“p:contains(今天)”) :empty ...
- Python 嵌套函数和闭包
Python 嵌套函数和闭包 1.函数嵌套 如果在一个函数内部定义了另一个函数,我们称外部的函数为外函数,内部的函数为内函数,如下代码: def out_func(): def inner_func1 ...