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. leetcode-打家劫舍(动态规划)

    你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定一个代表每 ...

  2. [HNOI2018]转盘

    [HNOI2018]转盘 给你一个 \(n\) 元环, 你可以在 \(0\) 时刻从任意一个位置出发, 每一秒可以选择往后或者留在原地每个点有个参数 \(T_i\) , 当你走到 \(i\) 的时间 ...

  3. 剑指offer-从上往下打印二叉树22

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. class Solution: # 返回从上到下每个节点值列表,例:[1,2,3] def PrintFromTopToBottom( ...

  4. ffmpeg接收rtsp流问题

    项目使用mingw环境g++5.3,C++调用ffmpeg接收rtsp流,再通过C#显示.结构上是C#调用C++的so文件,读取得到的视频帧(RGB888格式),通过图片控件显示. 一开始是使用ope ...

  5. 你真的了解JAVA里的String么

    Java中String类细节问题 (考察点Java内存分配问题) 1. String str1 = "abc";   System.out.println(str1 == &quo ...

  6. Thunder团队第三周 - Scrum会议5

    Scrum会议5 小组名称:Thunder 项目名称:i阅app Scrum Master:苗威 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传康 ...

  7. MFC动态创建控件及其消息响应函数

    这几天专门调研了一下MFC中如何动态创建控件及其消息响应函数. 参考帖子如下: (1)http://topic.csdn.net/u/20101204/13/5f1b1e70-2f1c-4205-ba ...

  8. MongoDb Driver For Net

    由于mongodb开源github提供的net驱动都比较新,从2.3及以上版本都是netcore系列了,netframework至少都是4.6以上,且提供的dll并没有签名, 这就产生了一些问题 1 ...

  9. RHEL 6.4(i386)安装MySQL 5.6的方法

  10. Vim新手节省时间的10多个小技巧

    Vim新手节省时间的10多个小技巧 Vim 是很多开发者的首选编辑器,通过设置正确的命令和快捷方式,它可以帮你更快的完成工作.这篇文章我们为 Vim 新手提供一些快捷键等方面的小技巧,帮你提升工作效率 ...