bzoj 1594: [Usaco2008 Jan]猜数游戏【二分+线段树】
2018-07-05 17:37
525 查看
写错一个符号多调一小时系列……
二分答案,然后判断这个二分区间是否合法:
先按值从大到小排序,然后对于值相同的一些区间,如果没有交集则不合法;否则把并集在线段树上打上标记,然后值小于这个值的区间们,如果交集打过标记了,那么不合法,因为这个打过标记的区间一定不会有更小的值了,但是现在有一个更小的数想更新区间
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=1000005,inf=1e9; int n,q; struct xds { int l,r,s; }t[N<<2]; struct qwe { int l,r,v; }a ,b ; bool cmp(const qwe &a,const qwe &b) { return a.v>b.v; } int read() { int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f; } void build(int ro,int l,int r) { t[ro].l=l,t[ro].r=r,t[ro].s=0; if(l==r) return; int mid=(l+r)>>1; build(ro<<1,l,mid); build(ro<<1|1,mid+1,r); } void update(int ro,int l,int r) { if(t[ro].l==l&&t[ro].r==r) { t[ro].s=1; return; } int mid=(t[ro].l+t[ro].r)>>1; if(r<=mid) update(ro<<1,l,r); else if(l>mid) update(ro<<1|1,l,r); else { update(ro<<1,l,mid); update(ro<<1|1,mid+1,r); } if(!t[ro].s) t[ro].s=(t[ro<<1].s&t[ro<<1|1].s); } int ques(int ro,int l,int r) { if((t[ro].l==l&&t[ro].r==r)||t[ro].s) return t[ro].s; int mid=(t[ro].l+t[ro].r)>>1; if(r<=mid) return ques(ro<<1,l,r); else if(l>mid) return ques(ro<<1|1,l,r); else return ques(ro<<1,l,mid)&ques(ro<<1|1,mid+1,r); } bool ok(int m) { build(1,1,n); for(int i=1;i<=m;i++) b[i]=a[i]; sort(b+1,b+1+m,cmp); for(int i=1,j;i<=m;i=j) { j=i; int l1=inf,l2=0,r1=0,r2=inf; while(j<=m&&b[i].v==b[j].v) j++; for(int k=i;k<j;k++) l1=min(l1,b[k].l),l2=max(l2,b[k].l),r1=max(r1,b[k].r),r2=min(r2,b[k].r); if(l2>r2||ques(1,l2,r2)) return 0; update(1,l1,r1); } return 1; } int main() { n=read(),q=read(); for(int i=1;i<=q;i++) a[i].l=read(),a[i].r=read(),a[i].v=read(); int l=1,r=q,ans=0; while(l<=r) { int mid=(l+r)>>1; if(ok(mid)) l=mid+1,ans=mid; else r=mid-1; } printf("%d\n",(ans+1)%(q+1)); return 0; }
相关文章推荐
- bzoj 1594: [Usaco2008 Jan]猜数游戏——二分+线段树
- 【BZOJ1594】[Usaco2008 Jan]猜数游戏 二分答案+并查集
- [bzoj1594] [Usaco2008 Jan]猜数游戏
- BZOJ1594: [Usaco2008 Jan]猜数游戏
- 1594: [Usaco2008 Jan]猜数游戏
- [BZOJ1594] [Usaco2008 Jan]猜数游戏(二分 + 并查集)
- bzoj1594 [Usaco2008 Jan]猜数游戏(二分答案+线段树/并查集)
- 【BZOJ 1594】 [Usaco2008 Jan]猜数游戏 (二分+并查集)
- bzoj1594[Usaco2008 Jan]Haybale Guessing猜数游戏
- bzoj 1636: [Usaco2007 Jan]Balanced Lineup -- 线段树
- bzoj1612 [Usaco2008 Jan]Cow Contest奶牛的比赛(Floyd)
- [BZOJ1612][Usaco2008 Jan]Cow Contest奶牛的比赛
- BZOJ1593 [Usaco2008 Feb]Hotel 旅馆 线段树
- bzoj1593 [Usaco2008 Feb]Hotel 旅馆(线段树)
- 【bzoj 1610: [Usaco2008 Feb]Line连线游戏】 枚举
- BZOJ_1610_[Usaco2008_Feb]_Line连线游戏_(计算几何基础+暴力)
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
- 【BZOJ】1596: [Usaco2008 Jan]电话网络(树形dp+特殊的技巧)
- [BZOJ1596] [Usaco2008 Jan]电话网络(树形DP || 贪心)
- [BZOJ1596][Usaco2008 Jan]电话网络(贪心||树形dp)