对了70分,剩下的TLE QAQ
查看原帖
对了70分,剩下的TLE QAQ
701254
Mu_leaf楼主2023/1/12 11:15

大佬能不能帮我调调QAQ

我根本没想到分块能超时啊

#include <bits/stdc++.h>

using namespace std;
int a[100005],f[100005];
int m,n,x,t=1,ans[100005],vis[100005],visk[10005],l[100005],fk[100005];
int fkn;
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {
		cin >> a[i];
	}
	for(int i=n;i>0;i--){
		for(int j=1;j<a[i];j++){
			while(j+100<a[i]&&j%100==0){
				ans[i]+=fk[j/100];
				j+=100;
			}
			ans[i]+=f[j];
		}
		fk[a[i]/100]++;
		f[a[i]]++;
	}
	ans[n]+=m;
	for(int i=n; i>0; i--) {
		ans[i-1]+=ans[i]/(n-i+1);
		ans[i]%=(n-i+1);
	}

	for(int i=1; i<=n; i++) {
		int to=0,index;
	
		for(int j=1; j<=n; j++) {
			bool flag=0;	
			while(j%100==0 && j+100<=n){
				if(to+fk[j/100]<1+ans[i]){
					to+=fk[j/100];
					j+=100;
				}else{
					for(int k=j;k<=j+100;k++){
						if(!vis[k]){
							to++;
						}
						if(to==ans[i]+1){
							cout << k << ' ';
							fk[j/100]--;vis[k]=1;flag=1;
							break;
						}
					}
					
				}
			}if(flag) break;
			to+=f[j];
			if(to==1+ans[i]){
				printf("%d ",j);
				vis[j]=1;
				f[j]--;
				break;
			}
		}
		
	}
	return 0;
}

我是用的教练的想法,写的分块...

2023/1/12 11:15
加载中...