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;
}
浙公网安备 33010602011771号