Submission #199460

#TimeUsernameProblemLanguageResultExecution timeMemory
199460TadijaSebezRLE (BOI06_rle)C++11
80 / 100
2593 ms61884 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back const int N=100050; const int M=2000050; int a[M],n,m; vector<pair<int,ll>> seq; void push(int x, int 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); } } int change[M]; 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],lzy; set<pair<int,int>> all; void Solve() { for(int i=1;i<n;i++) dp[i]=3; for(int i=0;i<n;i++) all.insert({dp[i],i}); lzy=0; for(int tm=0;tm<seq.size();tm++) { change[tm]=-1; int x=seq[tm].first; ll sz=seq[tm].second; int k=-1; for(int j=0;j<n;j++) if(j!=x && (k==-1 || dp[k]>dp[j])) k=j; int c1=Calc1(sz); int c2=Calc2(sz); dp[x]+=c1; for(int j=0;j<n;j++) if(j!=x) dp[j]+=c2; if(dp[k]+3<dp[x]) dp[x]=dp[k]+3,change[tm]=k; /*all.erase({dp[x],x}); int tmp=dp[x]+lzy; int c1=Calc1(sz); int c2=Calc2(sz); int mn,p; tie(mn,p)=*all.begin(); mn+=lzy; if(mn+lzy+c2+3<tmp+c1) { change[tm]=p; tmp=mn+lzy+c2+3; } else tmp+=c1; lzy+=c2; dp[x]=tmp-lzy; all.insert({dp[x],x});*/ } } void Add(int key, int x, ll sz) { while(sz>0) { if(key==x) { int l=min(sz,(ll)n); ans.pb(key); ans.pb(x); ans.pb(l-1); sz-=l; } else { if(sz<=3) { while(sz--) ans.pb(x); } else { int l=min(sz,(ll)n+2); ans.pb(key); ans.pb(x); ans.pb(l-3); sz-=l; } } } } void ChangeKey(int x, int y) { ans.pb(x); ans.pb(y); ans.pb(0); } void Encrypt() { //int key=all.begin()->second; int key=0; for(int i=0;i<n;i++) if(dp[i]<dp[key]) key=i; vector<pair<int,pair<int,ll>>> op; for(int i=seq.size()-1;i>=0;i--) { if(seq[i].first==key && change[i]!=-1) { int nKey=change[i]; //ChangeKey(nKey,key); op.pb({nKey,{key,-1}}); key=nKey; } //Add(key,seq[i].first,seq[i].second); op.pb({key,{seq[i].first,seq[i].second}}); } if(key!=0) op.pb({0,{key,-1}});//ChangeKey(0,key); reverse(op.begin(),op.end()); for(auto o:op) { if(o.second.second==-1) ChangeKey(o.first,o.second.first); else Add(o.first,o.second.first,o.second.second); } } 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:65: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:165: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:160: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:161:29: 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]);
                        ~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...