description
一次歌唱比賽中,一位歌手剛剛結束表演,評委正在打分。一共有n 位評委,
他們每人可以打1 分或0 分,第i 位評委希望歌手的得分為v[i]。
評委們有特殊的控分技巧,他們會按乙個順序依次評分,第乙個評分的評委
會不管三七二十一打0 分。對於接下來的評委,假設前面a 位評委評分總和為
b,評委會認為這位歌手期望得分為b/a*n,如果這個得分低於他所希望的得
分,他會打1 分,否則他會打0 分。
作為最大的黑幕——裁判,你對這一切心知肚明。你希望選手的得分為p
(0<=p<=n),為此你可以調換評委們的評分順序。你需要輸出乙個1~n 的排
列,第i 個位置表示第i 個評分的裁判的編號,讓選手的得分最接近p。如果
有多種,你只需要輸出任意一種。
input
第一行兩個整數n、p,表示評委個數和你對歌手的期望得分。
第二行n 個整數v[1],v[2]…v[n],表示每個評委對歌手的期望得分。
保證0<=p,v[1],v[2]…v[n]<=n。
output
一行乙個1~n 的排列,用空格分開。
sample input
3 3sample output0 1 2
1 2 3data constraint
subtask 1,10pts,1<=n<=10。
subtask 2,20pts,1<=n<=100。
subtask 3,30pts,1<=n<=1000。
subtask 4,10pts,1<=n<=10^5,p=0。
subtask 5,30pts,1<=n<=10^5。
sol :
那麼我們可以發現,假設裁判的期望得分是有序的,那麼按編號順序投票得分最大,按編號順序倒序投票得分最小,因為如果這兩個不是極值,交換乙個相鄰的順序/逆序對不會變劣。
然後二分決策。
code:
#include#define ll long long#define n 204007
using
namespace
std;
intn,a[n],now,p,pos[n],id[n]; ll seg;
template
inline
void read(t &x)
void write(int x) write(x/10); putchar('
0'+x%10
);}inline
void writeln(int x)
inline
void writel(int x)
void sol(int *a,ll otk)
if(otk) now=0
;
for (int i=1;i<=n;i++) if (!a[i]) a[i]=++now;
}int
ans,w[n],anw;
ll r,top,st;
intdos(ll otk)
void
out(ll otk)
signed main () );
//for (int i=1;i<=n;i++) id[pos[i]]=i;
sort(w+1,w+n+1
); anw=dos(0
);
if (p>=anw)
//l=0; r=n*(n-1)/2;
r=1ll<<50; st=0
;
while
(r)
top=dos(st)-p1)?st:st+1;//
out(top-1);
out(top);
//out(top+1);
return0;
}
JZOJ5728 簡單計數
乍一看不是很會。先考慮不是環怎麼做。考慮分類地計數,即把方案歸到某一型別裡,再分別計算每乙個型別的數量來求答案。最終一種方案肯定有若干段相同顏色段,我們可以直接考慮每一種顏色的劃分貢獻,然後再算出他們組合起來的方案數。具體地,我們計算出f i,j 表示把i個相同的球分成j段的貢獻和,一種方案貢獻為每...
jzoj 5561 簡單模擬
description 很久很久以前,有乙個1 n 的排列a,還有乙個長度為q 的,每個元素在1 到n 之間的序列b 0 b q 1 作為一道簡單模擬題,你需要模擬m 次操作,第i 1 到m 次操作你會在 a 中找到值為b i 1 q 的元素,並把它與第乙個元素交換。你只需要輸出m 次操作之後的序列...
Jzoj 2198 簡單數迷
現在我們需要解決的是乙個更簡單的數謎問題。簡單數謎的形狀是乙個 n 1 n 1 n 1 行乘 m 1 m 1 m 1 列的矩形。而簡單數謎也只有兩種要求,就是行要求和列要求,且分別處於第一行和第一列,其他格仔則是空格,而左上角是忽略不計的 給一些簡單數謎填好了其中的一些空格。現在要完成這些簡單數謎 ...