QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#822834 | #8050. Random Permutation | EBeason# | TL | 0ms | 0kb | C++14 | 1.1kb | 2024-12-20 16:55:49 | 2024-12-20 16:55:49 |
answer
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(1, 2, 3, "Ofast", "inline")
int n;
int a[300300];
long long ans=0;
//unordered_map<int,int> l;
struct likemap {
int ma[300300];
int& operator [] (int x) {
return ma[x+100000];
}
}l;
double getl(double p) {
if(abs(0.5-p)<1e-9) return 10*n;
else return min(10.0*n,log(5e-7) / (log(2)+log(p)/2+log(1-p)/2));
}
void solve(int x) {
int mxl=getl(1.0*a[x]/n);
l[0]=1;
int ll=max(1,x-mxl),rr=min(n,x+mxl);
for(int i=x-1,tmp=0;i>=ll;--i) {
if(a[i]<a[x]) --tmp;
else ++tmp;
l[tmp]=l[tmp]+1;
}
long long res=0;
res+=1ll*l[0]+1ll*l[1];
for(int i=x+1,tmp=0;i<=rr;++i) {
if(a[i]<a[x]) --tmp;
else ++tmp;
res+=1ll*l[-tmp]+1ll*l[-tmp+1];
}
ans+=res*a[x];
l[0]=0;
for(int i=x-1,tmp=0;i>=ll;--i) {
if(a[i]<a[x]) --tmp;
else ++tmp;
l[tmp]=0;
}
}
int main() {
// scanf("%d",&n);
n=300000;
for(int i=1;i<=n;++i) {
// scanf("%d",&a[i]);
a[i]=i;
}
random_shuffle(a+1,a+n+1);
for(int i=1;i<=n;++i) {
solve(i);
if(i%10000==0) cout<<i<<endl;
}
printf("%lld\n",ans);
return 0;
}
/*
4
1 4 2 3
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Time Limit Exceeded
input:
4 1 4 2 3
output:
10000 20000 30000 40000 50000 60000 70000