ZOJ 2301/HDU 1199 线段树+离散化
给这个题目跪了两天了,想吐简直
发现自己离散化没学好
包括前一个离散化的题目,实际上是错了,我看了sha崽的博客后才知道,POJ那题简直数据弱爆了,本来随便一组就能让我WA掉的,原因在于离散化的时候,缩小数据规模的同时,没有考虑到误差,比如 1 4 6 8,离散化之后是1 2 3 4,我如果覆盖了1 2和3 4,表面上好像全部覆盖了,实际数据并没有覆盖。。所以我只能说那道题目我其实错了,并没有真正做出离散化出来。。。现在用这道题来弥补。
color the ball,ball的编号可以从1 到2^31,不可能开这么大线段树,但是其实测试数据只有N=2000*2组,所以必然是离散化,初始的时候,所有球都是黑色的,然后N组数组,a b w(b),说明把 区间 a到b染成(white or black),最后求最长的连续白色的区间的左右边界
瞬间想到上次求最大连续子串,线段树节点里用一个除了记录最大值,前驱最大值,后驱最大值以外,专门用个lm ,rm记录题目需要的坐标。这些都好处理,基本的线段树区间合并。要注意的是落实的叶子节点的时候,不能单纯以离散化之后的区间长度为衡量标准,要回到原区间去,原区间最长才是真正的最长。这个也好操作,读入数据的时候已经把原始区间保存下来了。
然后就是坑爹的离散化了,还是sha崽说得对,如果离散的两点距离大一1的话,必须要中间手动插点,以确保覆盖过程不会出现问题
而这道题目应该这样离散,如果原始的两点相差为2的话,中间插入一点就行,如果大于2的话,就要插入两点,一点为a+1,一点为b-1(假设a,b就为原始的两个点),这样求得的区间就不会出错,很简单一个事例,1 4 7 8,离散之后是1 2 3 4,先染1 4为白,再染4 8为黑,这样的话,会输出1 1为最长白色,但是明显的最大白色是1到3,所以这就是离散没有插中间点的弊端。
恩,讲完了,不得不吐槽一下,ZOJ上的这道题目数据奇坑,我说我为什么老是访问了非法内存。TMD,它输入的a b有可能a比b大。。。尼玛我加了判断之后才过得。。。。。。。。之前一直SF段错误,弄得我不明不白、
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 24010
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1 using namespace std;
struct node
{
int pl,pr;
int color;
} pos[N<<];
int xl[N<<];
int mc[N<<],lc[N<<],rc[N<<];
int lm[N<<],rm[N<<];
int pd[N<<];
int ldd[N<<];
int rdd[N<<];
void getup(int rt,int l,int r)
{
if (mc[rt<<]>=mc[rt<<|])
{
mc[rt]=mc[rt<<];
lm[rt]=lm[rt<<];
rm[rt]=rm[rt<<];
}
else
{
mc[rt]=mc[rt<<|];
lm[rt]=lm[rt<<|];
rm[rt]=rm[rt<<|];
}
lc[rt]=lc[rt<<];
rc[rt]=rc[rt<<|];
ldd[rt]=ldd[rt<<];
rdd[rt]=rdd[rt<<|];
int mid=(l+r)>>;
if (ldd[rt<<]==mid &&lc[rt<<|]> &&lc[rt<<]>)
{
lc[rt]+=lc[rt<<|];
ldd[rt]=ldd[rt<<|];
}
if (rdd[rt<<|]==mid+ && rc[rt<<]>&&rc[rt<<|]>)
{
rc[rt]+=rc[rt<<];
rdd[rt]=rdd[rt<<];
}
if (mc[rt]<rc[rt<<]+lc[rt<<|] )
{
mc[rt]=rc[rt<<]+lc[rt<<|];
lm[rt]=rdd[rt<<];
rm[rt]=ldd[rt<<|];
} }
void build(int l,int r,int rt)
{
mc[rt]=lc[rt]=rc[rt]=;
lm[rt]=rm[rt]=pd[rt]=-;
ldd[rt]=l;
rdd[rt]=r;
if (l>=r)
return;
int mid=(l+r)>>;
build(Lson);
build(Rson);
//getup(rt);
}
int bs(int data,int l,int r)
{
int mid;
while (l<r)
{
mid=(l+r)/;
if (xl[mid]==data) return mid;
if (xl[mid]<data) l=mid+;
else r=mid;
}
return l;
}
void pushdown(int rt,int l,int r)
{
if (pd[rt]==- || l>=r) return;
int mid=(l+r)>>;
int ll=rt<<,rr=rt<<|;
mc[ll]=lc[ll]=rc[ll]=pd[rt]*(xl[mid]-xl[l]+);
mc[rr]=lc[rr]=rc[rr]=pd[rt]*(xl[r]-xl[mid+]+);
if (pd[rt]==)
{
lm[ll]=l;
rm[ll]=mid;
lm[rr]=mid+;
rm[rr]=r; ldd[ll]=mid;
rdd[ll]=l;
ldd[rr]=r;
rdd[rr]=mid+;
}
else
{
lm[ll]=rm[ll]=lm[rr]=rm[rr]=-;
ldd[ll]=l;
rdd[ll]=mid;
ldd[rr]=mid+;
rdd[rr]=r;
}
pd[ll]=pd[rr]=pd[rt];
pd[rt]=-;
}
void fix(int L,int R,int color,int l,int r,int rt)
{
if (L<=l && r<=R)
{
mc[rt]=lc[rt]=rc[rt]=color*(xl[r]-xl[l]+);
if (color==)
{
lm[rt]=l;
rm[rt]=r;
ldd[rt]=r;
rdd[rt]=l;
}
else
{
lm[rt]=rm[rt]=-;
}
pd[rt]=color;
return;
}
pushdown(rt,l,r);
int mid=(l+r)>>;
//cout<<" l is "<<l<<" r is "<<r<<" "<<endl;
if (L>mid) fix(L,R,color,Rson);
else
if (R<=mid) fix(L,R,color,Lson);
else
if (L<=mid && R>mid)
{
fix(L,R,color,Lson);
fix(L,R,color,Rson);
}
getup(rt,l,r);
//cout<<mc[rt]<<" "<<" "<<lm[rt]<<" "<<rm[rt]<<" "<<lc[rt]<<" "<<rc[rt]<<endl;
}
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
if (n==){
puts("Oh, my god");
continue;
}
int i,j;
char ch[];
int cur=,a,b;
for (i=;i<=n;i++)
{
scanf("%d%d%s",&a,&b,ch);
pos[i].pl=a;
pos[i].pr=b;
xl[++cur]=a;
xl[++cur]=b;
if (ch[]=='w')
pos[i].color=;
else
pos[i].color=;
}
sort(xl+,xl+cur+); int m=;
for (i=;i<=*n;i++){
//?printf("%d %d\n",i,xl[i]);
if (xl[i]!=xl[i-]){
xl[++m]=xl[i]; }
}
cur=m;
for (i=;i<=cur;i++){
if (xl[i]-xl[i-]>)
xl[++m]=xl[i-]+;
if (xl[i]-xl[i-]>)
xl[++m]=xl[i]-;
}
/*
for (j=m;j>1;j--)
{
if (xl[j]!=xl[j-1]+1)
xl[++m]=xl[j-1]+1;
}
*/
sort(xl+,xl+m+);
//for (i=1;i<=m;i++)
//cout<<i<<" xxx "<<xl[i]<<endl;
build(,m,); for (i=;i<=n;i++)
{
int pa=bs(pos[i].pl,,m);
int pb=bs(pos[i].pr,,m);
if (pa>pb){
int temp=pa;
pa=pb;
pb=temp;
}
//if (pa<1||pa>m||pb<1||pb>m) continue;
//cout<<pa<<" pp "<<pb<<endl;
//
//cout<<lm[1]<<" pass "<<rm[1]<<endl; fix(pa,pb,pos[i].color,,m,);
}
if (lm[]==-||rm[]==-)
puts("Oh, my god");
else
{
printf("%d %d\n",xl[lm[]],xl[rm[]]);
}
}
return ;
}
ZOJ 2301/HDU 1199 线段树+离散化的更多相关文章
- ZOJ 2301 / HDU 1199 Color the Ball 离散化+线段树区间连续最大和
题意:给你n个球排成一行,初始都为黑色,现在给一些操作(L,R,color),给[L,R]区间内的求染上颜色color,'w'为白,'b'为黑.问最后最长的白色区间的起点和终点的位置. 解法:先离散化 ...
- hdu 5792 线段树+离散化+思维
题目大意: Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d,1≤a< ...
- HDU 1542 线段树离散化+扫描线 平面面积计算
也是很久之前的题目,一直没做 做完之后觉得基本的离散化和扫描线还是不难的,由于本题要离散x点的坐标,最后要计算被覆盖的x轴上的长度,所以不能用普通的建树法,建树建到r-l==1的时候就停止,表示某段而 ...
- HDU 4288 线段树+离散化
题意: n个操作 在[1, 100000] 的区间上add 或del数( 必不会重复添加或删除不存在的数) sum 求出整个集合中 (下标%5 == 3 位置) 的数 的和 注意数据类型要64位 ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 1542 线段树扫描(面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDU5124:lines(线段树+离散化)或(离散化思想)
http://acm.hdu.edu.cn/showproblem.php?pid=5124 Problem Description John has several lines. The lines ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- poj 2528 Mayor's posters(线段树+离散化)
/* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...
随机推荐
- B. Yet Another Crosses Problem
B. Yet Another Crosses Problem time limit per test 2 seconds memory limit per test 256 megabytes inp ...
- C#:string、stringBuffer、stringBuilder的区别
好脑子不如烂笔头,总是记不住,记下来吧 依然 搬运 地址: http://blog.csdn.net/qq_28187979/article/details/76607253 ------------ ...
- JSP编码规范
JSP包含文件 <%@ include file=”relativeURI”%> //在翻译阶段执行加载,比如:校验是否登录通过 jsp的include指令元素读入指定页面的内容.并把这些 ...
- tensorflow学习笔记--dataset使用,创建自己的数据集
数据读入需求 我们在训练模型参数时想要从训练数据集中一次取出一小批数据(比如50条.100条)做梯度下降,不断地分批取出数据直到损失函数基本不再减小并且在训练集上的正确率足够高,取出的n条数据还要是预 ...
- Docker部署Python应用程序
Docker部署Python应用程序 1. 单个py文件部署 生成Dockerfile 文件 插件用的豆瓣的镜像,,重置时间(容器的默认时间是UTC时间与宿主机的相差8小时). 文中需要三个插件(pe ...
- 实验吧-web-天下武功唯快不破(Python中byte和str的转换)
题目:看看响应头 打开网站,既然已经提示我们看响应头了,那我们就看看呗(习惯bp,也可直接F12查看) 可以看到,响应头部分有个FLAG,而且有提示:please post what you find ...
- MFC之拆分窗口
7.3.1 多视图 许多文档只要求单个视图,但每个文档可支持一个以上的视图.为了帮助编程人员实现多个视图,文档对象保留它的视图列表.为添加和移去视图提供成员函数,例如,提供的UpdateAllView ...
- 第一部分 JavaScript语言核心(三)
第六章 对象 P123 在ES3中,点运算符后的标识符不能是保留字.如果一个对象的属性名是保留字,name必须使用方括号的形式访问它们,如o["for"]和o["clas ...
- 【剑指Offer】面试题11. 旋转数组的最小数字
题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个 ...
- HDU - 6043 KazaQ's Socks(找规律)
题意:有n双袜子,编号1到n,放在衣柜里,每天早晨取衣柜中编号最小的袜子穿,晚上将这双袜子放在篮子里,当篮子里有n-1双袜子时,清洗袜子,直到第二天晚上才洗好,并将洗好的袜子重新放回衣柜. 分析:规律 ...