2014年3月6日 星期四
[HOJ] 230 - Zoo
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<set>
#include<vector>
using namespace std;
#define N 50010
int dp[N][2][2][2][2][2]={0};
bool check[N][2][2][2][2][2]={0};
int arr[N]={0};
vector<int> vec[N];
struct P{
int p,x,y;
vector<int> A,B;
}s[N];
int main(){
//freopen("4.in","r",stdin);
int n,m,i,j,k,a,b,c,d,e,x,y,z,flag,tmp,ans=0;
memset(arr,-1,sizeof(arr));
scanf("%d%d",&n,&m);
for(i=0;i<m;i++){
scanf("%d%d%d",&s[i].p,&s[i].x,&s[i].y);
s[i].p--;
s[i].p=s[i].p+4;
s[i].p%=n;
if(s[i].p<5) s[i].p+=n;
arr[s[i].p]=1;
vec[s[i].p].push_back(i);
//printf("%d,,",s[i].p);
for(j=0;j<s[i].x;j++){
scanf("%d",&k);
k--;
if(k==(s[i].p)%n||k==(s[i].p-1)%n||k==(s[i].p-2)%n||k==(s[i].p-3)%n||k==(s[i].p-4)%n)
s[i].A.push_back(k);
}
for(j=0;j<s[i].y;j++){
scanf("%d",&k);
k--;
if(k==(s[i].p)%n||k==(s[i].p-1)%n||k==(s[i].p-2)%n||k==(s[i].p-3)%n||k==(s[i].p-4)%n)
s[i].B.push_back(k);
}
}
for(i=0;i<m;i++){
for(x=0;x<32;x++){
a=bool(x&(1<<4));
b=bool(x&(1<<3));
c=bool(x&(1<<2));
d=bool(x&(1<<1));
e=bool(x&(1<<0));
flag=0,y=s[i].p;
for(j=0;j<s[i].x;j++){
if(a==0 && s[i].A[j]==(y-4)%n) flag=1;
if(b==0 && s[i].A[j]==(y-3)%n) flag=1;
if(c==0 && s[i].A[j]==(y-2)%n) flag=1;
if(d==0 && s[i].A[j]==(y-1)%n) flag=1;
if(e==0 && s[i].A[j]==(y-0)%n) flag=1;
}
for(j=0;j<s[i].y;j++){
if(a && s[i].B[j]==(y-4)%n) flag=1;
if(b && s[i].B[j]==(y-3)%n) flag=1;
if(c && s[i].B[j]==(y-2)%n) flag=1;
if(d && s[i].B[j]==(y-1)%n) flag=1;
if(e && s[i].B[j]==(y-0)%n) flag=1;
}
check[i][a][b][c][d][e]=flag;
}
}
for(z=0;z<32;z++){
memset(dp,-1,sizeof(dp));
dp[4][bool(z&(1<<4))][bool(z&(1<<3))][bool(z&(1<<2))][bool(z&(1<<1))][bool(z&(1<<0))]=0;
for(i=5;i<n+5;i++){
for(x=0;x<32;x++){
a=bool(x&(1<<4));
b=bool(x&(1<<3));
c=bool(x&(1<<2));
d=bool(x&(1<<1));
e=bool(x&(1<<0));
if(i==n){
e=bool(z&(1<<4));
}
if(i==n+1){
d=bool(z&(1<<4));
e=bool(z&(1<<3));
}
if(i==n+2){
c=bool(z&(1<<4));
d=bool(z&(1<<3));
e=bool(z&(1<<2));
}
if(i==n+3){
b=bool(z&(1<<4));
c=bool(z&(1<<3));
d=bool(z&(1<<2));
e=bool(z&(1<<1));
}
if(i==n+4){
a=bool(z&(1<<4));
b=bool(z&(1<<3));
c=bool(z&(1<<2));
d=bool(z&(1<<1));
e=bool(z&(1<<0));
}
if(dp[i][a][b][c][d][e]!=-1) continue;
tmp=max(dp[i-1][0][a][b][c][d],dp[i-1][1][a][b][c][d]);
if(tmp==-1) continue;
dp[i][a][b][c][d][e]=tmp;
if(arr[i]==-1){
//dp[i][a][b][c][d][e]=tmp;
continue;
}
for(y=0;y<vec[i].size();y++){
arr[i]=vec[i][y];
if(s[arr[i]].x>5) puts(".");
if(check[arr[i]][a][b][c][d][e]){
dp[i][a][b][c][d][e]++;
}
ans=max(ans,dp[i][a][b][c][d][e]);
}
}
}
}
printf("%d\n",ans);
}
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言