There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx , yy ) means the wave is a rectangle whose vertexes are ( 00 , 00 ), ( xx , 00 ), ( 00 , yy ), ( xx , yy ). Every time the wave will wash out the trace of former wave in its range and remain its own trace of ( xx , 00 ) -> ( xx , yy ) and ( 00 , yy ) -> ( xx , yy ). Now the toad on the coast wants to know the total length of trace on the coast after n waves. It's guaranteed that a wave will not cover the other completely.

Input

The first line is the number of waves n(n \le 50000)n(n≤50000).

The next nn lines,each contains two numbers xx yy ,( 0 < x0<x , y \le 10000000y≤10000000 ),the ii-th line means the ii-th second there comes a wave of ( xx , yy ), it's guaranteed that when 1 \le i1≤i , j \le nj≤n ,x_i \le x_jxi​≤xj​ and y_i \le y_jyi​≤yj​ don't set up at the same time.

Output

An Integer stands for the answer.

Hint:

As for the sample input, the answer is 3+3+1+1+1+1=103+3+1+1+1+1=10

样例输入复制

3
1 4
4 1
3 3

样例输出复制

10

   第一眼扫描线 想想突然感觉不太对,扫描线不会写

    这题仔细分析一下 这题倒推更加容易写

    这题倒推的话只要更新比这个矩形更大的区域就行了

    离散化一下

    注意两个点

       int ny = query( 1, L[i], tot, 1 );
       int nx = query( 2, R[i], tot, 1 );

    因为他给的是一个矩形所以我们看这条边能不能算就是看这个点的左边的最大值 所以query (L[I]->tot)

    因为你只要左边有一条边 ,这是一个矩形 所以右边也一定有

    第二个点

      update( 1, L[i], sum[R[i] - 1], 1 );
      update( 2, R[i], sum[L[i] - 1], 1 );

    L[i] 表示X轴上的点 他的值对应的是  sum[R[i] - 1]

    

 #include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <set>
#include <iostream>
#include <map>
#include <stack>
#include <string>
#include <vector>
#define pi acos(-1.0)
#define eps 1e-6
#define fi first
#define se second
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define rtl rt<<1
#define rtr rt<<1|1
#define bug printf("******\n")
#define mem(a,b) memset(a,b,sizeof(a))
#define name2str(x) #x
#define fuck(x) cout<<#x" = "<<x<<endl
#define f(a) a*a
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
#define pf printf
#define FRE(i,a,b) for(i = a; i <= b; i++)
#define FREE(i,a,b) for(i = a; i >= b; i--)
#define FRL(i,a,b) for(i = a; i < b; i++)
#define FRLL(i,a,b) for(i = a; i > b; i--)
#define FIN freopen("in.txt","r",stdin)
#define gcd(a,b) __gcd(a,b)
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int INF = 0x7fffffff;
const int mod = 1e9 + ;
const int maxn = 1e6 + ;
struct node {
int l, r, sumx, sumy;
int mid() {
return ( l + r ) >> ;
}
} tree[maxn << ];
void build( int l, int r, int rt ) {
tree[rt].l = l, tree[rt].r = r, tree[rt].sumx = tree[rt].sumy = ;
if ( l == r ) return ;
int m = ( l + r ) >> ;
build( l, m, rtl );
build( m + , r, rtr );
}
void update( int op, int pos, int key, int rt ) {
if ( tree[rt].l == tree[rt].r ) {
if ( op == ) tree[rt].sumx = max( tree[rt].sumx, key );
else tree[rt].sumy = max( tree[rt].sumy, key );
return ;
}
int m = tree[rt].mid();
if ( pos <= m ) update( op, pos, key, rtl );
else update( op, pos, key, rtr );
if ( op == ) tree[rt].sumx = max( tree[rtl].sumx, tree[rtr].sumx );
else tree[rt].sumy = max( tree[rtl].sumy, tree[rtr].sumy );
}
int query( int op, int L, int R, int rt ) {
if ( L <= tree[rt].l && tree[rt].r <= R ) {
if ( op == ) return tree[rt].sumx;
else return tree[rt].sumy;
}
int m = tree[rt].mid();
if ( L > m ) return query( op, L, R, rtr );
else if ( R <= m ) return query( op, L, R, rtl );
else return max( query( op, L, m, rtl ), query( op, m + , R, rtr ) );
}
int L[maxn], R[maxn], n, sum[maxn];
int main() {
sf( n );
int tot = ;
for ( int i = ; i <= n ; i++ ) {
sff( L[i], R[i] );
sum[tot++] = L[i], sum[tot++] = R[i];
}
sort( sum, sum + tot );
tot = unique( sum, sum + tot ) - sum;
build( , tot, );
LL ans = ;
for ( int i = n ; i >= ; i-- ) {
int a = L[i], b = R[i];
L[i] = lower_bound( sum, sum + tot, L[i] ) - sum + ;
R[i] = lower_bound( sum, sum + tot, R[i] ) - sum + ;
int ny = query( , L[i], tot, );
int nx = query( , R[i], tot, );
ans += b - ny;
ans += a - nx;
// fuck(nx),fuck(ny);
update( , L[i], sum[R[i] - ], );
update( , R[i], sum[L[i] - ], );
}
printf( "%lld\n", ans );
return ;
}

