[关闭]
@994495jj 2017-08-14T11:35:40.000000Z 字数 1018 阅读 770

cfgym100253K

201708 (ACM)动态规划


题意

题解

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define mp make_pair
  6. #define pb push_back
  7. #define sz(a) (int)a.size()
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<" = "<<a<<endl
  10. typedef long long ll;
  11. typedef pair<int, int> pii;
  12. typedef vector<int> vi;
  13. //----
  14. const int N=300005;
  15. int n;
  16. int a[N],lm[N],mr[N],dp[N],pre[N],ty[N];
  17. void init() {
  18. for(int l=1,r=1,t=1;r<=n;++r,++t) {
  19. while(a[r]<t) {
  20. ++l;
  21. --t;
  22. }
  23. lm[r]=l;
  24. }
  25. for(int l=n,r=n,t=1;l;--l,++t) {
  26. while(a[l]<t) {
  27. mr[r]=l+1;
  28. --r;
  29. --t;
  30. }
  31. }
  32. rep(i,1,n+1) if(!mr[i]) mr[i]=1;
  33. }
  34. int main(){
  35. scanf("%d",&n);
  36. rep(i,1,n+1) scanf("%d",a+i);
  37. init();
  38. rep(i,1,n+1) {
  39. pre[i]=lm[i];
  40. ty[i]=0;
  41. if(mr[i]<pre[i]) {
  42. pre[i]=mr[i];
  43. ty[i]=1;
  44. }
  45. dp[i]=dp[pre[i]-1]+1;
  46. }
  47. printf("%d\n",dp[n]);
  48. vector<pii> ans;
  49. int now=n;
  50. for(;pre[now]&&now;) {
  51. int x=pre[now],y=now;
  52. if(ty[now]) swap(x,y);
  53. ans.pb(mp(x,y));
  54. now=pre[now]-1;
  55. }
  56. for(int i=sz(ans)-1;i>=0;--i) printf("%d %d\n",ans[i].fi,ans[i].se);
  57. return 0;
  58. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注