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. NYOJ-求逆序数 ----------------待解决,WA

    描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 现在,给你一个N个元素的序列,请你判断出它的逆序数 ...

  2. 1014 Waiting in Line (30)(30 分)

    Suppose a bank has N windows open for service. There is a yellow line in front of the windows which ...

  3. Windows 7下Git SSH 创建Key的步骤

    1.首先你要安装Git工具 下载地址:https://git-scm.com/downloads 2.右键鼠标,选中 “Git Bash here”,当然你也可以在windows的 “开始”---&g ...

  4. Apache Flume 1.6.0 发布,日志服务器

    Apache Flume 1.6.0 发布,此版本现已提供下载: http://flume.apache.org/download.html 更新日志和文档: http://flume.apache. ...

  5. Poj1163 The Triangle(动态规划求最大权值的路径)

    一.Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a pro ...

  6. C#程序运行计时

    var stp = new System.Diagnostics.Stopwatch(); stp.Start();//计时启动 ..........程序代码........... stp.Stop( ...

  7. 【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView

    目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只 ...

  8. JavaScript-Tool:jquery.cookie.js

    ylbtech-JavaScript-Tool:jquery.cookie.js 1.返回顶部 1.jquery.cookie.js /*! * jQuery Cookie Plugin v1.4.0 ...

  9. 【jQuery】CheckBox使用attr全选无法正确显示

    今天编写JS脚本时,遇到如下的问题. 下面是源代码: <script src="../Scripts/jquery-2.1.3.js"></script> ...

  10. Ajax前端调后台方法

    后台对当前页面类进行注册 Ajax.Utility.RegisterTypeForAjax(typeof(Login));//Login 当前类名 在方法上面加 [Ajax.AjaxMethod(Aj ...