51Nod1494 選舉拉票

2021-08-08 12:00:55 字數 1251 閱讀 6630

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

input

單組測試資料。

第一行有乙個整數n (1 ≤ n ≤ 10^5),表示這個縣的選民數目。

接下來有n行,每一行有兩個整數ai 和 bi (0 ≤ ai ≤ 10^5; 0 ≤ bi ≤ 10^4),表示第i個選民選的是第ai號候選人,想要讓他選擇自己就要花bi的錢。你是0號候選人(所以,如果乙個選民選你的話ai就是0,這個時候bi也肯定是0)。

output

輸出乙個整數表示花費的最少的錢。

input示例

5 1 2

1 2

1 2

2 1

0 0

output示例

3題解

逆向思維,考慮每個人都投自己,刪去錢最多的票。

列舉其他候選人的得票數,顯然貪心選取每個人代價最大的票,把這些票加入線段樹,假設還需要k票,就從線段樹中找最小的k個。

**

#include

#define mod 998244353

#define ll long long

#define inf 0x7fffffff

using

namespace

std;

inline

int read()

while(ch>='0'&&ch<='9')

return x*f;

}int num[40005],sum[40005];

int n,n,mx,m,ans;

vector

f[100005];

vector

f[100005];

void update(int k,int l,int r,int x)

int query(int k,int l,int r,int x)

int main()

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

int tmp=0;

if (n<=i+1) tmp=query(1,1,mx,i+2-n);

ans=min(ans,sum+tmp);

}printf("%d",ans);

return

0;}

51NOD1494 選舉拉票

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

列舉 線段樹 51Nod1494 選舉拉票

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

51nod 1494 選舉拉票 cf458C

中文題面 考慮把所有人的票分別從大到小排序之後可以看做n條線段 列舉自己的票數為i,所以每條線段超過i的部分必須收買,如果還不夠就到前面挑不夠的 104 求前k小想到權值線段樹 應該是類似的東西 include include include define n 100000 define ll lo...