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. 本机不装Oracle,使用plsql连接远程Oracle的方法

    由于Oracle的庞大,有时候我们需要在只安装Oracle客户端如plsql.toad等的情况下去连接远程数据库,可是没有安装Oracle就没有一切的配置文件去支持.最后终于发现一个很有效的方法,Or ...

  2. android获取时间差的方法

    本文实例讲述了android获取时间差的方法.分享给大家供大家参考.具体分析如下: 有些时候我们需要获取当前时间和某个时间之间的时间差,这时如何获取呢? 1. 引用如下命名空间: import jav ...

  3. Python:struct模块的pack、unpack

    mport struct pack.unpack.pack_into.unpack_from 1 # ref: http://blog.csdn<a href="http://lib. ...

  4. MD5 校验文件

    https://blog.csdn.net/wudishine/article/details/42466831 MD5.h #ifndef MD5_H #define MD5_H #include ...

  5. #np.random.normal,产生制定分布的数集(默认是标准正态分布)

    http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.normal.html #np.random.normal,产生制定分 ...

  6. numpy.mean和numpy.random.multivariate_normal(依据均值和协方差生成数据,提醒:计算协方差别忘了转置)

    >> import numpy as np >>> A1_mean = [1, 1] >>> A1_cov = [[2, .99], [1, 1]]&g ...

  7. BluetoothGetRadioInfo 函数

    DWORD BluetoothGetRadioInfo( HANDLE hRadio, PBLUETOOTH_RADIO_INFO pRadioInfo );获取蓝牙设备的信息.参数: hRadio ...

  8. css+div制作圆角矩形的四种方法

    圆角矩形一向是设计师最倾心的一种设计,因为他们可以让整个网页生动起来,不那么死板,所以,作为一个优秀的网页设计师,学会一种或多种编辑圆角矩形的方法是必不可少的,而且圆角矩形应用范围极广,一个网页内的所 ...

  9. error C2512: “HelloWorld”: 没有合适的默认构造函数可用

    error C2512: "HelloWorld": 没有合适的默认构造函数可用 c++ newbie error C2512: no appropriate default co ...

  10. 【Hadoop】hiveserver2 不能启动端口 10000 开启服务的相关经验总结

    转载来自http://blog.csdn.net/lsttoy/article/details/53490144. 这个问题困扰了我三天,各种查资料踩坑填坑的尝试,终于搞定了这个问题. 首先来品尝下喜 ...