Color the Ball

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 48 Accepted Submission(s): 25
 
Problem Description
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
 
Author
ZHOU, Kai
 
Source
ZOJ Monthly, February 2005
 
Recommend
Ignatius.L
 
因为这个专题都是线段树嘛,刚开始离散化进行区间合并,但是写着写着就爆了,后来又想了一下,不用合并,只要
set一下记录区间就行,但是边界问题各种wa,没忍住看了一发题解,看到暴力可以搞,结果就暴力一发就过了.......
就过了......
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define INF 0x3f3f3f3f
char a[];//数组开小了,wa了几次
int n,x,y;
char ch;
void init(){
memset(a,'b',sizeof(a));
}
int main(){
// freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
init();
int maxnum=,minnum=INF;//数据的范围
for(int i=;i<n;i++){
cin>>x>>y>>ch;//cin处理方便的点
if(y>maxnum)
maxnum=y; if(x<minnum)
minnum=x; for(int j=x;j<=y;j++)//模拟染色
a[j]=ch; }
int sum=;//记录连续白球的个数
int max1=;//记录最多连续白球个数
int beg=minnum,end=minnum;//记录连续白球的区间
int minpos=-,maxpos=-;//最大连续白球的左右区间 for(int i=minnum;i<=maxnum+;i++){
if(a[i]=='b'){//如果当前位置是黑球的话
if(sum>max1){
max1=sum;
minpos=beg;
maxpos=end;
}
sum=;
continue;
}
if(sum==)
beg=i;
sum++;
end=i; }
if(max1==)
cout<<"Oh, my god"<<endl;
else
cout<<minpos<<" "<<maxpos<<endl; }
return ;
}

经过离散化处理的线段树

