Advertisement
Guest User

Untitled

a guest
May 4th, 2012
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <bitset>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. #define line bitmass
  8.  
  9. const int MAXN=3030;
  10. const int bitmass_sz=95;
  11. const int size_of_int=32;
  12. typedef unsigned int uint;
  13. typedef unsigned long long ull;
  14.  
  15. int N,K;
  16.  
  17. struct bitmass{
  18.     ull A[48];
  19.     bitmass(){
  20.         for (int i=0;i<=N/64;i++)
  21.             A[i]=0;
  22.     }
  23.     void reset(){
  24.         for (int i=0;i<=N/64;i++)
  25.             A[i]=0;
  26.     }
  27.     void operator|=(const bitmass &b){
  28.         for (int i=0;i<=N/64;i++)
  29.             A[i]|=b.A[i];
  30.     }
  31.     void operator&=(const bitmass&b){
  32.         for (int i=0;i<=N/64;i++)
  33.             A[i]&=b.A[i];
  34.     }
  35.     void operator<<=(int k){ //pobitovo
  36.         ull D[48]={}; int ks=N-k;
  37.         ull q=ks/64; ks%=64;
  38.         int n=N%64 ? N/64+1 : N/64;
  39.         for (int i=0;i<n;i++){
  40.             int k1=i+q; int k2=i+q+1;
  41.             ull a=A[i]<<ks; ull b=A[i]>>(64-ks);
  42.             if (k1<=47)D[k1]|=a;
  43.             if (k2<=47)D[k2]|=b;
  44.         }
  45.         q=k/64; k%=64;
  46.         n=N%64 ? N/64+1 : N/64;
  47.         for (int i=n-1;i>=0;i--){
  48.             int k1=i-q; int k2=i-q-1;
  49.             ull a=A[i]>>k; ull b=A[i]<<(64-k);
  50.             if (k1>=0)D[k1]|=a;
  51.             if (k2>=0)D[k2]|=b;
  52.         }
  53.         for (int i=0;i<n;i++)
  54.             A[i]=D[i];
  55.     }
  56.     void not(){
  57.         for (int i=0;i<=N/64;i++)
  58.             A[i]^=(1ll<<64)+((1ll<<64)-1);
  59.     }
  60.     bool operator[](int i){
  61.         int k=i/64; i%=64;
  62.         return (A[k]&(1ll<<i))!=0;
  63.     }
  64. };
  65.  
  66. inline void F(bitmass &b, int i, bool q){ //b[i]=q;
  67.    int k=i/64; i%=64;
  68.    if (b.A[k]&(1ll<<i) ^ q) b.A[k]^=(1ll<<i);    
  69. }
  70.  
  71. int c[MAXN],l[MAXN];
  72. line A[MAXN],C[MAXN],L;
  73.  
  74. int main(){
  75.    freopen("input.txt","r",stdin);
  76.    freopen("output.txt","w",stdout);
  77.    cin>>N>>K;
  78.    for (int i=0;i<N;i++){
  79.        scanf("%d",&c[i]); c[i]--;
  80.        F(C[c[i]],i,true);
  81.    }
  82.    for (int i=0;i<K;i++){
  83.        scanf("%d",&l[i]);
  84.    }
  85.    for (int i=0;i<N;i++){
  86.        F(L,i,l[c[i]]!=0);    
  87.    }
  88.    line tmp;
  89.    for (int i=1;i<=N/3;i++){
  90.        for (int k1=0;k1<N;k1++){
  91.            int k2=(k1+i)%N;
  92.            int c1=c[k1],c2=c[k2];
  93.            if (l[c1]==0 || l[c2]==0 || (c1==c2 && l[c1]<=1)) continue;
  94.            tmp.reset();
  95.            tmp|=C[c1];
  96.            tmp|=C[c2];
  97.            tmp.not();
  98.            tmp&=L;
  99.            if (c1==c2 && l[c1]==3)
  100.                tmp|=C[c1];
  101.            else if (c1!=c2){
  102.                if (l[c1]>=2) tmp|=C[c1];
  103.                if (l[c2]>=2) tmp|=C[c2];
  104.            }
  105.            F(tmp,k1,0); F(tmp,k2,0);
  106.            tmp<<=k2;
  107.            A[i]|=tmp;
  108.        }
  109.    }
  110.    int ans=0;
  111.    for (int i=1;i<=N/3;i++)
  112.        for (int j=1;j<=N;j++){
  113.            int q=N-i-j;
  114.            if (q<=0 || !A[i][j]) continue;
  115.            ans++;
  116.            F(A[i],j,0); F(A[j],i,0); F(A[i],q,0); F(A[q],i,0); F(A[j],q,0); F(A[q],j,0);
  117.        }
  118.    cout<<ans<<endl;
  119.    return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement