JZOJ4973 回合遊戲

2021-07-27 05:03:52 字數 1402 閱讀 9129

給定乙個

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 ...