Codeforces Round #390 (Div. 2)
22:35~0:35 1.6.2017
题意:自己看
题解:
构造什么的最弱了
想了想,貌似除了0每个数单独一组就可以,只要有一个非0数则一定可以有解
0的话不停往前找到第一个非0然后合为一组
第一个数是0怎么办?先让第一个数往后找一个非0呗
比赛的时候智商骤减,写的代码好难看还写了好长时间,并且还WA一次...应该可以很简洁的吧
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=105; inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();} return x*f; } int n,a[N],f[N],l[N],r[N],k,sum,vis[N]; void solve(){ k++; l[k]=1;r[k]=1; if(f[1]!=0){ for(int i=2;i<=n;i++){ if(f[i]==0){ int p=i-1; while(f[p]==0) p--; if(p<=r[k]) r[k]=i; else {k++;l[k]=p;r[k]=i;} } } puts("YES"); int now=1,cnt=k; for(int i=1;i<=n;i++){ if(l[now]<=i&&i<=r[now]) {if(i==r[now])now++;} else cnt++; } printf("%d\n",cnt); now=1; for(int i=1;i<=n;i++){ if(l[now]<=i&&i<=r[now]){ if(!vis[now]) printf("%d %d\n",l[now],r[now]),vis[now]=1; if(i==r[now]) now++; }else printf("%d %d\n",i,i); } }else{ int p=1; while(f[p]==0) p++;//,printf("hi %d %d\n",p,f[p]); if(p>n) {puts("NO");return;} r[k]=p; for(int i=p+1;i<=n;i++){ if(f[i]==0){ int p=i-1; while(f[p]==0) p--; if(p<=r[k]) r[k]=i; else {k++;l[k]=p;r[k]=i;} } } puts("YES"); int now=1,cnt=k; for(int i=1;i<=n;i++){ if(l[now]<=i&&i<=r[now]) {if(i==r[now])now++;} else cnt++; } printf("%d\n",cnt); now=1; for(int i=1;i<=n;i++){ if(l[now]<=i&&i<=r[now]){ if(!vis[now]) printf("%d %d\n",l[now],r[now]),vis[now]=1; if(i==r[now]) now++; }else printf("%d %d\n",i,i); } } } int main(){ n=read(); for(int i=1;i<=n;i++) a[i]=read(),f[i]=a[i]==0?0:1; solve(); }