首页 > 代码库 > hdu1199 线段树
hdu1199 线段树
这题说的是给了 n 个操作。 每个操作会把 【a,b】 之间的球 涂为黑色或者 白色, 然后最后问 最长的连续的白色的 球有多少个,初始的时候全是黑的。
我们将所有的点离散化, 记得离散 a-1, b+1, 因为如果你不离散 a-1 那么 在区间间隔时 间隔是黑色的 没有操作的你会计算成白色的, 然后如果不加b+1 会使得同起点的区间白色的部分会被后来比他小的黑色区间覆盖, 导致最后 白色的少了
#include <iostream>#include <algorithm>#include <cstdio>#include <string.h>using namespace std;typedef long long ll;const int maxn = 4005;ll X[maxn],Y[maxn];int op[maxn];ll Loc[maxn*2];int cL, cR ,V,tim;ll ansL,ansR,preL,preR;struct Itree{ int color[maxn*8]; void build(int o, int L, int R){ color[o]=2; } void pushdown(int o){ color[o*2]=color[o]; color[o*2+1]=color[o]; color[o]=-1; } void update(int o, int L , int R){ if(cL<=L && R<=cR ){ color[o]=V; return; } int mid=(L+R)/2; if(color[o]!=-1) pushdown(o); if(cL<=mid) update(o*2, L, mid); if(cR>mid) update(o*2+1, mid+1, R); } void endop(int o, int L, int R){ if(color[o]!=-1){ if(color[o]==1){ if(tim==0){ tim=1; preL=Loc[L-1]; preR=Loc[R-1]; if(preR-preL>ansR-ansL){ ansL=preL; ansR=preR; } }else{ preR=Loc[R-1]; if(preR-preL>ansR-ansL){ ansL=preL; ansR=preR; } } }else tim=0; return ; } if(L==R) return ; int mid=(L+R)/2; endop(o*2,L, mid); endop(o*2+1, mid+1,R); }}T;int main(){ int n; char st[5]; while(scanf("%d",&n)==1){ int ge=0; for(int i=0; i<n; ++i ){ scanf("%I64d%I64d%s",&X[i],&Y[i],st); /* ll a = X[i] ,b =Y[i]; X[i]=min(a,b); Y[i]=max(a,b);*/ if(st[0]==‘b‘) op[i]=2; else op[i]=1; Loc[ge++]=X[i]; Loc[ge++]=Y[i]; Loc[ge++]=X[i]-1; Loc[ge++]=Y[i]+1; } sort(Loc,Loc+ge); ge = unique(Loc,Loc+ge)-Loc; T.build(1,1,ge); for(int i=0; i<n; ++i){ cL =lower_bound(Loc,Loc+ge,X[i])-Loc+1; cR =lower_bound(Loc, Loc+ge, Y[i])-Loc+1; V=op[i]; T.update(1,1,ge); } ansL=1; ansR=-1;tim=0; T.endop(1,1,ge); if(ansL>ansR){ puts("Oh, my god"); }else{ printf("%I64d %I64d\n",ansL, ansR); } } return 0;}
hdu1199 线段树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。