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 ...
随机推荐
- Gym - 100851G:Generators(人尽皆知但是WA题)
题意:现在有函数,每一项Xi=(A*X(i-1)+B)%C.现在给定N个函数以及K:X0,A,B,C.然你再每个函数选择一个数,使得其和最大,而且不被K整除. X0,A,B,C<=1e3 :K& ...
- Oracle 12c 新特性之 数据库内归档(In-Database Archiving)
Oracle Database 12c中引入了 In-Database Archiving的新特性, 该特性允许用户通过对表上的数据行标记为inactive不活跃的,以归档数据. 这些inactive ...
- 点击Button调用另一个Dialog
资源视图--Dialog--右键--添加资源--新建--对话框--然后在已经生成的对话框中(解决资源视图中的dialog下的新生成的那个)右键--添加类.例如:添加CMyNewDlg类,在所要调的代码 ...
- SP:目录
ylbtech-SP:目录 商谱开发框架 1.返回顶部 1. 1.WebUIWeChatUI MobileUI 2.Core-Model-Repository-Security -Service3.D ...
- Random获取不重复随机数
Random R = new Random(Guid.NewGuid().GetHashCode()); int i = R.Next(9999);
- How to Write a Spelling Corrector用java 写拼写检查器 Java实现 以备查验
import java.io.*;import java.util.*;import java.util.regex.*; class Spelling { private final HashMap ...
- tcpdump网络数据抓包
tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的“头”完全截获下来提供 ...
- [poj3259]Wormholes(spfa判负环)
题意:有向图判负环. 解题关键:spfa算法+hash判负圈. spfa判断负环:若一个点入队次数大于节点数,则存在负环. 两点间如果有最短路,那么每个结点最多经过一次,这条路不超过$n-1$条边. ...
- cocos2dx之lua绑定简析
一.总原则:c++对象的生命期不依赖lua gc管理,手动创建的对象要手动销毁 二.引擎层在设计上就是支持脚本概念的(也就是说脚本的使用是“侵入式”的),与lua打交道的代码都封在CCLuaEngin ...
- PHP中空字符串、0、null、empty和false之间的关系
原文来自:http://www.seayee.net/article/info_115.html