標籤:hdu 雜題
題意:
0序列為 a1、a2、a3……an 根據運算規則ai=ai+1-ai計算i序列 如果序列單調則為合理序列 問從0開始到第幾序列是合理的 如果一直合理就是nice 如果一開始就不合理就是ugly
思路:
照著題解做 - -b 負責度證明很是精妙 具體見官方題解
這裡有一點需要補充 就是壓縮0的那個最佳化 壓縮只能在串首和串尾進行 因為要保證答案不變
還有不是每次壓縮之後留下一個0 而是要保證“對於i序列來講 如果它被壓縮了 那麼在壓縮處要留下一個0” 注意理解這句話 這就是為什麼下面的代碼中 令L--和R++的時候 判斷條件不是“在這個回合內”壓縮過 而是判斷長度!! 這是關鍵!!
代碼:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef __int64 LL;#define N 100010LL a[N];int L,R,t,n,ans;int main(){ int i,small,big; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%I64d",&a[i]); L=1; R=n; for(ans=0;ans<n;ans++) { small=big=0; while(L<=R&&!a[L]) L++; if(L>1) L--; while(R>=L&&!a[R]) R--; if(R<n-ans) R++; if(L>=R) break; for(i=L;i<R;i++) { if(a[i]<a[i+1]) small=1; if(a[i]>a[i+1]) big=1; } if(small&&big) { if(!ans) puts("ugly series"); else printf("%d\n",ans-1); ans=-1; break; } for(i=L;i<R;i++) a[i]=a[i+1]-a[i]; R--; } if(ans!=-1) puts("nice series"); } return 0;}