列舉 線段樹 51Nod1494 選舉拉票

2021-08-09 17:43:16 字數 1232 閱讀 9857

直接做不太可做,我們可以列舉乙個

d 表示其他人最大值不大於

d時的情況。 這樣就好做多了,比

d 大的部分就一定要全部扣掉。然後如果自己的票數不足

d,就需要在剩下的所有票裡取最便宜的前幾個,需要線段樹詢問前k小值的加和。

從大到小列舉

d 即可。

#include

#include

#include

#define fir first

#define sec second

#define mp(x,y) make_pair(x,y)

using

namespace

std;

const

int maxn=100005;

vector

a[maxn];

pair b[maxn];

int n,m,all;

bool _cmp(const

int &x,const

int &y)

int res,ans;

struct node

void maintain()

} *root;

typedef node* p_node;

p_node build(int l,int r)

void updata(p_node p,int l,int r,int pos,int k)

int mid=(l+r)>>1;

updata(p->ch[0],l,mid,pos,k); updata(p->ch[1],mid+1,r,pos,k);

p->maintain();

}int query(p_node p,int l,int r,int k)

int main()

root=build(0,10000);

all=a[0].size();

for(int i=1;i<=100000;i++)

sort(b+1,b+1+m);

ans=2e9;

for(int d=n;d>=0;d--)

}if(all>d)

if(d+1-all<=root->cnt) ans=min(ans,res+query(root,0,10000,d+1-all));

}printf("%lld\n",ans);

return

0;}

51nod 1494 選舉拉票 掃瞄線 線段樹

題目傳送門 掃瞄線是什麼鬼啊 為什麼我好像什麼都不會啊qwq 以上的來自sillyf大佬的部落格,大佬傳送門 把所有的候選人擁有的票數看做一條線段,列舉當前自己擁有的票數為 i 所有票數大於等於自己的票數的人必須要去py 逃 收買投票的人 如果把當前必須買的部分全買完了票數還是不夠,就需要去挑著買的...

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

一開始有start個人投自己,num表示當前已經收買了多少人,從大到小列舉自己以i張票當選,那麼其他人的票數一定要小於i,拿錢收買他們花費最少的 i的這部分人,再加上另外要收買的i start num個最便宜收買的花費就是當前答案,這裡可以對每個人的收買代價建立權值線段樹來查詢收買前i start ...

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