題目傳送門
掃瞄線是什麼鬼啊……為什麼我好像什麼都不會啊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...