ACM-ICPC 2018 徐州赛区网络预赛-G Trace(线段树的应用
Problem:Portal传送门
原题目描述在最下面。
我理解的题意大概是:有n次涨潮和退潮,每次的范围是个x×y的矩形,求n次涨退潮后,潮水痕迹的长度。
不存在此i,j∈[1,n],i≠j,xi≤xj且yi≤y
Solution:
每次潮水可能会冲刷掉之前的潮水的一部分痕迹,但是它又不会完全冲刷。
考虑从最后一次潮水开始往前算贡献,分x,y方向计算。
假设此次潮水的范围是[xi,yi],找出大于等于xi的最大Y,则y方向的新增痕迹长度为yi−Y,xx方向同理。
这样问题就转化为一个求区间最值的问题了,线段树秒。
#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
const int mod = 1e9+;
const int MXN = 1e6 + ;
int n;
int sumx[MXN<<], sumy[MXN<<];
int ar[MXN], br[MXN], le[MXN], ri[MXN];
void update(int op,int p,int c,int l,int r,int rt){
if(l == r){
if(op == ) sumx[rt] = max(c,sumx[rt]);
else sumy[rt] = max(c,sumy[rt]);
return;
}
int mid = (l+r)>>;
if(p<=mid)update(op,p,c,l,mid,lson);
else update(op,p,c,mid+,r,rson);
if(op == )sumx[rt] = max(sumx[lson], sumx[rson]);
else sumy[rt] = max(sumy[lson], sumy[rson]);
}
int query(int op,int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
if(op == ) return sumx[rt];
else return sumy[rt];
}
int mid = (l+r)>>;
if(L>mid)return query(op,L,R,mid+,r,rson);
else if(R<=mid)return query(op,L,R,l,mid,lson);
else {
return max(query(op,L,mid,l,mid,lson),query(op,mid+,R,mid+,r,rson));
}
}
int main(int argc, char const *argv[]){
scanf("%d", &n);
int k = ;
for(int i = ; i <= n; ++i){
scanf("%d%d", &le[i], &ri[i]);
ar[k++] = le[i];
ar[k++] = ri[i];
}
sort(ar, ar + k);
k = unique(ar, ar + k) - ar;
memset(sumx, , sizeof(sumx));
memset(sumy, , sizeof(sumy));
LL ans = ;
for(int i = n; i >= ; --i){
int a = le[i], b = ri[i];
le[i] = lower_bound(ar, ar + k, le[i]) - ar + ;
ri[i] = lower_bound(ar, ar + k, ri[i]) - ar + ;
int my = query(, le[i], k, , k, );//找出大于xi的最大Y
ans += b - my;
int mx = query(, ri[i], k, , k, );//找出大于yi的最大X
ans += a - mx;
//printf("%d %d\n", mx, my);
update(, le[i], ar[ri[i]-], , k, );//更新此xi下的yi
update(, ri[i], ar[le[i]-], , k, );
}
printf("%lld\n", ans);
return ;
}
还有一种做法 : 一样是从后面开始 在考虑第I个浪的贡献时候,Xi产生的贡献是(xi , 无限)的最大值MX , ans+=xi-MAX;y同理
#include <bits/stdc++.h>
#define ll long long
using namespace std; const int N=;
int x[N],y[N],n;
int xt[N],yt[N];
int treex[N],treey[N]; int sum(int i,int op) {
int res=;
while(i) {
if(op==) res=max(res,treex[i]);
else res=max(res,treey[i]);
i -= -i&i;
} return res;
}
void add(int i,int id,int op) {
while(i<=N) { if(op==) treex[i]=max(treex[i],id);
else treey[i]=max(treey[i],id);
i += -i&i;
}
} int main()
{
scanf("%d",&n);
for(int i=;i<n;i++) {
scanf("%d%d",&x[i],&y[i]);
xt[i]=x[i], yt[i]=y[i];
}
sort(xt,xt+n); sort(yt,yt+n);
ll ans=;
for(int i=n-;i>=;i--) {
int xi=lower_bound(xt,xt+n,x[i])-xt+;
int yi=lower_bound(yt,yt+n,y[i])-yt+;
//printf("%d %d\n",xi,yi);
ans+=(x[i]-sum(xi,));
ans+=(y[i]-sum(yi,));
add(xi,x[i],);
add(yi,y[i],);
}
printf("%lld\n",ans); return ;
}
ACM-ICPC 2018 徐州赛区网络预赛-G Trace(线段树的应用的更多相关文章
- 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 (思维,贪心)
ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心) Trace 问答问题反馈 只看题面 35.78% 1000ms 262144K There's a beach in t ...
- ACM-ICPC 2018 徐州赛区网络预赛 G Trace(思维+set)
https://nanti.jisuanke.com/t/31459 题意 n个矩阵,不存在包含,矩阵左下角都在(0,0),给右上角坐标,后来的矩阵会覆盖前面的矩阵,求矩阵周长. 分析 set按照x或 ...
- 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 思路 凡是后面的轨迹对前面的轨迹有影响的,可以尝试从后往前扫 区间修改需要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-树状数组-区间修改,单点查询
赛后和队友讨论了一波,感谢无敌的队友给我细心的讲题 先埋坑 #include<iostream> #include<string.h> #include<algorith ...
- ACM-ICPC 2018 徐州赛区网络预赛 G题
题目链接: https://nanti.jisuanke.com/t/31459 具体思路: 先顺序输入,然后回溯,假设已经加入了n个点,那么在加入的同时,首先看一下原先x轴上已经有过的点,找到第一个 ...
- ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...
随机推荐
- ACM学习历程—HDU4675 GCD of Sequence(莫比乌斯)
Description Alice is playing a game with Bob. Alice shows N integers a 1, a 2, …, a N, and M, K. She ...
- BZOJ1367:[Baltic2004]sequence
浅谈左偏树:https://www.cnblogs.com/AKMer/p/10246635.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php? ...
- 洛谷【P3612】[USACO17JAN]Secret Cow Code秘密奶牛码
我对分治的理解:https://www.cnblogs.com/AKMer/p/9728574.html 题目传送门:https://www.luogu.org/problemnew/show/P36 ...
- 洛谷 P4546 & bzoj 5020 在美妙的数学王国中畅游 —— LCT+泰勒展开
题目:https://www.luogu.org/problemnew/show/P4546 先写了个55分的部分分,直接用LCT维护即可,在洛谷上拿了60分: 注意各处 pushup,而且 spla ...
- 【转】 Pro Android学习笔记(三一):Menu(2):扩展、图片、子菜单
目录(?)[-] 菜单扩展 菜单项加入图片 子菜单 菜单扩展 如果菜单项很多,超过六个时,就会采用菜单扩展模式.在例子中我加入了10个菜单项,预计能进入菜单扩展模式,但是实际效果如右图所示.效果和li ...
- 集群重启某一主机下所有osd down解决办法
标签(空格分隔): ceph 运维 osd 问题描述: 掉电后,上电发现cluster中的主机node3下的所有osd都down掉了,通过命令重启node3的ceph-osd服务,osd依然无法up: ...
- 在Golang中使用C语言代码实例
转自:http://www.jb51.net/article/56720.htm cgo 使得在 Golang 中可以使用 C 代码. Hello World 为了有一个较为直观的了解,我们来看一个简 ...
- RN控件之TextInput
/** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; import Rea ...
- Flask06 地址约定、利用falsk提供的方法渲染模板
1 访问地址约定 在访问路径的末尾是否需要加 / -> 可以加,也可以不加 前端的访问路径必须和后端的路径完全匹配才能够访问成功,如果我们在后台的路径都是以 / 结尾,但是我们的访问路径是没有以 ...
- Entity Framework Code-First(9.2):DataAnnotations - TimeStamp Attribute
DataAnnotations - TimeStamp Attribute: TimeStamp attribute can be applied to only one byte array pro ...