Submission #243667

#TimeUsernameProblemLanguageResultExecution timeMemory
243667TadijaSebezRLE (BOI06_rle)C++11
100 / 100
644 ms78616 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ll long long
const int N=100050;
const int M=2000050;
int a[M],n,m;
vector<pair<int,ll>> seq;
void push(int x,ll sz){
	if(seq.size()&&seq.back().first==x)seq[seq.size()-1].second+=sz;
	else seq.pb({x,sz});
}
void Decrypt(){
	int key=0;
	for(int i=1;i<=m;i++){
		if(a[i]==key){
			if(a[i+1]==key){
				push(a[i+1],a[i+2]+1);
			}else{
				if(a[i+2]==0)key=a[i+1];
				else push(a[i+1],a[i+2]+3);
			}
			i+=2;
		}else push(a[i],1);
	}
}
vector<int> ans;
int Calc1(ll sz){
	int cnt=0;
	while(sz>0){
		cnt+=3;
		sz-=n;
	}
	return cnt;
}
int Calc2(ll sz){
	int cnt=0;
	while(sz>0){
		if(sz<=3)cnt+=sz;
		else cnt+=3;
		sz-=n+2;
	}
	return cnt;
}
int dp[N],nxt[N],prv[N],add,mn;
bool cng[M];
int go[M];
void Solve(){
	for(int i=0;i<n+4;i++)nxt[i]=prv[i]=-1;
	dp[0]=0;nxt[n+0]=0;prv[0]=n+0;
	int las=n+3;
	for(int i=1;i<n;i++){
		dp[i]=3;
		nxt[las]=i;
		prv[i]=las;
		las=i;
	}
	for(int tm=0;tm<seq.size();tm++){
		int x=seq[tm].first;
		ll sz=seq[tm].second;
		int c1=Calc1(sz);
		int c2=Calc2(sz);
		dp[x]+=add;
		int a=prv[x],b=nxt[x];
		if(~a)nxt[a]=b;
		if(~b)prv[b]=a;
		nxt[x]=prv[x]=-1;
		add+=c2;mn+=c2;
		int mnp,now;
		for(int i=0;i<4;i++)if(nxt[n+i]!=-1){mnp=nxt[n+i];now=mn+i;break;}
		if(dp[x]+c1<=now+3){
			dp[x]+=c1;
			cng[tm]=false;
		}else{
			dp[x]=now+3;
			cng[tm]=true;
			go[tm]=mnp;
		}
		int my=dp[x]-mn;
		while(my>3){
			mn++;
			for(int i=0;i<3;i++){
				if(~nxt[n+i+1])prv[nxt[n+i+1]]=n+i;
				nxt[n+i]=nxt[n+i+1];
			}
			nxt[n+3]=-1;
			my--;
		}
		dp[x]-=add;
		nxt[x]=nxt[n+my];
		prv[x]=n+my;
		if(~nxt[n+my])prv[nxt[n+my]]=x;
		nxt[n+my]=x;
		while(nxt[n+0]==-1){
			mn++;
			for(int i=0;i<3;i++){
				if(~nxt[n+i+1])prv[nxt[n+i+1]]=n+i;
				nxt[n+i]=nxt[n+i+1];
			}
			nxt[n+3]=-1;
		}
	}
}
void Add(int key,int x,ll sz){
	while(sz>0){
		if(key==x){
			int l=min(sz,(ll)n);
			ans.pb(l-1);
			ans.pb(x);
			ans.pb(key);
			sz-=l;
		}else{
			if(sz<=3){
				while(sz--)ans.pb(x);
			}else{
				int l=min(sz,(ll)n+2);
				ans.pb(l-3);
				ans.pb(x);
				ans.pb(key);
				sz-=l;
			}
		}
	}
}
void ChangeKey(int x,int y){
	ans.pb(0);
	ans.pb(y);
	ans.pb(x);
}
void Encrypt(){
	int key=nxt[n+0];
	for(int i=seq.size()-1;i>=0;i--){
		if(key==seq[i].first&&cng[i]){
			int nKey=go[i];
			ChangeKey(nKey,key);
			key=nKey;
		}
		Add(key,seq[i].first,seq[i].second);
	}
	if(key!=0)ChangeKey(0,key);
	reverse(ans.begin(),ans.end());
}
int main(){
	scanf("%i %i",&n,&m);
	for(int i=1;i<=m;i++)scanf("%i",&a[i]);
	Decrypt();
	Solve();
	Encrypt();
	printf("%i\n",ans.size());
	for(int i:ans)printf("%i ",i);
	printf("\n");
	return 0;
}

Compilation message (stderr)

rle.cpp: In function 'void Solve()':
rle.cpp:58:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int tm=0;tm<seq.size();tm++){
               ~~^~~~~~~~~~~
rle.cpp: In function 'int main()':
rle.cpp:149:26: warning: format '%i' expects argument of type 'int', but argument 2 has type 'std::vector<int>::size_type {aka long unsigned int}' [-Wformat=]
  printf("%i\n",ans.size());
                ~~~~~~~~~~^
rle.cpp:144:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i %i",&n,&m);
  ~~~~~^~~~~~~~~~~~~~~
rle.cpp:145:28: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1;i<=m;i++)scanf("%i",&a[i]);
                       ~~~~~^~~~~~~~~~~~
rle.cpp: In function 'void Solve()':
rle.cpp:71:19: warning: 'now' may be used uninitialized in this function [-Wmaybe-uninitialized]
   if(dp[x]+c1<=now+3){
                ~~~^~
rle.cpp:77:10: warning: 'mnp' may be used uninitialized in this function [-Wmaybe-uninitialized]
    go[tm]=mnp;
    ~~~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...