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

2021-08-09 13:14:19 字數 1103 閱讀 6159

題目傳送門

掃瞄線是什麼鬼啊……為什麼我好像什麼都不會啊qwq……

以上的來自sillyf大佬的部落格,大佬傳送門

把所有的候選人擁有的票數看做一條線段,列舉當前自己擁有的票數為

i ,所有票數大於等於自己的票數的人必須要去py(逃)收買投票的人

如果把當前必須買的部分全買完了票數還是不夠,就需要去挑著買的部分選一些便宜的買來,這個可以用權值線段樹實現。

附上ac**:

#include 

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int n=1e5+10;

int n,x,y,num,m,c,t1[n<<2];

vector

a[n],b[n];

ll sum,ans,t2[n<<2];

inline

char nc(void)

inline

void read(int &a)

inline

bool cmp(int x,int y)

#define lt (k<<1)

#define rt (k<<1|1)

#define mid (l+r>>1)

inline

void change(int k,int l,int r,int wz)

inline ll query(int k,int l,int r,int w)

int main(void)

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

if (a[i].size())

c=n,sum=ans;

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

return

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

}

51Nod1494 選舉拉票

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

51NOD1494 選舉拉票

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

列舉 線段樹 51Nod1494 選舉拉票

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