G. Trace ACM-ICPC 2018 徐州赛区网络预赛 线段树写法的更多相关文章

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

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

  2. ACM-ICPC 2018 徐州赛区网络预赛(8/11)

    ACM-ICPC 2018 徐州赛区网络预赛 A.Hard to prepare 枚举第一个选的,接下来的那个不能取前一个的取反 \(DP[i][0]\)表示选和第一个相同的 \(DP[i][1]\) ...

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

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

  4. 计蒜客 1460.Ryuji doesn't want to study-树状数组 or 线段树 (ACM-ICPC 2018 徐州赛区网络预赛 H)

    H.Ryuji doesn't want to study 27.34% 1000ms 262144K   Ryuji is not a good student, and he doesn't wa ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 B(dp || 博弈(未完成)

    传送门 题面: In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl n ...

  6. ACM-ICPC 2018 徐州赛区网络预赛 B. BE, GE or NE

    In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl named &qu ...

  7. ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study

    262144K   Ryuji is not a good student, and he doesn't want to study. But there are n books he should ...

  8. ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track

    262144K   Morgana is learning computer vision, and he likes cats, too. One day he wants to find the ...

  9. ACM-ICPC 2018 徐州赛区网络预赛 I. Characters with Hash

    Mur loves hash algorithm, and he sometimes encrypt another one's name, and call him with that encryp ...

随机推荐

  1. 【WXS全局对象】Math

    Math对象用于执行数学任务. 属性: 名称 说明 Math.E 代表算术常量 e,即自然对数的底数,其值近似于 2.71828. Math.LN10 就是 loge10,即 10 的自然对数,其值近 ...

  2. 【movable-area、movable-view】 可移动区域组件说明

    movable-area.movable-view 可移动区域组件 原型: <movable-area scale-area="[Boolean]"> <mova ...

  3. Angualr6访问API

    参照 草根专栏- ASP.NET Core + Ng6 实战: https://v.qq.com/x/page/a0769armuui.html 1.environment.ts 添加apiUrlBa ...

  4. 单词 (Play on Words UVA - 10129 )

    题目描述: 原题:https://vjudge.net/problem/UVA-10129 题目思路: 1.明显是判断欧拉路径 2.欧拉路径的两个条件 a.图连通 b.至多为两个奇点,且一个为起点一个 ...

  5. 谜题 (Puzzle,ACM/ICPC World Finals 1993,UVa227)

    题目描述:算法竞赛入门经典习题3-5 题目思路:模拟题 #include <stdio.h> #include <string.h> #define maxn 55 char ...

  6. some Commands OF CONSOLE

    不可避免地使用console,一旦与电脑打交道:入口就是help,而很多行就直接过掉了,却不能看到需要的地方,在那里停下来,实际是需要使用more  less grep等 在windows中,使用di ...

  7. 小猫爬山:dfs

    题目描述: 翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). 翰翰和达达只好花钱让它们坐索道下山. ...

  8. 操作系统及Python解释器工作原理讲解

    操作系统介绍 操作系统位于计算机硬件与应用软件之间 是一个协调.管理.控制计算机硬件资源与软件资源的控制程序 操作系统功能: 控制硬件 把对硬件复杂的操作封装成优美简单的接口(文件),给用户或者应用程 ...

  9. POJ 3084 Panic Room(最大流最小割)

    Description You are the lead programmer for the Securitron 9042, the latest and greatest in home sec ...

  10. 11.24Daily Scrum(2)

    人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.996 数据库测试 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.997 实现视频浏览的功能 王 ...