题目链接: 题意是说,有从 1 开始递增依次编号的很多球,开始他们都是黑色的,现在依次给出 n 个操作(ai,bi,ci),每个操作都是把编号 ai 到 bi 区间内的所有球涂成 ci 表示的颜色(黑 or 白),然后经过 n 次给定的操作后,求最长的连续白色区间的左端点和右端点。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
const double pi=acos(-1);
const int maxn=100000;
int cnt; struct node{
ll l,r;
}ne[2*maxn+10]; bool cmp(node a,node b)
{
if(a.l!=b.l) return a.l<b.l;
else return a.r<b.r;
} bool inter(node i,node j)
{
return j.r>=i.l&&j.l<=i.r;
} void update(node &tmp,node &j)
{
if(tmp.l>j.l&&tmp.r<j.r)
{
ne[++cnt]=(node){tmp.r+1,j.r};
j=(node){j.l,tmp.l-1};
return;
} if(tmp.l<=j.l&&tmp.r>=j.r)
{j.l=-1;j.r=-1;return;}
if(tmp.l>j.l)
j.r=tmp.l-1;
else j.l=tmp.r+1;
} int main()
{
int n;
while(~scanf("%d",&n))
{
int l,r;
char op[5];
cnt=0;
for(int i=1;i<=n;i++)
{
scanf("%d %d",&l,&r);
if(l>r) swap(l,r);//题目只是说给定的范围
scanf("%s",op);
if(op[0]=='w')
{ne[++cnt].l=l;ne[cnt].r=r;}
else
{
node tmp=(node){l,r};
int curcnt=cnt;
for(int j=1;j<=curcnt;j++)
if(inter(tmp,ne[j]))
update(tmp,ne[j]);
}
}
sort(ne+1,ne+cnt+1,cmp);
node ans=(node){1,0};
for(int i=1;i<=cnt;)
{
node cur=(node){ne[i].l,ne[i].r};
if(cur.l<0) {i++;continue;}
while(cur.r+1>=ne[i].l)
{
cur.r=max(ne[i].r,cur.r);i++;//注意新加入的区间不///一定r大于当前
if(i>cnt) break;
}
if(cur.r-cur.l+1>ans.r-ans.l+1)
ans=cur;
}
if(ans.r!=0)
printf("%lld %lld\n",ans.l,ans.r);
else printf("Oh, my god\n");
}
return 0;
}

  分析:最多int范围内的数的球,说明直接开数组是肯定不行的,考虑离散化,毕竟n<=2000,每个

节点代表一个区间,然后每次一出现一个新的黑色的节点,就考虑其对已经有的白色区间的干扰,最后

对所有的白色区间合并记录最长长度就好,参考文章;

wa代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
const double pi=acos(-1);
const int maxn=100000;
int cnt; struct node{
ll l,r;
}ne[2*maxn+10]; bool cmp(node a,node b)
{
if(a.l!=b.l) return a.l<b.l;
else return a.r<b.r;
} bool inter(node i,node j)
{
return j.r>=i.l&&j.l<=i.r;
} void update(node &tmp,node &j)
{
if(tmp.l>j.l&&tmp.r<j.r)
{
j=(node){j.l,tmp.l-1};
ne[++cnt]=(node){tmp.r+1,tmp.r};
return;
} if(tmp.l<=j.l&&tmp.r>=j.r)
{j.l=-1;j.r=-1;return;}
if(tmp.l>j.l)
j.r=tmp.l-1;
else j.l=tmp.r+1;
} int main()
{
int n;
while(~scanf("%d",&n))
{
int l,r;
char op[5];
cnt=0;
for(int i=1;i<=n;i++)
{
scanf("%d %d",&l,&r);
scanf("%s",op);
if(op[0]=='w')
{ne[++cnt].l=l;ne[cnt].r=r;}
else
{
node tmp=(node){l,r};
for(int j=1;j<=cnt;j++)
if(inter(tmp,ne[j]))
update(tmp,ne[j]);
}
}
sort(ne+1,ne+cnt+1,cmp);
node ans=(node){0,0};
for(int i=1;i<=cnt;)
{
node cur=(node){ne[i].l,ne[i].r};
if(cur.l<0) continue;
while(inter(cur,ne[i]))
{cur.r=ne[i].r;i++;}
if(cur.r-cur.l+1>ans.r-ans.l+1)
ans=cur;
}
if(ans.l!=0&&ans.r!=0)
printf("%d %d\n",ans.l,ans.r);
else printf("Oh, my god\n");
}
return 0;
}

  

