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);
}

沒有留言:

張貼留言