题目链接在这里

题意是:按时间先后有许多左下角固定为(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的更多相关文章

  1. ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心)

    ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心) Trace 问答问题反馈 只看题面 35.78% 1000ms 262144K There's a beach in t ...

  2. 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  ...

  3. ACM-ICPC 2018 徐州赛区网络预赛 G. Trace【树状数组维护区间最大值】

    任意门:https://nanti.jisuanke.com/t/31459 There's a beach in the first quadrant. And from time to time, ...

  4. ACM-ICPC 2018 徐州赛区网络预赛 G Trace(思维+set)

    https://nanti.jisuanke.com/t/31459 题意 n个矩阵,不存在包含,矩阵左下角都在(0,0),给右上角坐标,后来的矩阵会覆盖前面的矩阵,求矩阵周长. 分析 set按照x或 ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 G Trace(逆向,两颗线段树写法)

    https://nanti.jisuanke.com/t/31459 思路 凡是后面的轨迹对前面的轨迹有影响的,可以尝试从后往前扫 区间修改需要push_down,单点更新所以不需要push_up(用 ...

  6. ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (set维护)

    注意题目保证不会有一个矩形完全包括另一个矩形的情况 时间序上从后往前看,一个坐标\((x,y)\)加进来之前,如果已经有\(x_i<x\),则对结果的贡献为\(x-x_i\);若不存在\(x_i ...

  7. ACM-ICPC 2018 徐州赛区网络预赛-G Trace(线段树的应用

    Problem:Portal传送门 Problem:Portal传送门  原题目描述在最下面.  我理解的题意大概是:有n次涨潮和退潮,每次的范围是个x×y的矩形,求n次涨退潮后,潮水痕迹的长度.   ...

  8. ICPC 2018 徐州赛区网络赛

    ACM-ICPC 2018 徐州赛区网络赛  去年博客记录过这场比赛经历:该死的水题  一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进.     D. Easy Math 题意:   ...

  9. 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 ...

随机推荐

  1. Python List 基础学习

    list&tuple&dict list list 常见操作 初始化: list1 = [123, 'abc', 4.56, ['inner', 'list'], 7-9j] list ...

  2. JavaScript文档对象模型

    文档对象模型(Document Object Model, DOM)是W3C提出的用于访问和修改文档的接口. JavaScript设计的初衷是为Web提供交互功能,它通过DOM接口来访问和修改文档. ...

  3. Spring boot应用踩坑集锦

    Spring boot应用踩坑集锦 spring boot是spring的一种开发套件,是spring cloud的基础框架,要学习spring cloud微服务是绕不开的,遇到一些踩坑问题在这里记录 ...

  4. Spring 核心组件总结

    spring核心组件总结 spring介绍 spring概念 IOC: Inverse Of Control 控制反转 ​ 将我们创建对象的方式反转了,以前创建对象是由我们开发人员自己维护,包括依赖注 ...

  5. 【转】ArrayBlockingQueue浅析

    ArrayBlockingQueue是常用的线程集合,在线程池中也常常被当做任务队列来使用.使用频率特别高.他是维护的是一个循环队列(基于数组实现),循环结构在数据结构中比较常见,但是在源码实现中还是 ...

  6. day_02mysql表的约束设计

    首先我们复习第一天的主要内容: sql分类 知识概述 1) DDL(Data Definition Language)数据定义语言 用来定义数据库对象:数据库,表,列等.关键字:create, dro ...

  7. 聊聊MyBatis缓存机制【美团-推荐】

    聊聊MyBatis缓存机制 2018年01月19日 作者: 凯伦 文章链接 18778字 38分钟阅读 前言 MyBatis是常见的Java数据库访问层框架.在日常工作中,开发人员多数情况下是使用My ...

  8. HDU2181(KB2-C)

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. thymeleaf 标签使用方法

    使用thymeleaf首先添加依赖,<dependency><groupId>org.springframework.boot</groupId><artif ...

  10. drupal smtp could not connect to smtp

    情况说明: 使用了SMTP Authentication Support 模块. 配置都没问题,是从另一台服务器迁过来的网站和数据库. 原因是客户的smtp服务器限制了我们新服务器的IP. 验证方式t ...