ZOJ 2301 离散化的更多相关文章

  1. ZOJ 2301/HDU 1199 线段树+离散化

    给这个题目跪了两天了,想吐简直 发现自己离散化没学好 包括前一个离散化的题目,实际上是错了,我看了sha崽的博客后才知道,POJ那题简直数据弱爆了,本来随便一组就能让我WA掉的,原因在于离散化的时候, ...

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

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

  3. HDU 1199 &amp;&amp; ZOJ 2301 线段树离散化

    一段长度未知的线段.一种操作:a b c ,表示区间[a,b]涂为颜色C,w代表白色,b代表黑色,问终于的最长连续白色段,输出起始位置和终止位置 离散化处理.和寻常的离散化不同,须要把点化成线段.左闭 ...

  4. ZOJ 2301 Color the Ball (离散化+线段树)

    题意:有从 1 开始递增依次编号的很多球,开始他们都是黑色的,现在依次给出 n 个操作(ai,bi,ci),每个操作都是把编号 ai 到 bi 区间内 的-所有球涂成 ci 表示的颜色(黑 or 白) ...

  5. ZOJ 2301 Color the Ball 线段树(区间更新+离散化)

    Color the Ball Time Limit: 2 Seconds      Memory Limit: 65536 KB There are infinite balls in a line ...

  6. ZOJ 3042 City Selection II 【序】【离散化】【数学】

    题意: 输入数据n,m.n代表工厂的数量,m代表城市的数量. 接下来n+m行为工厂和城市的坐标. 规定如图所示方向刮风,工厂的air会污染风向地区的air. 注意,工厂和城市的坐标表示的是从x到x+1 ...

  7. ZOJ 3790 Consecutive Blocks (离散化 + 暴力)

    题目链接 虽然是一道暴力的题目,但是思路不好想.刚开始还超时,剪枝了以后1200ms,不知道为什么还是这么慢. 题意:给你n个点,每个点有一种颜色ci,给你至多k次删除操作,每次删除一个点,问最多k次 ...

  8. ZOJ 3299-Fall the Brick(线段树+离散化)

    题意: n个区间 ,给出区间的左右坐标 ,区间内填满宽度为1的箱子,有m个板子给出板子的高度和左右坐标(同高度不重叠) 所有箱子从上向下落,求每块板子能接到的箱子数. 分析: 首先给的区间很大,一开始 ...

  9. ZOJ 2747 Paint the Wall(离散化+暴力)题解

    题意:给你一个面,然后涂颜色,问你最后剩多少颜色,每种颜色面积. 思路:第一反应是二维线段树,代码又臭又长,可以做.但是这题暴力+离散化就可以过.可以看到他给的n只有100,也就是说最坏情况下会涂10 ...

随机推荐

  1. lua基础学习(一)

    设计目的: 为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.   特性: 1.编译之后仅仅100k,可以很方便嵌入别的程序里. 2.可扩张性,Lua提供了非常易于使用的扩展接口和机制:由宿 ...

  2. (转)使用JMeter对秒杀示例进行性能测试

    背景 秒杀是我们ServiceComb开源团队以领域驱动设计(DDD)为背景,从零开始构建一个微服务架构的示例项目:在<秒杀开发历程>系列博文中提到它作为一个高并发压力场景的应用,采用了C ...

  3. centos7部署rabbitMq

    目录 一.消息中间件相关知识... 1 1.概述... 1 2.消息中间件的组成... 1 3 消息中间件模式分类... 2 4 消息中间件的优势... 3 5 消息中间件应用场景... 4 6 消息 ...

  4. SpringMvc 整合mybatis项目搭建

    1.使用idea创建maven项目 2.在项目src目录下 添加java文件夹 并设置类型为sources,添加resource文件夹 设置为resources 4.修改pom文件 添加引用 < ...

  5. [转帖]Windows与Linux的命令行命令对比

    Windows与Linux的命令行命令对比 https://www.cnblogs.com/sztom/p/10785140.html * Windows不区分大小写,Linux区分大小写的. sn ...

  6. 手撕ES6--Promise

    手撕ES6--Promise:https://www.jianshu.com/p/0925eae38d2c 手写一个Promise,附源码分析:https://blog.csdn.net/weixin ...

  7. Mac上安装配置Go语言,其实很简单(一)

    下载Go语言可以去:Go语言中文网 安装及自己选择是否修改GOPATH 下载下来后双击安装就好,使用 go version 查看安装版本: 在Mac上安装完成后,会自动设置一些环境变量,使用 go e ...

  8. Flask-wtf导入Regexp规则库验证手机号码合法性(测试通过)

    手机号码在项目有着很重要的地位,保证用户输入的号码准确无误就显得很关键. 废话不多说,现在页面中引入Regexp规则库: from wtforms.validators import Regexp 验 ...

  9. 【vsCode】识别.vue/一键生成.vue模板文件

    1.安装插件Vetur 结果 ---> .vue代码识别彩标 2.配置.vue文件模板,以便快速一键生成格式化 2.1新建代码片段 File->Preferences->User S ...

  10. 2019-11-29-Roslyn-如何在-Target-引用-xaml-防止文件没有编译

    title author date CreateTime categories Roslyn 如何在 Target 引用 xaml 防止文件没有编译 lindexi 2019-11-29 08:58: ...