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 ...
随机推荐
- PMP项目正常估算时间
最佳时间段+正常时间段*+最差时间段)/=正常估算时间. 项目经理小李对某活动工期进行估算时,发现人员的熟练程度和设备供应是否及时对工期至关重要.如果形成最有利组合时,预计17天可以完成:如果形成最不 ...
- 【转帖】大话Spring Cloud
springcloud(一):大话Spring Cloud 2017/05/01 http://www.ityouknow.com/springcloud/2017/05/01/simple-sp ...
- JVM 堆内存设置原理(转)
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- 极*Java速成教程 - (1)
序言 众所周知,程序员需要快速学习新知识,所以就有了<21天精通C++>和<MySQL-从删库到跑路>这样的书籍,Java作为更"高级"的语言也不应该落后, ...
- ZOJ 2836 Number Puzzle 题解
题面 lcm(x,y)=xy/gcd(x,y) lcm(x1,x2,···,xn)=lcm(lcm(x1,x2,···,xn-1),xn) #include <bits/stdc++.h> ...
- kafka 教程(三)-远程访问
远程连接 kafka 配置 默认的 kafka 配置是无法远程访问的,解决该问题有几个方案. 方案1 advertised.listeners=PLAINTEXT://IP:9092 注意必须是 ip ...
- 搜索专题:Balloons
搜索专题:Balloons 这道题一看与时间有关,第一想到的就是BFS,定义一个状态,包含每一个状态的剩余气球数,已经进行的时间和每一个志愿者上一次吹气球的时间: 每一次状态转换时,检查是否有没有使用 ...
- 国内高速下载Docker
一般情况下,我们可以从Docker官网下载docker安装文件,但是官方网站由于众所周知的原因,不是访问慢,就是下载慢.下载docker安装包动不动就要个把小时,真是极大的影响工作效率. 在这里推荐一 ...
- vue-cli3.0中使用 postcss-pxtorem
vue.config.js module.exports = { lintOnSave: true, css: { loaderOptions: { postcss: { plugins: [ req ...
- ALV打印不显示打印界面的问题
用OO的方式screen0 不画屏幕会产生这个问题,解决办法就是不用screen0 要自己画一个区域