萌新求助,不会计算时间复杂度
查看原帖
萌新求助,不会计算时间复杂度
236862
Miraik楼主2021/10/27 23:11

RT,考场代码,感觉是 O(nlogn)O(nlogn),各自测网站的民间弱数据也跑的飞快,但是还是不会算 /kk

代码如下,求神仙帮忙分析qwq

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=1073741823;
const ll inff=(1ll<<60);
const int N=200005;
#define pii pair<int,int>
#define pb push_back
#define fir first
#define sec second
//#define int ll
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
	return x*f;
}
int n,c[N],out[N],target[N],le;
int a[5][N],cnt[5];
int main(){
	//freopen("fruit.in","r",stdin);
	//freopen("fruit.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++)c[i]=read();
	c[0]=-1;
	for(int i=1;i<=n;i++)
		a[c[i]][++cnt[c[i]]]=i;
	a[0][++cnt[0]]=n+1;
	a[1][++cnt[1]]=n+1;
	int res=n;
	le=1;
	while(res){
		int i=le;
		while(i<=n){
			printf("%d ",i);
			out[i]=1;
			res--;
			int tar=(!c[i]);
			if(c[i] == c[i-1]){
				target[i] = min(target[i-1] + 1,cnt[tar]);
			}
			else{
				int l=1,r=cnt[tar];
				int x=n+1;
				while(l<=r){
				    int mid=(l+r)>>1;
					if(a[tar][mid] > i)x=min(x,mid),r=mid-1;
					else l=mid+1;
				}
			    while(out[a[tar][x]]) x++;
				target[i]=x;
			}
			while(out[a[tar][target[i]]]) target[i]++;
			i=a[tar][target[i]];
		}
		while(out[le])le++;
		puts("");
	}
	return 0;
}
2021/10/27 23:11
加载中...