直接做不太可做,我們可以列舉乙個
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...