HDU 1199 Color the Ball
这题真的过的好艰辛啊,自己的方法是不对的,参考了某个大神的博客,然后修改自己的代码才通过。对于各个区间的交叉之类的还不是很会啊,尚需努力。。。。
参考:大神博客
线段树真的写的好挫啊,,,,,无力吐槽了。。。
题意是对 一些气球染色,然后输出最长的且最近的那个染成白色的连续区间
#include<algorithm> #include<iostream> #include<cstring> #include<vector> #include<cstdio> #include<cmath> #include<queue> using namespace std; #define LL(x) x<<1 #define RR(x) x<<1|1 int num[4005], bin[4005], ans[4005]; struct Op { int l, r, va; } op[2005]; int xx; struct Node { int l, r, p, va; } T[4005<<2]; void PushDown(int p) { if(T[p].va!=-1) { T[LL(p)].va=T[RR(p)].va=T[p].va; T[p].va=-1; } } void build(int p,int l,int r) { if(l>=r) return; T[p].l=l; T[p].r=r; T[p].va=-1; if(l==r-1) return; int m=(l+r)>>1; build(LL(p),l,m); build(RR(p),m,r); } void add(int p,int l,int r,int va) { if(l>=r) return; if(l==T[p].l&&T[p].r==r) { T[p].va=va; return; } PushDown(p); int m=(T[p].l+T[p].r)>>1; if(l>=m) add(RR(p),l,r,va); else if(r<=m) add(LL(p),l,r,va); else { add(LL(p),l,m,va); add(RR(p),m,r,va); } } int find(int x) { int l=1, r=xx; while(l<=r) { int m=(l+r)>>1; if(bin[m]==x) { return m; } if(bin[m]>x) r=m-1; else l=m+1; } return -1; } void get(int p,int l,int r) { int i; if(l>=r) return; if(T[p].va!=-1) { for(i=T[p].l; i<T[p].r; i++) ans[i]=T[p].va; return; } int m=(T[p].l+T[p].r)>>1; if(l>=m) get(RR(p),l,r); else if(r<=m) get(LL(p),l,r); else { get(LL(p),l,m); get(RR(p),m,r); } } int main() { int n, i, st, ed, len; char s[3]; while(scanf("%d",&n)!=EOF) { len=0; for(i=0; i<n; i++) { scanf("%d%d%s",&st,&ed,s); ed++; op[i].l=st, op[i].r=ed; if(s[0]=='w') op[i].va=1; else op[i].va=0; num[len++]=st; num[len++]=ed; } sort(num,num+len); xx=1; bin[1]=num[0]; for(i=1; i<len; i++) { if(num[i]!=num[i-1]) bin[++xx]=num[i]; } build(1,1,xx); for(i=0; i<n; i++) { int h1=find(op[i].l), h2=find(op[i].r); add(1,h1,h2,op[i].va); } memset(ans,0,sizeof(ans)); get(1,1,xx); ans[xx+1]=0, bin[xx+1]=bin[xx]; int y1=0, y2=0; for(i=1; i<=xx; i++) { if(ans[i]!=1) continue; st=bin[i]; while(ans[i]==1) i++; ed=bin[i]; if(ed-st>y2-y1) y2=ed, y1=st; } if(y2-y1!=0) printf("%d %d\n",y1,y2-1); else printf("Oh, my god\n"); } return 0; }