給定乙個長度為
n 的環,每個位置有乙個高度ai
。 當在環上的兩條路徑中有至少一條路徑上除了兩個端點,路徑上的高度都不大於mi
n(ai
,aj)
時,i,
j 可以互相看到。
求有多少對可以互相看到的點對。
t組資料。
data constraint t≤
5,n≤
1000000
因為是環,所以可以先copy一遍,轉成序列問題。
每個位置可以看到對方,當且僅當這兩個位置之間沒有比他們高的位置。
所以可以維護乙個雙向的單調遞減佇列,每次有元素進入時就計算它對前面的貢獻。
至於相同的元素,我們可以把它們壓在一起,再搞個鍊錶維護一下。
注意要減去重複的方案,統計一下最大值和最小值的個數就好了。
時間複雜度:o(
n)
#include
#include
#include
#include
#include
using
namespace
std ;
#define n 2000000 + 10
typedef
long
long ll ;
struct note s[n] ;
int a[n] , next[n] ;
int t , n , tot1 , tot2 , fmax , smax ;
ll ans ;
inline
int read()
int main() else
if ( a[i] > smax ) smax = a[i] , tot2 = 0 ;
if ( a[i] == fmax ) tot1 ++ ;
if ( a[i] == smax ) tot2 ++ ;
}if ( n < 2 )
if ( fmax == smax ) else ans -= (ll)tot1 * tot2 ;
int head = 1 , tail = 0 ;
for (int i = 1 ; i <= 2 * n ; i ++ ) else s[head].w = next[s[head].w] ;
}while ( a[i] > s[tail].v && tail >= head )
if ( tail >= head && s[tail].v == a[i] )
else
}printf( "%lld\n" , ans ) ;
}return
0 ;}
以上. JZOJ4848 永恆的契約
description 宅邸迅速的燃燒著,必須帶貝蒂走出 庫!憑著感覺,又一次直接找到 庫的門。你,是那個人嘛?400年了,當初聖域建立結界時沒有進入聖域,被傷了心的人工精靈貝蒂,與強欲魔女簽訂契約,守護宅邸的 庫,直至 那個人 的到來,那個人會解開貝蒂的心結。我不是那個什麼人,但我會成為你唯一的人...
JZOJ4848 永恆的契約(單調棧)
有 n nn 塊石頭,排成乙個環,第 i ii 塊石頭為高度 a ia i ai 兩塊不同的石頭 i ii 和 j jj 能夠互相看到,當且僅當它們在環上的兩條路徑中有至少一條路徑上的石頭高度都不大於 min min min 求有多少對石頭能互相看到。1 n 106 1 a i 10 91 leq ...
永恆的契約
宅邸迅速的燃燒著,必須帶貝蒂走出 庫!憑著感覺,又一次直接找到 庫的門。你,是那個人嘛?400年了,當初聖域建立結界時沒有進入聖域,被傷了心的人工精靈貝蒂,與強欲魔女簽訂契約,守護宅邸的 庫,直至 那個人 的到來,那個人會解開貝蒂的心結。我不是那個什麼人,但我會成為你唯一的人。我會給你幸福 精靈與人...