题解:

矛盾只有两种情况:

一.先前确定了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-猜数游戏】线段树的更多相关文章

  1. BZOJ 1594: [Usaco2008 Jan]猜数游戏 线段树 + 思维 + 二分

    Code: #include<bits/stdc++.h> #define maxn 3000000 using namespace std; void setIO(string s) { ...

  2. BZOJ 1594 [Usaco2008 Jan]猜数游戏(线段数)

    1594: [Usaco2008 Jan]猜数游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 626  Solved: 260[Submit][S ...

  3. bzoj 1594: [Usaco2008 Jan]猜数游戏——二分+线段树

    Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面摆N(1 <= N<= 1,000,00 ...

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

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

  5. 【bzoj1594】猜数游戏

    1594: [Usaco2008 Jan]猜数游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 556  Solved: 225 Descripti ...

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

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

  7. usaco 猜数游戏

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

  8. (一)Python之猜数游戏

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

  9. 猜数游戏-flag的运用

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

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

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

随机推荐

  1. c# 两个软件传参

    1.socket 传参,类似于小型的服务器和客户端,一端发送,另一端保持监听状态. 2.通过第三方  数据库或者文件.

  2. 软工1816 · Alpha冲刺(4/10)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 完成菜品信息的标定.量化以及整理成csv的任务   接下来的计划 & ...

  3. 团队第一次作业 ——404 Note Found 团队

    如果记忆是一个罐头的话,我希望这一罐罐头不会过期----<重庆森林> 404 Note Found Team 如果记忆是一个备忘录的话,别说了,它不会过期----<404 Note ...

  4. 福大软工1816 · 第五次作业 - 结对作业2_map与unordered map的比较测试

    测试代码: #include <iostream> using namespace std; #include <string> #include <windows.h& ...

  5. ALPHA-3

    前言 失心疯病源3 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 今天完成了那些任务 16:00~20:18 援助行人模块并确定最终框架,顺便不死心的又找了一波车辆检测的dem ...

  6. iOS-开发过程中应用间跳转问题

  7. HDU 2068 Choose the best route

    http://acm.hdu.edu.cn/showproblem.php?pid=2680 Problem Description One day , Kiki wants to visit one ...

  8. 修改QQ各版本的默认保存位置(聊天记录)

    这几天没少折腾windows,都有点烦了,我是那种有强迫症的,只要知道的自己没有做到的会感觉到浑身不爽的因为系统重装了好几次,QQ也没少安装几次,我使用的是TM的QQ(没有 那么多烦人的广告,娱乐组件 ...

  9. lucene 学习之编码篇

    本文环境:lucene5.2     JDK1.7   IKAnalyzer 引入lucene相关包 <!-- lucene核心包 --> <dependency> <g ...

  10. MYsql 数据库密码忘记(Window)-2(mysql 5.7)

    很久没用Mysql了,再次打开,发现用不了了,密码忘了,服务也无法打开,在cmd中输入mysql之后,显示不是内部指令. 看来问题是mysql服务打不开了 (1)在cmd中 输入net start m ...