51nod 1494 選舉拉票 cf458C

2021-08-09 12:12:00 字數 1021 閱讀 4779

中文題面

考慮把所有人的票分別從大到小排序之後可以看做n條線段

列舉自己的票數為i,所以每條線段超過i的部分必須收買,如果還不夠就到前面挑不夠的

≤104 求前k小想到權值線段樹(應該是類似的東西)

#include

#include

#include

#define n 100000

#define ll long long

using

namespace

std;

inline

char nc()

inline

void read(int &x)

vector

a[n+5],f[n+5];

int n,m,num[n*4];

ll sum,ans,t[n*4];

void change(int x,int l,int r,int q)

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

if(q<=mid) change(x<<1,l,mid,q);

else change(x<<1|1,mid+1,r,q);

t[x]=t[x<<1]+t[x<<1|1];

num[x]=num[x<<1]+num[x<<1|1];

}ll query(int x,int l,int r,int q)

bool cmp(int x,int y)

int main()

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

if(a[i].size())

int k=n;

ll tmp=ans;

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

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

return

0;}

51Nod1494 選舉拉票

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

51NOD1494 選舉拉票

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

列舉 線段樹 51Nod1494 選舉拉票

直接做不太可做,我們可以列舉乙個 d 表示其他人最大值不大於 d時的情況。這樣就好做多了,比 d 大的部分就一定要全部扣掉。然後如果自己的票數不足 d,就需要在剩下的所有票裡取最便宜的前幾個,需要線段樹詢問前k小值的加和。從大到小列舉 d 即可。include include include def...