生活随笔
收集整理的這篇文章主要介紹了
Vijos p1165 火烧赤壁 离散化+单调栈
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接:https://vijos.org/p/1165
題意:輸入n(n <= 20,000)段線段的端點(diǎn),問所有線段的長度總和為多少?
input:
3
-1 1
5 11
2 9
output:
11
思路:將左右端點(diǎn)分成一個一個的點(diǎn),并且標(biāo)記輸入的id.即弄成一個pair;排序之后模擬加點(diǎn),左端點(diǎn)直接入棧,右端點(diǎn)若是棧頂端點(diǎn)對應(yīng)的右端點(diǎn)時,棧頂元素出棧,那這時是否需要更新總長度呢?并不需要。如2 11 ,7 8,棧內(nèi)為2,7.當(dāng)前的右端點(diǎn)8對應(yīng)的左端點(diǎn)為7,然而都在[2,11]內(nèi),所以出棧即可;但是如果是樣例中的,當(dāng)棧內(nèi)為2,5.當(dāng)前的右端點(diǎn)為9時,不要任何操作嗎?不是的,這時要將2的左端點(diǎn)標(biāo)記下,即表示這個區(qū)間已經(jīng)掃過了,只是最后大的區(qū)間可能會用到2這個更小的左區(qū)間;同時也知道了什么時候需要更新總長度,即區(qū)間的連接完整的時候,即p = 0時更新;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define inf 0x7fffffff
#define pow(a) (a)*(a)
typedef long long ll;
template<typename T>
void read1(T &
m)
{T x=
0,f=
1;
char ch=
getchar();while(ch<
'0'||ch>
'9'){
if(ch==
'-')f=-
1;ch=
getchar();}while(ch>=
'0'&&ch<=
'9'){x=x*
10+ch-
'0';ch=
getchar();}m = x*
f;
}
template<typename T>
void read2(T &a,T &
b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &
c){read1(a);read1(b);read1(c);}
typedef pair<
int,
int>
PII;
#define A first
#define B second
#define MK make_pair
const int MAXN =
20020<<
1;
int d[MAXN],stk[MAXN],val[MAXN];
PII v[MAXN];
int main()
{int p =
0,n;read1(n);n <<=
1;for(
int i =
0;i < n;i +=
2){read2(v[i].A,v[i+
1].A);if(v[i].A > v[i+
1].A) swap(v[i].A,v[i+
1].A);v[i].B = i;v[i+
1].B = i+
1;}sort(v,v+
n);ll ans =
0;rep0(i,0,n){if((v[i].B&
1) ==
0) stk[++p] = v[i].B,val[p] =
v[i].A;else{if(v[i].B-
1 ==
stk[p]){p--
;while(p && d[stk[p]]) p--
;}if(!p) ans += v[i].A - val[
1];else d[v[i].B^
1] =
1;}}printf("%lld\n",ans);return 0;
} ?
轉(zhuǎn)載于:https://www.cnblogs.com/hxer/p/5295409.html
總結(jié)
以上是生活随笔為你收集整理的Vijos p1165 火烧赤壁 离散化+单调栈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。