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(线段树的应用的更多相关文章

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

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

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

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

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

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

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

  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-树状数组-区间修改,单点查询

    赛后和队友讨论了一波,感谢无敌的队友给我细心的讲题 先埋坑 #include<iostream> #include<string.h> #include<algorith ...

  8. ACM-ICPC 2018 徐州赛区网络预赛 G题

    题目链接: https://nanti.jisuanke.com/t/31459 具体思路: 先顺序输入,然后回溯,假设已经加入了n个点,那么在加入的同时,首先看一下原先x轴上已经有过的点,找到第一个 ...

  9. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)

    ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...

随机推荐

  1. [BZOJ2962][清华集训]序列操作

    bzoj luogu 题意 有一个长度为\(n\) 的序列,有三个操作: \(I \ \ a\ b\ c\ :\)表示将\([a,b]\)这一段区间的元素集体增加\(c\): \(R \ \ a\ b ...

  2. Netty,Netty

    Windows防火墙会自动关闭空闲的TCP链接,所以Netty需要心跳,如果发现链接断开需要进行关闭Session: 怎么来理解TCP的流式传输呢? int blocksize = buffer.re ...

  3. POJ百练—IP地址转换

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; ]; void ...

  4. 批量创建10个系统帐号tianda01-tianda10并设置密码

    #.添加用户 useradd tianda01 #.非交互式给密码 echo "pass"|passwd --stdin tianda #.- 加0思路 ()..} () #随机密 ...

  5. linux命令-任务计划-cron

    任务计划,有时间规律的执行某些事情. 查看任务计划:crontab -l 指定用户:crontab -l  -u 用户名 该用户没有任务计划. 自定义任务计划 进入一个操作和vim类似的界面 用空格分 ...

  6. 我推荐的一些C\C++书籍

    原文链接: 我推荐的一些C\C++书籍 人们常常问我有什么C++和编程的书籍推荐,也许是因为我在PowerDNS有一个关于"编写可读性良好的C++代码"的演讲.这篇博文可以作为我对 ...

  7. vue 上传二进制图片

    1.前段代码 <el-form-item label="证件照片" prop="idImage"> <input @change='ss' t ...

  8. VMware安装Ubuntu时出现Intel VT-X处于禁用状态的情况的处理办法

    VMware安装Ubuntu时出现Intel VT-X处于禁用状态的情况的处理办法   VMware安装Ubuntu的出现Intel VT-X处于禁用状态的情况会使已经安装好的Ubuntu虚拟机打不开 ...

  9. tensorflow第一个例子

    import tensorflow as tf import numpy as np # create data x_data = np.random.rand(100).astype(np.floa ...

  10. Django 的认证系统

    Django自带的用户认证 auth 模块 from django.contrib import autu django.contrib.auth 中提供了许多方法, 这里主要介绍其中三个: auth ...