2018 徐州赛区网赛 G. Trace
题意是:按时间先后有许多左下角固定为(0,0),右上角为(xi,yi)的矩形浪潮,每次浪潮会留下痕迹,但是后来的浪潮又会冲刷掉自己区域的老痕,留下新痕迹,问最后留下的痕迹长度为多少?
这题里,不存在2个浪潮,使得一个浪潮完全被另一个覆盖.
如图,经过了(1,4),(4,1),(3,3)浪潮后,所留下的痕迹(红边为10).
每次浪潮都会有贡献.再而,如果浪潮在时间上从前往后考虑,则不能知悉当前浪潮会被以后的多少浪潮影响.所以从后往前考虑,可以把握每次浪潮带给当前浪潮的影响.
其次,时间上从后往前考虑,对于当前浪潮在x方向的贡献,必然是没有被前面所考虑的(时间上在后面的)的浪潮所覆盖的部分.那么什么样的浪潮会覆盖掉自己的x边?比自己高的浪都会覆盖自己的x边,覆盖被覆盖的最多的,也就是>y的那些浪中,x最大的那个.
总结一下:对于当前的浪(xi,yi),xi边的贡献是xi-x,其中x是>yi的浪中,x坐标最大的浪.
yi边的贡献是yi-y,其中y是>xi的浪中,y最大的浪.
为什么不是>= ? 因为如果有两个浪的x或者y相同的话,必然有一个浪被包含于另外一个浪中,这不符合题意.
问题演变成区间查询和点更新,线段树解决即可:
#include <bits/stdc++.h>
using namespace std; #define ll long long
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define DOR(i,a,b) for(int i=(a);i>=(b);--i)
const int maxN=1e6+; int N, M, K, T;
int le[maxN], ri[maxN], A[maxN];
int gx[maxN<<], gy[maxN<<]; #define lson l,m,rt*2
#define rson m+1,r,rt*2+1 void update(int op, int p, int c, int l, int r, int rt) {
if (l == r) {
if (op == ) gx[rt] = max(c, gx[rt]);
else gy[rt] = max(c, gy[rt]);
return;
}
int m = (l + r) / ;
int lch = rt * , rch = lch + ;
if (p <= m) update(op, p, c, lson);
else update(op, p, c, rson);
// push_up
if (op == ) gx[rt] = max(gx[lch], gx[rch]);
else gy[rt] = max(gy[lch], gy[rch]);
}
int query(int op, int L, int R, int l, int r, int rt) {
if (L <= l && r <= R) {
if (op == ) return gx[rt];
else return gy[rt];
}
int m = (l + r) / ;
int ans = ;
if (L <= m) ans = max(ans, query(op, L, R, lson));
if (R > m) ans = max(ans, query(op, L, R, rson));
return ans;
} int main () {
scanf("%d", &N);
int k = ;
FOR(i, , N) {
scanf("%d%d", &le[i], &ri[i]);
A[k++] = le[i], A[k++] = ri[i];
}
sort(A, A + k);
k = unique(A, A + k) - A; // Build Segment Tree
memset(gx, , sizeof gx);
memset(gy, , sizeof gy); ll ans = ;
DOR(i, N, ) {
int a = le[i], b = ri[i];
le[i] = lower_bound(A, A + k, le[i]) - A + ;
ri[i] = lower_bound(A, A + k, ri[i]) - A + ; int my = query(, le[i], k, , k, );
int mx = query(, ri[i], k, , k, );
ans += (b - my) + (a - mx); update(, le[i], A[ri[i] - ], , k, );
update(, ri[i], A[le[i] - ], , k, );
}
printf("%lld\n", ans);
return ;
}
2018 徐州赛区网赛 G. Trace的更多相关文章
- ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心)
ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心) Trace 问答问题反馈 只看题面 35.78% 1000ms 262144K There's a beach in t ...
- ACM-ICPC 2018 徐州赛区网络预赛 G. Trace
There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx , yy ...
- ACM-ICPC 2018 徐州赛区网络预赛 G. Trace【树状数组维护区间最大值】
任意门:https://nanti.jisuanke.com/t/31459 There's a beach in the first quadrant. And from time to time, ...
- ACM-ICPC 2018 徐州赛区网络预赛 G Trace(思维+set)
https://nanti.jisuanke.com/t/31459 题意 n个矩阵,不存在包含,矩阵左下角都在(0,0),给右上角坐标,后来的矩阵会覆盖前面的矩阵,求矩阵周长. 分析 set按照x或 ...
- ACM-ICPC 2018 徐州赛区网络预赛 G Trace(逆向,两颗线段树写法)
https://nanti.jisuanke.com/t/31459 思路 凡是后面的轨迹对前面的轨迹有影响的,可以尝试从后往前扫 区间修改需要push_down,单点更新所以不需要push_up(用 ...
- ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (set维护)
注意题目保证不会有一个矩形完全包括另一个矩形的情况 时间序上从后往前看,一个坐标\((x,y)\)加进来之前,如果已经有\(x_i<x\),则对结果的贡献为\(x-x_i\);若不存在\(x_i ...
- ACM-ICPC 2018 徐州赛区网络预赛-G Trace(线段树的应用
Problem:Portal传送门 Problem:Portal传送门 原题目描述在最下面. 我理解的题意大概是:有n次涨潮和退潮,每次的范围是个x×y的矩形,求n次涨退潮后,潮水痕迹的长度. ...
- ICPC 2018 徐州赛区网络赛
ACM-ICPC 2018 徐州赛区网络赛 去年博客记录过这场比赛经历:该死的水题 一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进. D. Easy Math 题意: ...
- ACM-ICPC 2018 徐州赛区(网络赛)
目录 A. Hard to prepare B.BE, GE or NE F.Features Track G.Trace H.Ryuji doesn't want to study I.Charac ...
随机推荐
- mysql5.0版本下载地址
http://dev.mysql.com/downloads/mysql/5.0.html Other Downloads: Windows (x86, 32-bit), ZIP Archive 5. ...
- jQuery 1.9/2.0/2.1及其以上 on 无效的解决办法
jQuery 1.9/2.0/2.1及其以上版本无法使用live函数了,然而jQuery 1.9及其以上版本提供了on函数来代替.本文讲解了jQuery on函数的使用方法,以及在使用jQuery函数 ...
- SQLServer数据库循环表操作每一条数据(游标的使用)
DECLARE @FunctionCode VARCHAR(20)--声明游标变量DECLARE curfuntioncode CURSOR FOR SELECT FunctionalityCode ...
- Css3盒子尺寸
box-sizing属性 用来改变盒模式中的宽度和高度默认的计算方式. box-sizing: 1.content-box(默认值): 宽度和高度只包含内容区域 2.border-box: 宽度和高度 ...
- [转]linux文件批量转码
linux系统里提供的文件转化编码的命令iconv,例如: iconv -t utf- -f gb2312 -c test.xml > text_UTF8.xml -f 源编码-t 目标编码 ...
- MySQL千万级大表优化解决方案
MySQL千万级大表优化解决方案 非原创,纯属记录一下. 背景 无意间看到了这篇文章,作者写的很棒,于是乎,本人自私一把,把干货保存下来.:-) 问题概述 使用阿里云rds for MySQL数据库( ...
- ORACLEserver实例DB的概念学习理解与总结【进阶一】
个人原创,转自请在文章开头显眼位置注明出处:https://www.cnblogs.com/sunshine5683/p/10048824.html 一.以后看一个oracleserver,可以使用如 ...
- Linux下svn的安装与部署
最近工作碰到一个问题,我和一个同伙负责开发一个管理系统,基于原来的代码上进行修改,每当他修改之后,我要再修改都要和他确定是不是最新的文件,才能进行修改.非常影响工作的效率,所以在网上找了关于svn的使 ...
- mac,macbook 连接蓝牙耳机播放音乐断断续续
个人的情况是, mac本连的网线,用的无线鼠标, 屋里80多号人都在用笔记本,应该也有好多开着无线的东西 解决方法: mac 或macbook 连接蓝牙耳机播放音乐断断续续的原因, 在网上找了好多方法 ...
- 使用AJAX实现分页
Fenye.html <!DOCTYPE html> <html> <head> <title>分页</title> </head&g ...