題面:
平均數:
第k個平均數不好求,我們考慮二分,轉化成平均數小於x的有幾個
慮把序列中的每個數減去 x,則我們只需求區間和小於 0 的區間數量。
我們對這個序列求字首和,則區間[l,r]和小於 0 當且僅當 sl-1>sr,
答案即為字首和序列 s 的逆序對數量,使用經典的歸併排序即可解決
#include#include#include#include#include#define int long long#define double long double
using namespace std;
const int maxn=1e5+5;
int n,k,ans=0;
double l=0.0,r=1e9+1,sum[maxn],temp[maxn],res,a[maxn];
double max(double a,double b)
void merge_sort(int l,int r)else
} while(i<=mid)
while(j<=r)
for(i=l;i<=r;i++)
sum[i]=temp[i];
}bool check(double x)
merge_sort(0,n);
return ans序列:
考慮主席樹,相當與對每乙個位置建一棵動態開點權值線段樹,
我們不能把所有區間插進去,我們插入詢問,對於每乙個位置,經過它的詢問有很多,我們統計a[i]對整個答案的貢獻
我們對每乙個位置插入所有在這個位置上要查詢的x,然後答案就是對於每乙個位置i,在i所在的線段樹中找小於a[i]的x的數量,這是a[i]對整個答案的貢獻
修改後我們還像之前那樣查詢,如果將p位置更改為v,那麼減去a[p]的貢獻,在加上更改後的v對整個答案的貢獻
#include#include#include#include#include#define int long long
#define re register
using namespace std;
const int maxn=1e5+5;
int n,m,q,a[maxn],ans,x[maxn];
int root[maxn],tot=0,ls[maxn<<6],rs[maxn<<6],tr[maxn<<6];
struct node;
vectorv[maxn];
inline void insert(re int &k,re int pre,re int l,re int r,re int pos,re int val)
re int mid=(l+r)>>1;
if(pos<=mid) insert(ls[k],ls[pre],l,mid,pos,val);
else insert(rs[k],rs[pre],mid+1,r,pos,val);
tr[k]=tr[ls[k]]+tr[rs[k]];
}inline int query(re int k,re int l,re int r,re int opl,re int opr)
signed main()
for(re int i=1,l,r;i<=m;++i));
v[r+1].push_back((node));
} for(re int i=1;i<=n;++i)
} for(re int i=1;i<=n;++i)
printf("%lld\n",ans);
for(re int i=1,p,v;i<=q;++i)
return 0;
}
csp s模擬測試52
標籤 平均數處理 查單點上的區間操作 期望得分 40 40 40 實際得分 40 40 40 打了三個暴力 查詢第k小的連續子串行平均值。二分,很妙 二分平均值x,所有數減去x,做字首和,平均值比x小的區間 l,r 有 sum r sum 0 sum的逆序對數即是x在所有區間裡的排名。由於實數域,歸...
csp s模擬測試94
一場簡單題,打爆了。t1 腦抽分解質因數準備分子分母消,想了半天發現 jb 互質直接上天,果斷碼了高精滾蛋。t2 無腦手玩大樣例,突然靈光一閃想到對映到前 k 大小的區間,t3 寫完暴力準備划水,突然發現特殊性質可寫,10 分鐘拯救了 25 分。8003 24 46 7003 24 58 6503 ...
csp s模擬測試93
自閉場。t1 想到 cdq 因為複雜度少看見乙個 0 打了半年還用了 sort 直接廢掉,t2 t3 直接自閉暴力分都沒有。考場太慌了,心態不好。8002 07 34 003 12 11 0 03 11 53 8003 12 11 沒有前途就是垃圾趁早滾回實驗二安度晚年吧。cdq 不接受反駁。最簡單...