jzoj 5562 簡單構造

2022-07-15 01:27:14 字數 1946 閱讀 8656

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 3

0 1 2

sample output

1 2 3
data 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 列的矩形。而簡單數謎也只有兩種要求,就是行要求和列要求,且分別處於第一行和第一列,其他格仔則是空格,而左上角是忽略不計的 給一些簡單數謎填好了其中的一些空格。現在要完成這些簡單數謎 ...