附动态线段树AC代码

http://acm.hdu.edu.cn/showproblem.php?pid=1199

因为昨天做了一道动态线段树的缘故,今天遇到了这题没有限制范围的题就自然而然想到了动态线段树的解法,写完看题解发现原来只要离散化就好了(干。。),总结了一下这题和昨天hdu5367的区别在于,虽然都是两题范围超级大的线段树,但是昨天的强制要求在线求解,只能选择空间复杂度更大一些的动态线段树来求解,而今天的这题可以选择离线操作,因而可以采用先读入所有输入,离散化之后建树的方法来操作。下次遇到这样的题还是应当优先考虑离散化。

在一个全部涂黑色的条子上涂上一些白色或黑色的片段,问最大白色片段。

仅仅从线段树维护节点的角度上来看很简单,维护最大白色片段,左边最大白色片段,右边最大白色片段就好了。

由于条子的长度长达1-INT_MAX;

采用离散化,或者像我一样失了智去用动态线段树的方法,也能AC

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
#define For(i, x, y) for(int i=x; i<=y; i++)
#define _For(i, x, y) for(int i=x; i>=y; i--)
#define Mem(f, x) memset(f, x, sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i = 0; i <= N ; i ++) u[i].clear();
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
using namespace std;
typedef vector<int> VI;
const double eps = 1e-;
const int maxn = ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
inline int read()
{
int now=;register char c=getchar();
for(;!isdigit(c);c=getchar());
for(;isdigit(c);now=now*+c-'',c=getchar());
return now;
}
int N,M;
struct Tree{
LL sum; //最大连续
LL lsum; //左连续
LL rsum; //右连续
int lt;
int rt;
int lazy;
void init(){
lsum = rsum = sum = lt = rt = ;
lazy = -;
}
}tree[maxn * ];
int tot;
void check(int &t){
if(t) return;
t = ++tot;
tree[t].init();
}
void add(int &t,LL L,LL R,int v){
if(v){
tree[t].sum = tree[t].lsum = tree[t].rsum = R - L + ;
}else{
tree[t].sum = tree[t].lsum = tree[t].rsum = ;
}
tree[t].lazy = v;
}
void Pushdown(int& t,LL L,LL R){
if(tree[t].lazy == -) return;
int &lt = tree[t].lt; int &rt = tree[t].rt;
LL M = (L + R) >> ;
check(lt); check(rt);
add(lt,L,M,tree[t].lazy);
add(rt,M + ,R,tree[t].lazy);
tree[t].lazy = -;
}
void Pushup(int t,LL L,LL R){
int &ls = tree[t].lt; int &rs = tree[t].rt;
LL M = (L + R) >> ;
check(ls); check(rs);
tree[t].sum = max(tree[ls].sum,tree[rs].sum);
tree[t].sum = max(tree[t].sum,tree[ls].rsum + tree[rs].lsum);
tree[t].lsum = tree[ls].lsum;
if(tree[ls].lsum == M - L + ){
tree[t].lsum = tree[ls].lsum + tree[rs].lsum;
}
tree[t].rsum = tree[rs].rsum;
if(tree[rs].rsum == R - M){
tree[t].rsum = tree[rs].rsum + tree[ls].rsum;
}
}
void update(int &t,int q1,int q2,LL L,LL R,int v){
check(t);
if(q1 <= L && R <= q2){
add(t,L,R,v);
return;
}
Pushdown(t,L,R);
LL m = (L + R) >> ;
if(q1 <= m) update(tree[t].lt,q1,q2,L,m,v);
if(q2 > m) update(tree[t].rt,q1,q2,m + ,R,v);
Pushup(t,L,R);
}
LL Left,Right;
void query(int t,LL L,LL R){
if(L == R){
Left = L;
Right = R;
return;
}
check(tree[t].lt); check(tree[t].rt);
int ls = tree[t].lt; int rs = tree[t].rt;
LL M = (L + R) >> ;
if(tree[ls].sum == tree[t].sum) query(ls,L,M);
else if(tree[rs].sum == tree[t].sum) query(rs,M + ,R);
else{
Left = M - tree[ls].rsum + ;
Right = M + tree[rs].lsum;
return;
} }
int main()
{
while(~Sca(N)){
LL L = ; LL R = ;
tot = ;
int root = ;
update(root,L,R,L,R,);
For(i,,N){
LL l,r;
char op[];
scanf("%lld%lld%s",&l,&r,&op);
if(op[] == 'w'){
update(root,l,r,L,R,);
}else{
update(root,l,r,L,R,);
}
}
if(!tree[root].sum){
puts("Oh, my god");
continue;
}
query(root,L,R);
printf("%lld %lld\n",Left,Right);
}
return ;
}

