一開始有start個人投自己,num表示當前已經收買了多少人,從大到小列舉自己以i張票當選,那麼其他人的票數一定要小於i,拿錢收買他們花費最少的》=i的這部分人,再加上另外要收買的i-start-num個最便宜收買的花費就是當前答案,這裡可以對每個人的收買代價建立權值線段樹來查詢收買前i-start-num個最便宜的花費。注意不是選自己的選民可以選別人的時候叛變花費可能為0,所以線段樹應該從0開始。
1#define dbg(x) cout<<#x<<" = "<< (x)<< endl
2#define io std::ios::sync_with_stdio(0);
3 #include 4
#define iter ::iterator
5using
namespace
std;
6 typedef long
long
ll;7 typedef pairp;
8#define pb push_back
9#define se second
10#define fi first
11#define rs o<<1|1
12#define ls o<<1
13const ll inf=0x7fffffff;14
const
int n=1e5+10;15
intm;
16 priority_queue,greater>q[n];
17int
id[n],vis[n],cnt;
18ll start;
19bool
cmp(ll x,ll y)
22struct
nodea[n*4
];25
void push(int
o)29
void up(int o,int l,int r,int
p,ll v)
35int m=(l+r)/2;36
if(p<=m)up(ls,l,m,p,v);
37else up(rs,m+1
,r,p,v);
38push(o);39}
40 ll qu(int o,int l,int r,int
p)48
intmain()
57q[x].push(y);
58 up(1,0,50000,y,1
);59
if(!vis[x])63}
64 sort(id+1,id+1+cnt,cmp);
65 ll ans=1e18,res=0,num=0;66
for(int i=m;i>=max(1ll,start);i--)77}
78 ll r=qu(1,0,50000,i-num-start);
79 ans=min(ans,res+r);80}
81 printf("
%lld\n
",ans);
82 }
51Nod1494 選舉拉票
現在你要競選乙個縣的縣長。你去對每乙個選民進行了調查。你已經知道每乙個人要選的人是誰,以及要花多少錢才能讓這個人選你。現在你想要花最少的錢使得你當上縣長。你當選的條件是你的票數比任何乙個其它候選人的多 嚴格的多,不能和他們中最多的相等 請計算一下最少要花多少錢。input 單組測試資料。第一行有乙個...
51NOD1494 選舉拉票
現在你要競選乙個縣的縣長。你去對每乙個選民進行了調查。你已經知道每乙個人要選的人是誰,以及要花多少錢才能讓這個人選你。現在你想要花最少的錢使得你當上縣長。你當選的條件是你的票數比任何乙個其它候選人的多 嚴格的多,不能和他們中最多的相等 請計算一下最少要花多少錢。1 n 10 5,0 ai 10 5 ...
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...