Color the Ball(懵逼题)
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 |
|
Sample Output
8 11 |
|
Author
ZHOU, Kai
|
|
Source
ZOJ Monthly, February 2005
|
|
Recommend
Ignatius.L
|
#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(懵逼题)的更多相关文章
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 线段树--Color the ball(多次染色问题)
K - Color the ball Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- hdu 1199 Color the Ball
http://acm.hdu.edu.cn/showproblem.php?pid=1199 Color the Ball Time Limit: 2000/1000 MS (Java/Others) ...
- Color the ball HDOJ--1556
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 1556 Color the ball (线段树+代码详解)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU-1556:Color the ball(前缀和)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
随机推荐
- 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因
转自:彬彬有礼. 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因 http://blog.csdn.net/jbb0523/article/details/40268943 题目: ...
- 深入理解String的关键点和方法
String是Java开发中最最常见的,本篇博客针对String的原理和常用的方法,以及String的在开发中常见问题做一个整体性的概括整理.因为之前对String的特性做过一些分析,所以不在详细描述 ...
- 学习ExtJS的grid布局
这是之前学习ExtJS布局的时候我导师让我重点熟悉的内容.之后会发一个最近写的结合MVC项目的grid布局的案例. 上一篇关于ExtJS的学习资料什么的都已经更在上一篇了,这里只是对一些代码的记录. ...
- ThinkPHP5高阶实战教程
tp5项目:https://www.kancloud.cn/mikkle/thinkphp5_study/396283
- Redis info 参数详解
Redis Info 命令以一种易于理解和阅读的格式,返回关于 Redis 服务器的各种信息和统计数值. 通过给定可选的参数 section ,可以让命令只返回某一部分的信息: server : 一般 ...
- Python实战之set学习笔记及简单练习
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__' ...
- 自动化selenium开发
一.开发环境搭建 1.Firefox浏览器 1.1 下载firefix并安装. 1.2 Firefox中打开"开始菜单“ -> ”开发者“ -> ”获取更多工具“ -> 搜 ...
- ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理
ASP.NET MVC的路由是MVC应用的一个核心也是MVC应用处理的入口,作为一个开发者,在正常情况下仅仅需要做的就是根据需求去定义实体.业务逻辑,然后在MVC的Controller中去调用.Vie ...
- 如何开发webpack plugin
继上回介绍了如何开发webpack loader 之后.趁热打铁,来继续看下webpack另一个核心组成:plugin. 下面也和loader一样,让我们一起从基本的官方文档着手看起. loader和 ...
- Java并发编程之原子变量
原子变量最主要的一个特点就是所有的操作都是原子的,synchronized关键字也可以做到对变量的原子操作.只是synchronized的成本相对较高,需要获取锁对象,释放锁对象,如果不能获取到锁,还 ...