HDU1199 动态线段树 // 离散化的更多相关文章

  1. POJ 2528 Mayor's posters(线段树+离散化)

    Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...

  2. poj 2528 Mayor's posters(线段树+离散化)

    /* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...

  3. [poj2528] Mayor's posters (线段树+离散化)

    线段树 + 离散化 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayor ...

  4. [UESTC1059]秋实大哥与小朋友(线段树, 离散化)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1059 普通线段树+离散化,关键是……离散化后建树和查询都要按照基本法!!!RE了不知道多少次………………我真 ...

  5. poj 2528 Mayor's posters 线段树+离散化技巧

    poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...

  6. BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针

    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...

  7. D - Mayor's posters(线段树+离散化)

    题目: The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campai ...

  8. 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex

    题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...

  9. HDU5367 思维map // 动态线段树

    地主毛毛有n座山,这些山在地主家门前排成一条直线.这些山一开始均有相同的高度.  每一天,毛毛都会要求花花开挖机把几座山挖掉一定高度,或者给一些山堆上一些高度.并且要求花花报告现在有多少座山属于“高山 ...

随机推荐

  1. Notes of Daily Scrum Meeting(12.22)

    今天的团队任务总结如下: 团队成员 今日团队工作 陈少杰 进行网络连接的调试 王迪 优化搜索的算法 金鑫 准备前台的接口,查阅相关的资料 雷元勇 优化算法,对搜索进行测试 高孟烨 修改UI的接口,准备 ...

  2. Linux内核第七节 20135332武西垚

    预处理.编译.链接和目标文件的格式 可执行程序是怎么得来的 以C语言为例,c代码经过编译器的预处理,编译成汇编代码,由汇编器编译成目标代码,再链接成可执行文件,由操作系统加载到cpu里来执行. (截图 ...

  3. linux 下gcc 编译结构体问题

    最近在linux 学习c语言的编程,发现好多原来在vs 上的在linux 都编译不过去,今天就遇到了一个问题就是结构体的编译的问题, 结构体大概的定义是 struct Node{ int a; int ...

  4. PHP 闭包获取外部变量和global关键字声明变量的区别

    最近在学习workerman的时候比较频繁的接触到回调函数,使用中经常会因为worker的使用方式不同,会用这两种不同的方式去调用外部的worker变量,这里就整理一下PHP闭包获取外部变量和glob ...

  5. Jira 自定义工作流

    一.添加修改工作流 打开 设置--问题--工作流 复制一个工作流,然后进去编辑页面 添加状态 增加转换动作 切换到文本,设置跳转过程中的事件 针对Stop Progress事件,修改跳转界面(界面需先 ...

  6. Docker安装指定版本

    今天新增一个Docker服务器,Docker安装顺利,启动hello-world测试的时候却出现了问题: $ docker run hello-worldUnable to find image 'h ...

  7. 在 Linux 虚拟机中手动安装或升级 VMware Tools

    对于 Linux 虚拟机,您可以使用命令行工具手动安装或升级 VMware Tools. 本次Linux 虚拟机为CentOS6.5 先决条件开启虚拟机.确认客户机操作系统正在运行.由于 VMware ...

  8. html5應用緩存

    HTML5使用了應用緩存,就是web應用緩存,使得在離線狀態下可以訪問web'應用. 應用緩存的優點: 離線訪問-可以在無網的狀態下訪問應用 速度-有緩存的應用加載更快 瀏覽器負載-瀏覽器只從服務器加 ...

  9. 利用caffe自带的Makefile编译自定义so文件

    1.文件目录结构 caffe-root |--include |--example |--modules |--test.h |--test.cpp |--python |--src |--tools ...

  10. http://python.jobbole.com/85056/ 简单 12 步理解 Python 装饰器,https://www.cnblogs.com/deeper/p/7482958.html另一篇文章

    好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生们从接触后就一直纠结的问题.那是因为装饰器确实难以理解!想弄明白装饰器,需要理解一些函数式编程概念,并且要对Python中函数定义和函 ...