51Nod 1494 選舉拉票(權值線段樹)

2022-05-08 04:03:08 字數 1520 閱讀 5697

一開始有start個人投自己,num表示當前已經收買了多少人,從大到小列舉自己以i張票當選,那麼其他人的票數一定要小於i,拿錢收買他們花費最少的》=i的這部分人,再加上另外要收買的i-start-num個最便宜收買的花費就是當前答案,這裡可以對每個人的收買代價建立權值線段樹來查詢收買前i-start-num個最便宜的花費。注意不是選自己的選民可以選別人的時候叛變花費可能為0,所以線段樹應該從0開始。

1

#define dbg(x) cout<<#x<<" = "<< (x)<< endl

2#define io std::ios::sync_with_stdio(0);

3 #include 4

#define iter ::iterator

5using

namespace

std;

6 typedef long

long

ll;7 typedef pairp;

8#define pb push_back

9#define se second

10#define fi first

11#define rs o<<1|1

12#define ls o<<1

13const ll inf=0x7fffffff;14

const

int n=1e5+10;15

intm;

16 priority_queue,greater>q[n];

17int

id[n],vis[n],cnt;

18ll start;

19bool

cmp(ll x,ll y)

22struct

nodea[n*4

];25

void push(int

o)29

void up(int o,int l,int r,int

p,ll v)

35int m=(l+r)/2;36

if(p<=m)up(ls,l,m,p,v);

37else up(rs,m+1

,r,p,v);

38push(o);39}

40 ll qu(int o,int l,int r,int

p)48

intmain()

57q[x].push(y);

58 up(1,0,50000,y,1

);59

if(!vis[x])63}

64 sort(id+1,id+1+cnt,cmp);

65 ll ans=1e18,res=0,num=0;66

for(int i=m;i>=max(1ll,start);i--)77}

78 ll r=qu(1,0,50000,i-num-start);

79 ans=min(ans,res+r);80}

81 printf("

%lld\n

",ans);

82 }

51Nod1494 選舉拉票

現在你要競選乙個縣的縣長。你去對每乙個選民進行了調查。你已經知道每乙個人要選的人是誰,以及要花多少錢才能讓這個人選你。現在你想要花最少的錢使得你當上縣長。你當選的條件是你的票數比任何乙個其它候選人的多 嚴格的多,不能和他們中最多的相等 請計算一下最少要花多少錢。input 單組測試資料。第一行有乙個...

51NOD1494 選舉拉票

現在你要競選乙個縣的縣長。你去對每乙個選民進行了調查。你已經知道每乙個人要選的人是誰,以及要花多少錢才能讓這個人選你。現在你想要花最少的錢使得你當上縣長。你當選的條件是你的票數比任何乙個其它候選人的多 嚴格的多,不能和他們中最多的相等 請計算一下最少要花多少錢。1 n 10 5,0 ai 10 5 ...

51Nod 1494 選舉拉票 權值線段樹

現要競選市長。有 n 個選民投票。每行兩個數字 a i,b i 表示第 i 個選民投給 a i 號候選人,必須花費 b i 使他投你的票。你是第0號候選人。問最少花多少錢使你競選成功。1 leq n leq 10 5 0 leq a i leq 10 5,0 leq b i leq 10 4 從 n...