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. 用JS制作一个信息管理平台完整版

      前  言 JRedu 在之前的文章中,介绍了如何用JS制作一个实用的信息管理平台. 但是那样的平台功能过于简陋了,我们今天来继续完善一下. 首先我们回顾一下之前的内容.   1.JSON的基础知识 ...

  2. js学习要点

    js 一.词法结构 1.区分大小写 2.注意 // 单行 /* 多行注释 */ 3.字面量(直接量 literal) 12 //数字 5.8 // 小数 "hello" 'hell ...

  3. angular directive知识

    一般来讲 directive名字遵循一下规则: 1.忽略以x-和data-为元素/属性的前缀 2.转化“:”,“-”,“_”命名为驼峰命名 如下所示 <div ng-controller=&qu ...

  4. iOS开发中KVC、KVO简介

    在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 ...

  5. python和C语言混编的几种方式

    Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Pytho ...

  6. 已被.NET基金会认可的弹性和瞬态故障处理库Polly介绍

    前言 本节我们来介绍一款强大的库Polly,Polly是一种.NET弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略. Polly针对对.NET 4. ...

  7. 简易RPC框架-心跳与重连机制

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  8. 设计模式学习之“观察者模式” [C#]

    <深入浅出设计模式>学习笔记第二章 需求: 开发一套气象监测应用,如图: 气象站,目前有三种装置,温度.湿度和气压感应装置. WeatherData对象追踪气象站的数据,并更新到布告板,布 ...

  9. Python数据分析(二): Numpy技巧 (3/4)

    numpy.pandas.matplotlib(+seaborn)是python数据分析/机器学习的基本工具. numpy的内容特别丰富,我这里只能介绍一下比较常见的方法和属性.   昨天晚上发了第一 ...

  10. less使用ch1--简单使用

    1 ku.less .reset(){ *{margin:0;padding:0;} ul.ol{list-style: none;} a{text-decoration: none;} img{bo ...