G. Trace ACM-ICPC 2018 徐州赛区网络预赛 线段树写法
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 徐州赛区网络预赛 线段树写法的更多相关文章
- ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心)
ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心) Trace 问答问题反馈 只看题面 35.78% 1000ms 262144K There's a beach in t ...
- ACM-ICPC 2018 徐州赛区网络预赛(8/11)
ACM-ICPC 2018 徐州赛区网络预赛 A.Hard to prepare 枚举第一个选的,接下来的那个不能取前一个的取反 \(DP[i][0]\)表示选和第一个相同的 \(DP[i][1]\) ...
- ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...
- 计蒜客 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 ...
- ACM-ICPC 2018 徐州赛区网络预赛 B(dp || 博弈(未完成)
传送门 题面: In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl n ...
- 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 ...
- 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 ...
- ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track
262144K Morgana is learning computer vision, and he likes cats, too. One day he wants to find the ...
- 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 ...
随机推荐
- 【shell 练习1】编写Shell条件句练习
实例一.比较两个整数大小 #!/bin/bash while true do read -p "Please input two int nums:" a b >/dev/& ...
- CryptoZombies学习笔记——Lesson5
chapter1:token代币 简而言之,通证就是支持交易的包含一系列规范的函数接口的一个智能合约,发币可以用ERC20标准,但是像僵尸这种非同质化代币,需要用ERC721标准 chapter2:e ...
- Ext JS 6学习文档-第3章-基础组件
Ext JS 6学习文档-第3章-基础组件 基础组件 在本章中,你将学习到一些 Ext JS 基础组件的使用.同时我们会结合所学创建一个小项目.这一章我们将学习以下知识点: 熟悉基本的组件 – 按钮, ...
- 浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(转载)
转载来至beautifulzzzz,网址http://www.cnblogs.com/zjutlitao/,推荐学习 蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到 ...
- c#数据库乱码
1.sql连接语句加charset=utf8: 2.不要使用odbcConnection. 在由utf8改为latin1时候,需要修改的地方: 1.连接数据库语句中的charset: 2.在sql语句 ...
- DAY3敏捷冲刺
站立式会议 工作安排 (1)服务器配置 (2)数据库配置 燃尽图 燃尽图有误,已重新修改,先贴卡片的界面,后面补修改后燃尽图 代码提交记录
- 买卖股票的最佳时机I II III IV
I 假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润. II 假设有一个数组,它的第i个元素是一个给定的股票 ...
- redis切换数据库的方法【jedis】
package com.test; import redis.clients.jedis.Jedis; public class readredis { public static void main ...
- Git命令基本操作
本文从以下九个方面,介绍Git命令的基本操作: 一. Git安装 二. Git基本配置 三. 创建Git仓库 四. 获得Git仓库 五. 提交更新 六. 提交历史查看 七. 远程仓库 八. 打Tags ...
- 发送缓冲区sk_wmem_queued
sk_wmem_queued是目前发送缓冲区的量 tcp_trim_head 把这快内存给去掉, 什么时候会加入到内存里呢?__tcp_add_write_queue_tail, skb里的内存是啥? ...