QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#822834#8050. Random PermutationEBeason#TL 0ms0kbC++141.1kb2024-12-20 16:55:492024-12-20 16:55:49

Judging History

你现在查看的是最新测评结果

  • [2024-12-20 16:55:49]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [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

result: