給定乙個
n 個點的圖,初始圖中沒有邊。有
q個操作,每次操作新增一條權值為
w 的邊,或者刪除當前圖中一條邊。
每次操作後,都會有兩個人的在圖上輪流取點,若一條邊的兩個端點都屬於同乙個人,那麼這個人可以獲得這個權值的分數。先手希望自己與後手的分差盡可能大;後手希望自己與先手的分差盡可能小,求每次操作完的分差。
data constraint n,
q≤100000
考慮一條邊如何貢獻,設當前邊的權值為
w ,若我們將w/
2分別加在兩個段點上,就可以發現,當兩端屬於同一人時,權值和恰好為
w 否則差必定不變,這與題目相符。
所以現在問題轉化為,求乙個有序序列奇數項和與偶數項和的差。
用權值線段樹維護區間內奇數項的和與偶數項的和即可。
時間複雜度:o(
nlog
n)
#include
#include
#include
#include
#include
using
namespace
std ;
#define n 100000 + 10
typedef
long
long ll ;
const
int maxn = 2e9 ;
struct edge e[n] ;
struct tree t[40*n] ;
int val[n] ;
int n , q , o , tot , cnt = 1 ;
int ans ;
ll ret ;
int newnode()
void merge( int v )
void delete( int v , int l , int r , int x )
int mid = (l + r) >> 1 ;
if ( x <= mid ) delete( t[v].son[0] , l , mid , x ) ;
else delete( t[v].son[1] , mid + 1 , r , x ) ;
merge( v ) ;
}void insert( int v , int l , int r , int x )
int mid = (l + r) >> 1 ;
if ( x <= mid ) else
merge( v ) ;
}int main() else
ans = (t[1].sum[1] - t[1].sum[0]) / 2 ;
lastans = ans ;
printf( "%d\n" , ans ) ;
}}
以上. 最短路 水題 cogs 497 奶牛派對
輸入檔案 party.in 輸出檔案 party.out 簡單對比 時間限制 1 s 記憶體限制 128 mb 問題描述 n頭牛要去參加一場在編號為x 1 x n 的牛的農場舉行的派對 1 n 1000 有m 1 m 100000 條有向道路,每條路長ti 1 ti 100 每頭牛都必須參加完派對後...
JZOJ 交換 模擬
給出字串s和字串t,現在你要把s的某乙個字元和t的某乙個字元交換,使得交換之後的s至少要有三個連續相同的字元,交換之後的t也要有三個連續相同的字元。問有多少種不同的交換方式。第一行,乙個字串s。s只含有 r g b 三種字元,長度不超過50,不小於3。而且s任意兩個相鄰的字元都不相同。第二行,乙個字...
JZOJ 規律 遊戲
有一堆金塊,king和貓老大輪流抽金塊,每次抽的個數必然是2的次方冪,求勝利 抽走最後一塊 的是誰 三行每行乙個數 n 0對於每局,如果 king 必勝則輸出一行 king will win.否則第一行輸出 maolaoda willwin.第二行輸出他第一次拿的最小數量。8 42maolaoda ...