【题意】现在有几个球排成一排,编号从1开始,开始时所有球为黑色,现在有n(<=2000)次操作,每次操作将l[i]至r[i](均在int范围)的球凃成颜色c[i](黑色'b'或白色'w'),然后找到最长的连续白色球,输出左右端点符号

【离散化】因为l[i]和r[i]都在int范围,显然不不可以开一个2^31-1那么大的数组。将l[i]和r[i]+1离散化,再模拟染色即可。

如果你不知道离散化

将l[i]数组所有数与r[i]+1数组所有数取出来从小到大排序,做一个映射。

如样例

3

1 4 w

8 11 w

3 5 b

把1、5、8、12、3、6取出来,排序为1、3、5、6、8、12,离散化后

原数

1

3

5

6

8

12

离散化后

0

1

2

3

4

5

用mp[]做映射,类型为mp<int,int>。rev_mp[int]做逆向映射。

比如mp[4]=8,离散化后的4就可以看成数8,9,10,11的集合。如果离散化后的4被染成白色,那么相当于原数8,9,10,11均被染成白色。

再取样例中的一行: 1 4 w作为例子,这里1,4是原数,要从把球1,2,3,4均涂色,显然是凃离散化后0(1,2)和1(3,4)即可。

如果当初把r[i]做离散化而不是r[i]+1做离散化的话,r[i]就表示从它开始几个数的集合都被涂色,而不是从它结束涂色。

做好映射后,2^31-1个数就可以看成最多2*n个数,然后模拟染色即可。

这道题写的好晕啊,WA了5发后发现是多Case输入。。。

 #include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<sstream>
#define eps 1e-9
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define MAXN 1005
#define MAXM 40005
#define INF 0x3fffffff
using namespace std;
typedef long long LL;
int i,j,k,n,m,x,y,T,ans,big,cas,num;
bool flag;
map <int , int> mp;
set <int> st; int l[],r[],rev_mp[];
char c[],color[];
int main()
{
while(~scanf("%d",&n))
{
st.clear();
mp.clear();
for (i=;i<=n;i++)
{
scanf("%d %d %c",&l[i],&r[i],&c[i]);
st.insert(l[i]);//现将其压入set中,也可以放入数组中最后排序
st.insert(r[i]+);
} num=;
for (set <int> ::iterator it=st.begin();it!=st.end();it++)//离散化
{
mp[*it]=num;//mp为map<int,int>类型,做一个映射,如上边的表格
rev_mp[num]=*it;//这是map的逆向映射。 num++;
} for (i=;i<num;i++) color[i]='b';//初始时为全部黑色 for (i=;i<=n;i++)//模拟涂刷过程
{
int left=mp[l[i]];
int right=mp[r[i]+];
for (j=left;j<right;j++)
{
color[j]=c[i];
}
} int pre=;
int left,right;
flag=false;
ans=;
for (i=;i<num;i++)//扫一遍寻找最长的连续白色球
{
if (color[i]!=color[i-])
{
if (color[i]=='w')
{
pre=i;//左端点
}else
if (color[i-]=='w' && ans < rev_mp[i] - rev_mp[pre] )
{
ans=rev_mp[i]-rev_mp[pre];//找到答案记录一下。
left=rev_mp[pre];
right=rev_mp[i]-;
flag=true;
}
}
}
if (!flag) printf("Oh, my god\n");else
printf("%d %d\n",left,right);
}
return ;
}

HDU 1199 - Color the Ball 离散化的更多相关文章

  1. hdu 1199 Color the Ball(离散化线段树)

    Color the Ball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  2. ZOJ 2301 / HDU 1199 Color the Ball 离散化+线段树区间连续最大和

    题意:给你n个球排成一行,初始都为黑色,现在给一些操作(L,R,color),给[L,R]区间内的求染上颜色color,'w'为白,'b'为黑.问最后最长的白色区间的起点和终点的位置. 解法:先离散化 ...

  3. hdu 1199 Color the Ball

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

  4. hdu 1199 Color the Ball 离散线段树

    C - Color the Ball Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

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

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

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

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

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

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

  8. HDU 1556 Color the ball (数状数组)

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

  9. 线段树(求单结点) hdu 1556 Color the ball

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

随机推荐

  1. [转载]__type_traits

    在STL中为了提供通用的操作而又不损失效率,我们用到了一种特殊的技巧,叫traits编程技巧.具体的来说,traits就是 通过定义一些结构体或类,并利用模板类特化和偏特化的能力,给类型赋予一些特性, ...

  2. [转载]C++中声明与定义的区别

    C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类的实现放在cpp文件中.它们为什么能够关联到一起呢?你知道什么东西可以放在.h文件中,什么不能.什么东西又可以放在cpp文件中.如果 ...

  3. Android放大镜的实现

    package chroya.demo.magnifier; import android.content.Context; import android.graphics.Bitmap; impor ...

  4. 写了一个jquery的 弹出层插件。

    下载地址:http://pan.baidu.com/s/1eQ26CMm ps:ajax加载做的,要有环境才能正常运行哦! //这是一个以ajax加载显示弹出层插件  参数(option): widt ...

  5. linux下php上传文件注意

    linux下php上传文件注意1.修改上传目录权限linux 修改某目录下所有所有子目录权限chmod -R 777 html修改某目录为任何用户都用写读执行权限chmod a+rwx html2.设 ...

  6. JQuery学习笔记【CSS选择符】--02

    Jquery的程序入口: <html> <head> <title></title> <script type="text/javasc ...

  7. C语言内存对齐原理

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...

  8. JS键盘的键码(event.keyCode)

    keycode 8 = BackSpace BackSpace keycode 9 = Tab Tab keycode 12 = Clear keycode 13 = Enter keycode 16 ...

  9. C51指针的使用

    指针就是指变量或数据所在的存储区地址.如一个字符型的变量 STR 存放在内存单元DATA 区的 51H 这个地址中,那么 DATA 区的 51H 地址就是变量 STR 的指针.在 C 语言中指针是一个 ...

  10. Android SharedPreferences登录记住密码

    SharedPreferences是Android中存储简单数据的一个工具类.可以想象它是一个小小的Cookie,它通过用键值对的方式把简单 数据类型(boolean.int.float.long和S ...