ZOJ 2301 离散化
题目链接: 题意是说,有从 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 离散化的更多相关文章
- ZOJ 2301/HDU 1199 线段树+离散化
给这个题目跪了两天了,想吐简直 发现自己离散化没学好 包括前一个离散化的题目,实际上是错了,我看了sha崽的博客后才知道,POJ那题简直数据弱爆了,本来随便一组就能让我WA掉的,原因在于离散化的时候, ...
- ZOJ 2301 / HDU 1199 Color the Ball 离散化+线段树区间连续最大和
题意:给你n个球排成一行,初始都为黑色,现在给一些操作(L,R,color),给[L,R]区间内的求染上颜色color,'w'为白,'b'为黑.问最后最长的白色区间的起点和终点的位置. 解法:先离散化 ...
- HDU 1199 && ZOJ 2301 线段树离散化
一段长度未知的线段.一种操作:a b c ,表示区间[a,b]涂为颜色C,w代表白色,b代表黑色,问终于的最长连续白色段,输出起始位置和终止位置 离散化处理.和寻常的离散化不同,须要把点化成线段.左闭 ...
- ZOJ 2301 Color the Ball (离散化+线段树)
题意:有从 1 开始递增依次编号的很多球,开始他们都是黑色的,现在依次给出 n 个操作(ai,bi,ci),每个操作都是把编号 ai 到 bi 区间内 的-所有球涂成 ci 表示的颜色(黑 or 白) ...
- ZOJ 2301 Color the Ball 线段树(区间更新+离散化)
Color the Ball Time Limit: 2 Seconds Memory Limit: 65536 KB There are infinite balls in a line ...
- ZOJ 3042 City Selection II 【序】【离散化】【数学】
题意: 输入数据n,m.n代表工厂的数量,m代表城市的数量. 接下来n+m行为工厂和城市的坐标. 规定如图所示方向刮风,工厂的air会污染风向地区的air. 注意,工厂和城市的坐标表示的是从x到x+1 ...
- ZOJ 3790 Consecutive Blocks (离散化 + 暴力)
题目链接 虽然是一道暴力的题目,但是思路不好想.刚开始还超时,剪枝了以后1200ms,不知道为什么还是这么慢. 题意:给你n个点,每个点有一种颜色ci,给你至多k次删除操作,每次删除一个点,问最多k次 ...
- ZOJ 3299-Fall the Brick(线段树+离散化)
题意: n个区间 ,给出区间的左右坐标 ,区间内填满宽度为1的箱子,有m个板子给出板子的高度和左右坐标(同高度不重叠) 所有箱子从上向下落,求每块板子能接到的箱子数. 分析: 首先给的区间很大,一开始 ...
- ZOJ 2747 Paint the Wall(离散化+暴力)题解
题意:给你一个面,然后涂颜色,问你最后剩多少颜色,每种颜色面积. 思路:第一反应是二维线段树,代码又臭又长,可以做.但是这题暴力+离散化就可以过.可以看到他给的n只有100,也就是说最坏情况下会涂10 ...
随机推荐
- python map 的用法
map的用法 ——.我们来分析map在python的源码 class map(object): """ map(func, *iterables) --> map ...
- mac搭建apace和php开发环境
启动Apache 1 先介绍几个命令 // 启动Apache服务 sudo apachectl start // 重启Apache服务 sudo apachectl restart // 停止Ap ...
- 插入排序--python
import random def insert_sort(nums): # 排序趟数 for i in range(1, len(nums)): current = nums[i] pre_inde ...
- [转帖]预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响
预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响 https://cloud.tencent.com/developer/article/1447879 所有的 版本 ...
- gRPC编译教程
windows平台的编译 一.编译openssl ① 安装perl(可以使用ActivePerl),执行perl Configure VC-WIN64A no-asm .在这里解释一下参数含义,VC- ...
- homestead安装swoole扩展
配置好ubuntu的国内镜像源并更新 查看php版本,并安装对应php版本的dev sudo apt install php7.2-dev 配置pecl sudo pecl channel-updat ...
- HTTP请求报文(请求行、请求头、请求体)
HTTP协议 1.简介 HTTP协议(Hyper Text Transfer Protocol,超文本传输协议),是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的 ...
- Linux 查看系统相关信息(系统发型版本及内核版本等)
以下为 Linux 以下信息查看命令,记录以备用 # uname -a # 查看内核/操作系统/CPU信息 # /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # ...
- JVM常用虚拟机命令汇总
title: JVM常用虚拟机命令汇总 comments: false date: 2019-07-22 11:45:33 description: 总结一下常用的JVM虚拟机启动命令. catego ...
- 银联支付SDK集成
下载地址 https://open.unionpay.com/upload/download/Development_kit85427986.rar其实我找了半个小时 也不知道怎么就下载好了 这个我在 ...