NOIP2010
DP,区间覆盖
1 #include<bits/stdc++.h> 2 using namespace std; 3 inline int read() 4 { 5 int x=0;char c=getchar(); 6 for(;!isdigit(c);c=getchar()); 7 for(;isdigit(c);c=getchar()) x=x*10+c-'0'; 8 return x; 9 } 10 const int N=505; 11 int n,m; 12 int l[N][N],r[N][N],h[N][N]; 13 bool vis[N][N]; 14 int xx[4]={1,0,-1,0},yy[4]={0,1,0,-1}; 15 16 17 inline void dfs(int x,int y) 18 { 19 vis[x][y]=true; 20 for(int i=0;i<4;i++) 21 { 22 int nx=x+xx[i]; 23 int ny=y+yy[i]; 24 if(h[nx][ny]>=h[x][y]) continue; 25 if(!vis[nx][ny]) dfs(nx,ny); 26 l[x][y]=min(l[x][y],l[nx][ny]); 27 r[x][y]=max(r[x][y],r[nx][ny]); 28 } 29 } 30 int main() 31 { 32 memset(l,0x3f,sizeof(l)); 33 n=read();m=read(); 34 for(int i=1;i<=n;i++) 35 for(int j=1;j<=m;j++) 36 h[i][j]=read(); 37 for(int i=1;i<=m;i++) 38 { 39 l[n][i]=r[n][i]=i; 40 } 41 for(int i=1;i<=m;i++) dfs(1,i); 42 int cnt=0; 43 for(int i=1;i<=m;i++) 44 if(!vis[n][i]) cnt++; 45 if(cnt) 46 { 47 printf("0\n%d\n",cnt); 48 return 0; 49 } 50 int left=1; 51 int ans=0; 52 while(left<=m) 53 { 54 int maxr=0; 55 for(int i=1;i<=m;i++) 56 if(l[1][i]<=left) maxr=max(maxr,r[1][i]); 57 ans++; 58 left=maxr+1; 59 } 60 printf("1\n%d\n",ans); 61 return 0; 62 }
模拟
1 #include<bits/stdc++.h> 2 using namespace std; 3 inline int read() 4 { 5 int x=0;char c=getchar(); 6 for(;!isdigit(c);c=getchar()); 7 for(;isdigit(c);c=getchar()) x=x*10+c-'0'; 8 return x; 9 } 10 int n,m; 11 bool vis[1005]; 12 int a[1005]; 13 int main() 14 { 15 n=read();m=read(); 16 int tail=0; 17 int ans=0; 18 for(int i=0;i<m;i++) 19 { 20 int x=read();x++; 21 if(vis[x]) continue; 22 vis[a[tail]]=false; 23 a[tail]=x; 24 tail=(tail+1)%n; 25 vis[x]=true; 26 ans++; 27 } 28 printf("%d\n",ans); 29 return 0; 30 }

浙公网安备 33010602011771号