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. Objective-C中的同步线程的锁

    概述 在多线程编程中往往会遇到多个线程同时访问共享的资源,这种情况我们需要通过同步线程来避免.也就是给线程加锁. 因为Objective-C是C语言的超集.,严格的来说是真超集.所以C语言当中的pth ...

  2. crm使用soap删除字段

    //C# 代码: //DeleteAttributeRequest request = new DeleteAttributeRequest(); //request.EntityLogicalNam ...

  3. Metasploit - Tips for Evading Anti-Virus

    绕过杀毒软件,有很多钟方法.此处介绍一种,编写python程序调用shellcode,并使用Pyinstaler将python程序编译为exe程序. 准备工作:(Windows XP环境下编译) 将P ...

  4. PHP写文件到指定位置

    <?php $fp = fopen("output.json", "r+"); $flag = fseek($fp, -3, SEEK_END); if( ...

  5. 利用 urandom 生成随机密码

    cat /dev/urandom | LC_ALL=C tr -dc "[:alnum:]" | fold -w 16 |head -3   说明: fold -w 16  指定密 ...

  6. 学习TF:《TensorFlow技术解析与实战》PDF+代码

    TensorFlow 是谷歌公司开发的深度学习框架,也是目前深度学习的主流框架之一.<TensorFlow技术解析与实战>从深度学习的基础讲起,深入TensorFlow框架原理.模型构建. ...

  7. 【Nginx从入门到实战】

    目录 1. 网站服务 2. 所谓Nginx 3. 安装Nginx 4. Nginx配置文件详述 5. 开始玩转Nginx Nginx虚拟主机 Nginx状态信息(status)配置 Nginx错误页面 ...

  8. CMDB学习之七-实现采集错误捕捉,日志信息处理

    首先采集disk的具体实现方上代码: # !/usr/bin/env python # -*- coding:utf-8 -*- from .base import BasePlugin import ...

  9. J2EE之13个规范标准概念

    主要是关于j2EE十三个规范的总结. java基础知识 首先java分为三类:J2ME.J2SE.J2EE. 依据开发软件的大小和量级他们的作用分别不同,J2ME是开发为机顶盒.移动电话和PDA之类嵌 ...

  10. spring set注入

    上篇文章说到了构造器注入.可是有时候构造器注入并非非常好用,如今来看下set注入. 构造器注入博客地址:http://blog.csdn.net/luckey_zh/article/details/4 ...