Color the Ball


Time Limit: 2 Seconds      Memory Limit: 65536 KB

There are infinite balls in a line (numbered 1 2 3 ....), and initially all of them are paint black. Now Jim use a brush paint the balls, every time give two integers a b and follow by a char 'w' or 'b', 'w' denotes the ball from a to b are painted white, 'b' denotes that be painted black. You are ask to find the longest white ball sequence.

Input

First line is an integer N (<=2000), the times Jim paint, next N line contain a b c, c can be 'w' and 'b'.

There are multiple cases, process to the end of file.

Output

Two integers the left end of the longest white ball sequence and
the right end of longest white ball sequence (If more than one output
the small number one). All the input are less than 2^31-1. If no such
sequence exists, output "Oh, my god".

Sample Input

3
1 4 w
8 11 w
3 5 b

Sample Output

8 11

解题思路:n未知,因此离散化好处理,线段树的区间更新

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#define lowbit(x) (x&(-x))
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.141592653589793238462
#define INF 0x3f3f3f3f3f
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
const int maxn=;
struct node
{
int l,r,co;
}tree[maxn*];
int n,cnt,tot;
int num[maxn],ha[maxn],color[maxn],co[maxn],li[maxn],ri[maxn];
int find(int x)
{
int l=,r=cnt;
while(l<=r)
{
int mid=(l+r)>>;
if(ha[mid]==x) return mid;
else if(ha[mid]<x) l=mid+;
else r=mid-;
}
return -;
}
void build(int l,int r,int root)
{
tree[root].l=l,tree[root].r=r,tree[root].co=;
if(l==r) return ;
int mid=(l+r)>>;
build(l,mid,root<<);
build(mid+,r,root<<|);
}
void update(int l,int r,int root,int val)
{
if(tree[root].l==l && tree[root].r==r)
{
tree[root].co=val;
return;
}
if(tree[root].co==val) return;
if(tree[root].co!=-)
{
tree[root<<].co=tree[root<<|].co=tree[root].co;
tree[root].co=-;
}
if(r<=tree[root<<].r) update(l,r,root<<,val);
else if(l>=tree[root<<|].l)update(l,r,root<<|,val);
else update(l,tree[root<<].r,root<<,val),update(tree[root<<|].l,r,root<<|,val);
}
void query(int l,int r,int root)
{
if(tree[root].co!=-)
{
for(int i=tree[root].l;i<=tree[root].r;i++)
color[i]=tree[root].co;
return;
}
if(r<=tree[root<<].r) query(l,r,root<<);
else if(l>=tree[root<<|].l) query(l,r,root<<|);
else query(l,tree[root<<].r,root<<),query(tree[root<<|].l,r,root<<|); }
int main(int argc,char *argv[])
{
char s[];
while(scanf("%d",&n)!=EOF)
{
tot=;
memset(color,,sizeof(color));
for(int i=;i<n;i++)
{
scanf("%d%d%s",&li[i],&ri[i],s);
co[i]=s[]=='b'?:;
num[tot++]=li[i];
num[tot++]=ri[i];
}
sort(num,num+tot);
int t=tot;
for(int i=;i<t;i++)
{
if(num[i]-num[i-]>) num[tot++]=num[i-]+;
if(num[i]-num[i-]>) num[tot++]=num[i]-;
}
sort(num,num+tot);
cnt=;
ha[++cnt]=num[];
for(int i=;i<tot;i++)
if(num[i-]!=num[i]) ha[++cnt]=num[i];
build(,maxn,);
for(int i=;i<n;i++)
{
int a=find(li[i]);
int b=find(ri[i]);
update(a,b,,co[i]);
}
query(,maxn,);
int s,e,ans=,i=,j;
while(i<=cnt)
{
if(color[i]==)
{
j=i;
while(color[j]== && j<=cnt) j++;
int t=ha[j-]-ha[i]+;
if(t>ans)
{
ans=t;
s=ha[i];
e=ha[j-];
}
i=j;
}
else i++;
}
if(!ans) printf("Oh,my god\n");
else printf("%d %d\n",s,e);
}
return ;
}

ZOJ 2301 Color the Ball 线段树(区间更新+离散化)的更多相关文章

  1. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

  2. HDU 1556 Color the ball(线段树区间更新)

    Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...

  3. Color the ball 线段树 区间更新但点查询

    #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...

  4. hdu 1556 Color the ball 线段树 区间更新

    水一下 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 ...

  5. POJ-2528 Mayor's posters (线段树区间更新+离散化)

    题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...

  6. hdu1556Color the ball线段树区间更新

    题目链接 线段树区间更新更新一段区间,在更新区间的过程中,区间被分成几段,每一段的左右界限刚好是一个节点的tree[node].left和tree[node].right(如果不是继续分,直到是为止) ...

  7. POJ-2528 Mayor's posters(线段树区间更新+离散化)

    http://poj.org/problem?id=2528 https://www.luogu.org/problem/UVA10587 Description The citizens of By ...

  8. POJ 2528 Mayor's posters (线段树区间更新+离散化)

    题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...

  9. POJ2528:Mayor's posters(线段树区间更新+离散化)

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

随机推荐

  1. iOS多线程与网络开发之多线程GCD

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主.捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...

  2. Android GridView LruCache

    照片墙这种功能现在应该算是挺常见了,在很多应用中你都可以经常看到照片墙的身影.它的设计思路其实也非常简单,用一个GridView控件当作“墙”,然后随着GridView的滚动将一张张照片贴在“墙”上, ...

  3. 2015北京网络赛 J Scores bitset+分块

    2015北京网络赛 J Scores 题意:50000组5维数据,50000个询问,问有多少组每一维都不大于询问的数据 思路:赛时没有思路,后来看解题报告也因为智商太低看了半天看不懂.bitset之前 ...

  4. 用JS把复选框做成单选框,左显示div,右隐藏div

    <input type="checkbox" name="checkname" onclick="check(this)"/>左 ...

  5. vue 指令的用法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Svn备份与Bandizip压缩批处理程序

    目的:为了定时备份多个svn仓库数据,使用批处理程序进行备份并Bandizip进行压缩保存到指定位置,操作完成后弹出成功提示. 为了完成以上目标,需要了解以下几个方面: 批处理命令 Svn命令 Ban ...

  7. BZOJ3435: [Wc2014]紫荆花之恋(替罪羊树,Treap)

    Description 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来.仔细看看的话,这个大树实际上是 ...

  8. 【Docker入门】

    目录 Linux容器 Docker的优势 Docker三大概念 安装使用Docker 补充知识 [Docker入门] 发布文章 "qq_41964425" @ *** 所谓Dock ...

  9. tee---将数据重定向到文件,

    tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin.简单的说就是把数据重定向到给定文件和屏幕上. 存在缓存机制,每1024个字节将输出一次.若从管道接收输 ...

  10. Mybatis使用注解进行增删改查

    // 增public interface StudentMapper{ @Insert("insert into student (stud_id, name, email, addr_id ...