求卡常qwq
查看原帖
求卡常qwq
1414683
_Blood__Stringer_楼主2024/8/12 22:02

如果复杂度不对跟我说一下优化方法,#8#9TLE,本题测出来 5s 左右(尝试5s卡常过ls,真有我的喔)

#include<bits/stdc++.h>
//#define int long long
#define debug puts("qwq");
#define inf 0x3f3f3f3f
#define infi 0x3f3f3f3f3f3f3f3fll
#define up(i,x,y) for(register int i=x;i<=y;++i)
#define dn(i,x,y) for(register int i=x;i>=y;--i)
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10|48);}
inline void writeln(int x){write(x),putchar('\n');}
inline void writesp(int x){write(x),putchar(' ');}
inline void getstr(string &str,char endy='\n'){str="";char ch=getchar();while(ch<32||ch>127||ch==endy)ch=getchar();while(ch>=32&&ch<=127&&ch!=endy)str+=ch,ch=getchar();}
inline void putstr(string str,char endy='\n'){up(i,0,str.length()-1)putchar(str[i]);putchar(endy);}
inline void fre(){freopen("P7912_8.in","r",stdin),freopen("P7912_8.txt","w",stdout);}
int pre[200005],nxt[200005],col[200005],a[200005],xcznxt[200005],head=1;vector<int>block[200005];
struct node{int l,r;};
signed main(){
	fre();
	int n=read(),tot=0,dead=0;
	up(i,1,n)a[i]=read();
	a[0]=2;
	up(i,1,n)if(a[i-1]!=a[i])block[++tot].push_back(i),col[tot]=a[i],pre[tot]=tot,nxt[tot]=tot;else block[tot].push_back(i);
	up(i,1,tot)reverse(block[i].begin(),block[i].end());
	up(i,1,tot)xcznxt[i]=i+1;
	xcznxt[tot]=0;
	while(1){
		for(register int i=head;i;i=xcznxt[i])if(pre[i]==i)writesp(block[i].back()),block[i].pop_back(),++dead;
		if(dead>=n)break;
		int prev=0,flag=1;
		for(register int i=head;i;flag?i=xcznxt[i]:i=i){
			if(!block[i].size()){
				int nxter=xcznxt[i];
				if(i==head){
					int nhead=xcznxt[head];
					xcznxt[head]=head;
					head=nhead;
				}else xcznxt[prev]=xcznxt[i],xcznxt[i]=i;
				if(nxt[i]!=i)pre[nxt[i]]=nxt[i],nxt[i]=i;
				i=nxter,flag=0;
			}else prev=i,flag=1;
		}vector<node>lis;node tmp;
		for(register int i=head;i;i=xcznxt[i]){
			if(pre[i]==i)tmp.l=i;
			if(nxt[i]==i)tmp.r=i,lis.push_back(tmp);
		}tmp.l=0,tmp.r=0;
		for(auto i:lis){
			if(!tmp.l&&!tmp.r){tmp=i;continue;}
			if(col[tmp.l]==col[i.l]){
				nxt[tmp.r]=i.l;
				pre[i.l]=tmp.r;
			}tmp=i;
		}puts("");
	}return 0;
}
2024/8/12 22:02
加载中...