/*
* @Author: lyucheng
* @Date: 2017-07-03 21:05:51
* @Last Modified by: lyucheng
* @Last Modified time: 2017-07-05 15:45:24
*/
/*
题意: 最长连续子序列的长度 思路:线段树的区间set问题 错误:离散化出了问题,如果单纯的去重,会产生这种错误:
input
2
1 3 w
5 5 w
exception output:
1 5
right output:
1 3
所以离散化的时候要改进:
数据进行离散化的时候,开区间离散化端点,闭区间一般用两个点离散一个端点.例如:
开区间 [1.5] 实际的离散化之后应该是 [ (1,2) , (4,5) ].
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <time.h>
#define LL long long
#define MAXN 50000+5
#define lson i*2,l,m
#define rson i*2+1,m+1,r using namespace std; int n;
LL l[MAXN],r[MAXN];
char str[MAXN][];
LL X[MAXN*];
int len;
int k;
int cover[MAXN*];
int setd[MAXN*]; void pushup(int i,int l,int r){
if(setd[i*]==-||setd[i*+]==-){
setd[i]=-;
}else if(setd[i*]!=setd[i*+]){
setd[i]=-;
}else {
setd[i]=setd[i*];
}
} void pushdown(int i,int l,int r){
if(setd[i]!=-){
setd[i*]=setd[i*+]=setd[i];
setd[i]=-;
}
} void build(int i,int l,int r){
setd[i]=;
if(l==r) return ;
int m=l+(r-l)/;
build(lson);
build(rson);
} void update(int ql,int qr,int val,int i,int l,int r){ if(ql<=l&&r<=qr){
setd[i]=val;
pushdown(i,l,r);
return ;
} if(setd[i]==val) return ;//没有继续更新的必要 if(l==r) return ; pushdown(i,r,l); int m=l+(r-l)/;
if(m>=ql) update(ql,qr,val,lson);
if(m<=qr) update(ql,qr,val,rson);
// pushup(i,l,r);
} void query(int ql,int qr,int i,int l,int r){
if(setd[i]!=-){
for(int j=l;j<=r;j++){
cover[j]=setd[i];
}
return ;
}
int m=l+(r-l)/;
if(m>=ql) query(ql,qr,lson);
if(m<=qr) query(ql,qr,rson);
} int findx(LL key){
int l=,r=k,mid;
while(l<=r){
mid=l+(r-l)/;
if(X[mid]==key){
return mid;
}else if(X[mid]>key){
r=mid-;
}else{
l=mid+;
}
}
return -;
}
void init(){
len=;
k=;
memset(cover,,sizeof cover);
} int main(){
// freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF){ init();
for(int i=;i<n;i++){
scanf("%lld%lld%s",&l[i],&r[i],str[i]);
X[++len]=l[i];
X[++len]=r[i];
} //处理开区间
sort(X+,X+len+);
int t=len;
for(int i=;i<=t;i++){
if(X[i]-X[i-]>) X[++len]=X[i-]+;
if(X[i]-X[i-]>) X[++len]=X[i]-;
} //去重
sort(X+,X+len+);
for(int i=;i<=len;i++){
if(X[i]!=X[i-]){
X[++k]=X[i];
}
}
// for(int i=1;i<=k;i++){
// cout<<X[i]<<" ";
// }cout<<endl;
// cout<<"k="<<k<<endl;
build(,,k); for(int i=;i<n;i++){
int fl=findx(l[i]);
int fr=findx(r[i]);
if(str[i][]=='w')
update(fl,fr,,,,k);
else
update(fl,fr,,,,k);
}
// cout<<"ok"<<endl;
query(,k,,,k);//更新到cover数组中 // for(int i=1;i<=k;i++){
// cout<<cover[i]<<" ";
// }cout<<endl; LL _max=,_maxl,_maxr;
int i=;
while(i<=k){
if(cover[i]==){//白色气球
int j=i+;
while(cover[j]==&&j<=k) j++;
// cout<<X[j-1]<<" "<<X[i]<<endl;
if(X[j-]-X[i]+>_max){
_max=X[j-]-X[i]+;
_maxl=X[i];
_maxr=X[j-];
}
i = j;
}else{
i++;
}
// cout<<_max<<endl;
}
if(_max==){
puts("Oh, my god");
}else{
printf("%lld %lld\n",_maxl,_maxr);
}
}
return ;
}

Color the Ball(懵逼题)的更多相关文章

  1. hdu 1556:Color the ball(线段树,区间更新,经典题)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

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

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

  3. hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. 线段树--Color the ball(多次染色问题)

    K - Color the ball Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  5. hdu 1199 Color the Ball

    http://acm.hdu.edu.cn/showproblem.php?pid=1199 Color the Ball Time Limit: 2000/1000 MS (Java/Others) ...

  6. Color the ball HDOJ--1556

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. hdu 1556 Color the ball (线段树+代码详解)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

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

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

  9. HDU-1556:Color the ball(前缀和)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

随机推荐

  1. java 线程二

    一.线程的优先级别 线程优先级别的使用范例: 1 package cn.galc.test; 2 3 public class TestThread6 { 4 public static void m ...

  2. Jenkins定时任务

    Jenkins配置定时任务 选中Job名称--配置—构建触发器—勾选“Build periodically” 如图中配置所示:该任务每天上午7点定时执行一次. 官方说明翻译 MINUTE HOUR D ...

  3. Opengl4.5 中文手册—A

    因为opengl API 比较庞大,网络上还没有完整的.较新的opengl中文手册 这对很多人很不方便,所以整理了这一系列,用于帮助大家"快速浏览最新的opengl api" 为了 ...

  4. TTabControl

    1.TTabControl 组件的典型用法TTabControl 组件使用起来,根本不会使程序简单化,所以不提倡使用此组件,可以用TPageControl组件代替.与多页组件不同的是,虽然Tab 组件 ...

  5. vim与sublime,程序员的屠龙刀和倚天剑

    对程序员来说,写代码是再熟悉不过的事情了,windows系统自带有记事本软件,能写写小规模的代码,可是代码量大了,它的局限性就暴露得很明显了:没有语法高亮,没有自动提示,不支持项目管理,界面难看-- ...

  6. 17.tslib安装以及使用

    1.先在网上下载 tslib-1.4.tar.gz压缩包 2.然后在ubuntu编译: tar xzf tslib-1.4.tar.gz cd tslib ./autogen.sh mkdir tmp ...

  7. 关于加载离线SHP文件、geodatabase文件所遇到的路径问题

    正文开始之前还是先吐槽一下,一行代码DEBUG了一天不知道怎么改,终于误打误撞弄出来了(以下以shp文件为例) 对于虚拟机测试 public String getPath(){ File sdDir ...

  8. “一切都是消息”--MSF(消息服务框架)之【请求-响应】模式

    在前一篇, “一切都是消息”--MSF(消息服务框架)入门简介, 我们介绍了MSF基于异步通信,支持请求-响应通信模式和发布-订阅通信模式,并且介绍了如何获取MSF.今天,我们来看看如何使用MSF来做 ...

  9. jvm中的垃圾回收器

    HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器.如果两个收集器之间存在连线,就说明它们可以搭配使用.Serial(串行GC)收集器 Serial收集器 ...

  10. Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求

    Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...