UVA 12663 第九届省赛 高桥与低桥 线段树
题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次
看下数据10的五次方,10的五次方的硬循环是避免不了了,很明显在计算被淹次数的时候要能缩到logN的复杂度才好。
于是想到先对桥由低到高排一下序,然后获取前一次的落水值和这次的涨水值,只要桥高度在涨落直接的必定是又被淹了一次。要多次对序列的某个区间进行加操作,自然是线段树了,确定区间的时候,就用二分,在进行线段树的时候 用懒惰标记
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define Lson (rt<<1),l,mid
#define Rson (rt<<1|1),mid+1,r
#define N 100010
using namespace std;
int n,m,k;
int d[N*],maxk[N*],flag[N*],A[N];
void up(int rt)
{
d[rt]=d[rt<<]+d[rt<<|];
maxk[rt]=maxk[rt<<]+maxk[rt<<|];
}
void pushdown(int rt,int l,int r)
{
if (l>=r || flag[rt]==) return;
int ll=rt<<;
int rr=rt<<|;
int mid=(l+r)>>;
d[ll]+=flag[rt];
d[rr]+=flag[rt];
flag[ll]+=flag[rt];
flag[rr]+=flag[rt];
flag[rt]=;
if (mid-l+== && d[ll]>=k)
maxk[ll]=;
if (r-mid== && d[rr]>=k)
maxk[rr]=;
// up(rt);
}
void add(int rt,int l,int r,int L,int R)
{
if (L<=l && r<=R)
{
pushdown(rt,l,r);
d[rt]+=r-l+;
if (l>=r && d[rt]>=k)
maxk[rt]=;
flag[rt]++;
return;
}
pushdown(rt,l,r);
int mid=(l+r)>>;
if (L<=mid)
add(Lson,L,R);
if (R>mid)
add(Rson,L,R);
up(rt);
}
void incase(int rt,int l,int r)
{
if (l>=r)
{
if(d[rt]>=k)
maxk[rt]=;
return;
}
pushdown(rt,l,r);
int mid=(l+r)>>;
incase(Lson);
incase(Rson);
up(rt);
}
void build(int rt,int l,int r)
{
flag[rt]=;
if(l>=r)
{
d[rt]=;
maxk[rt]=;
flag[rt]=;
return;
}
int mid=(l+r)>>;
build(Lson);
build(Rson);
up(rt);
}
int main()
{
int kase=,a,b,cur;
while (scanf("%d%d%d",&n,&m,&k)!=EOF)
{
for (int i=;i<=n;i++){
scanf("%d",&A[i]);
}
sort(A+,A++n);
build(,,n);
cur=;
for (int i=;i<=m;i++)
{
scanf("%d%d",&a,&b);
int l=upper_bound(A+,A++n,cur)-A;
int r=upper_bound(A+,A++n,a)-A;
r--;
if (l<=r)
add(,,n,l,r);
cur=b;
}
incase(,,n);
printf("Case %d: %d\n",++kase,maxk[]);
}
return ;
}
好久没写线段树了,这个题一写完就WA了,后来发现,首先二分出来的区间先要判断下来,若区间不存在就不要进行插入了,还有就是pushdown,我一开始是计划每次只增加1
,要进行下一次懒惰标记的时候先把上一次 的懒惰标记down下去,结果在pushdown函数里面没判断儿子的标记,如果儿子标记了 也得先down儿子啊。结果这样超时了,还是不能这样,索性就每次懒惰标记直接++,最后把整个标记down下去就行
发现其实d数组完全没有必要的,这个值没有必要维护,只是一开始写的时候没计划的太清,就这样写了。其实没必要。
最后为了避免某个懒惰标记未被down下去,最后还用个incase函数再走一遍线段树,把值给更新一下。
UVA 12663 第九届省赛 高桥与低桥 线段树的更多相关文章
- nyoj1273 河南省第九届省赛_"宣传墙"、状压DP+矩阵幂加速
宣传墙 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...
- NYOJ 1272 表达式求值 第九届省赛 (字符串处理)
title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...
- 河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题
表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...
- csuoj 1335: 高桥和低桥
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1335 1335: 高桥和低桥 Time Limit: 1 Sec Memory Limit: 1 ...
- H - 高桥和低桥
H - 高桥和低桥 Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Submit Sta ...
- TZOJ 4602 高桥和低桥(二分或树状数组+二分)
描述 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”.举 ...
- CSU 1335: 高桥和低桥 (二分查找,树状数组)
Description 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不 ...
- 2016湖南省赛 I Tree Intersection(线段树合并,树链剖分)
2016湖南省赛 I Tree Intersection(线段树合并,树链剖分) 传送门:https://ac.nowcoder.com/acm/contest/1112/I 题意: 给你一个n个结点 ...
- UVA 1400 1400 - "Ray, Pass me the dishes!"(线段树)
UVA 1400 - "Ray, Pass me the dishes!" option=com_onlinejudge&Itemid=8&page=show_pr ...
随机推荐
- 条件判断语句(if-else)
if-else 语法 if-else 语法,只有一个语句块被执行 if 和 else都是Java中的关键字 if 语法 把 if-else 看做一个表达式,程序整体还是顺序执行的 if (boolea ...
- P1006 换个格式输出整数
这道题相较于上一题来说就简单了许多.看题. 怎么感觉这道题有点类似P1002写出这个数.流程差不多,思路大致是先求出每一位上的数,然后根据 百十个 的顺序输出结果.题目比较简单,不做赘述,贴代码 代码 ...
- Windows Server 2008 R2 ntoskrnl.exe 引起蓝屏故障,重新启动
前不久在HP ProLiant DL360 G6的服务器上面安装了Windows Server 2008 R2,系统一到晚上凌晨就出现蓝屏.重启现象,并且在 C:\Windows\Minidump 目 ...
- 【pwnable.kr】lotto
pwnable.好像最近的几道题都不需要看汇编. ssh lotto@pwnable.kr -p2222 (pw:guest) 直接down下来源码 #include <stdio.h> ...
- dede:list 与 dede:arclist 的区别
1.{dede:list}是用于列表页的文章列表调用,通常是用于list_article.htm页面,这个文章列表是可以分页的. 功能说明:表示列表模板里的分页内容列表适用范围:仅列表模板 list_ ...
- 3-Java逻辑控制语句
目录 Java选择结构 Java循环结构 return.break.continue Math.random()的使用和条件运算符 1.Java选择结构 1.1.if(布尔表达式)单选结构 - 当布尔 ...
- Compare/ContrastEssay你真的会写了吗?
Compare/Contrast Essay也是留学生们常遇到的一种作业类型,但是很多留学生不知道怎么写.本文HotEssay为大家整理了Compare/Contrast Essay写作方法,希望对大 ...
- Bean XML 配置(4)- 自动装配
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...
- C# Stream篇(六) -- BufferedStream
BufferedStream 目录: 简单介绍一下BufferedStream 如何理解缓冲区? BufferedStream的优势 从BufferedStream 中学习装饰模式 如何理解装饰模式 ...
- kibana下载与安装
目录 简介 下载 安装 测试 简介 Kibana是一个为ElasticSearch 提供的数据分析的 Web 接口.可使用它对日志进行高效的搜索.可视化.分析等各种操作.安装之前有话说: 安装路径不要 ...