COCI 2011/2012 Round #1

Brief description:

Problem A. jabuke
星莲船。

Problem B. matrix
给定一个 N * N 的方阵,定义子矩阵的 beautiful_value = {主对角线和 – 副对角线和}。
求最大值。
( .. N <= 400 . .) Problem C. X3 给定 N 个数,求所有这些数两两之间的异或和。 ( .. N <= 10^6 .. .) Problem D. ples 给定 N 名男生和 N 名女生的身高,其中正数表示其只愿意和比自己高的异性跳舞, 负数表示其只愿意和比自己矮的异性跳舞,求最大匹配。 ( .. N <= 10^5 .. .) Problem E. sort 给出以下的一个排序算法.. while (未完成){ 将所有递减序列分离出来,进行 reverse() 操作。 } 给定一个 {1..N} 的排列,问这个排序算法会执行多少次 reverse() 操作。 ( .. N <= 10^5 .. ) Problem F. skakac 给定一块 N * N 的 chess 棋盘,每个格子上面标注一个数字,{aij} 表示这个格子在步数是 K 的倍数的时候会被 blocked。 现在给你一个 knight 的初始位置,问 T 步之后所有可能占据的位置。 ( .. N <= 30 ., T <= 10^6, aij <= 10^9 . ..)

Analysis:

A 略、B 略 (注意 MLE 的问题)、C 略 (按位统计)、D 略(排序、贪心,注意不要往图论方面想。。。)

E 模拟几个小数据。。发现用树状数组就行了。。

F 至于最后一题。。

#include<iostream>
using namespace std;
int n,m,k,col,l,r,ans;
int main(){
    for(cin>>n>>m>>k,l=1,r=l+m-1;k--;)
    if(cin>>col,col<l)ans+=l-col,l=col,r=l+m-1;
    else if(col>r)ans+=col-r,r=col,l=r-m+1;
    cout<<ans<<endl;
}
const int N = 409;
int A[N][N], L[N][N], R[N][N];
int n, res;
 
int main(){
 
    //freopen("in.txt", "r", stdin);
 
    RD(n); REP_2(i, j, n, n) cin >> A[i][j];
 
    res = 0; REP(i, n){
 
        REP(j, n){
            L[j][0] = A[i][j], R[j][0] = A[i][j];
            REP_1(k, n){
                if (i+k==n||j+k==n) break;
                L[j][k] = L[j][k-1] + A[i+k][j+k];
            }
            REP_1(k, n){
                if (i+k==n||j-k==-1) break;
                R[j][k] = R[j][k-1] + A[i+k][j-k];
            }
        }
 
        REP(j, n) REP(k, n){
            if (j+k == n) break;
            checkMax(res, L[j][k] - R[j+k][k]);
        }
    }
 
    cout << res << endl;
}
#include<iostream>
using namespace std;
#define LL long long
const int N=20;
LL i,t,n,sum,a[N][2];
int main(){
    for(cin>>n;n--;)for(scanf("%d",&t),i=0;i<N;++a[i][!!(t&1<<i)],++i);
    for(i=0;i<N;++i)sum+=a[i][0]*a[i][1]*(1<<i);
    cout<<sum<<endl;
}
VI A1, A2, B1, B2;
int n, res;
 
int main(){
 
    //freopen("in.txt", "r", stdin);
 
    RD(n);
 
    int ai; REP(i, n){
        RD(ai); if (ai > 0) A1.PB(ai); else A2.PB(ai);
    }
 
    int bi; REP(i, n){
        RD(bi); if (bi > 0) B1.PB(bi); else B2.PB(bi);
    }
 
    SRT(A1), SRT(A2), SRT(B1), SRT(B2);
 
    int j = 0; DWN(i, SZ(A1), 0){
        if (j < SZ(B2) && abs(B2[j]) > A1[i]) ++j;
    }
 
    res += j;
 
    j = 0; DWN(i, SZ(B1), 0){
        if (j < SZ(A2) && abs(A2[j]) > B1[i]) ++j;
    }
 
    res += j;
 
    cout << res << endl;
}
const int N = 100009;
int A[N], C[N], n;
 
int S(int x){
    int res = 0; while (x){res += C[x]; x ^= low_bit(x);}
    return res;
}
 
void M(int x){
    while (x <= n){++C[x], x += low_bit(x);}
}
 
int main(){
 
    REP_C(i, _RD(n)) RD(A[i]);
 
    LL ans = 0 ;
 
    for (int i=0,j=1;i<n;i=j,++j){
        while (j<n&&A[j]<A[j-1]) ++j; if (i+1<j) ++ans;
        DWN(k, j, i) ans += (i+j-k-1) - S(A[k]), M(A[k]);
    }
 
    cout << ans << "\n" ;
}
const int TT = 1000009, N = 32;
vector<short> mask[N];
short _[2], A[2][N]; int K[N], M[N];
int n, T, U, bj;
 
int lcm(LL a, LL b){
    LL t = a / __gcd(a, b) * b;
    if (t > T) return T + 1;
    return t;
}
 
void no_solution(){
    cout << 0 << endl;
    exit(0);
}
 
void init(){
    RD(n, T); int x0, y0; RD(x0, y0), --x0, --y0, A[0][x0] = _1(y0/2);
    bj = x0 ^ y0;
 
    int k, kk; REP(i, n){
 
        REP(j, n) RD(K[j]); M[i] = 2; REP(j, n) M[i] = lcm(M[i], K[j]);
        mask[i].resize(M[i]);
 
        REP(j, n){
            k = K[j]; if ((i^j^bj)&1){
                if (!(k&1)) continue; kk = k << 1;
                for (int t=k;t<M[i];t+=kk) mask[i][t] |= _1(j/2);
                if (M[i] <= T && T&1) mask[i][0] |= _1(j/2);
            }
            else {
                k = k & 1 ? k << 1 : k;
                for (int t=k;t<M[i];t+=k) mask[i][t] |= _1(j/2);
                if (M[i] <= T && !(T&1)) mask[i][0] |= _1(j/2);
            }
 
        }
    }
 
}
 
#define p (t&1)
#define q !p
 
void solve(){
    int S, op; REP_1(t, T){
        RST(A[p]); int tt = t ^ bj; REP(i, n) if (A[q][i]){
            op = (A[q][i] << 1) | (A[q][i] >> 1);
            A[p][i-1] |= op, A[p][i+1] |= op;
            if ((i^tt)&1) op = (A[q][i] >> 1) | A[q][i];
            else op = (A[q][i] << 1) | A[q][i];
            A[p][i-2] |= op, A[p][i+2] |= op;
        }
 
        REP(i, n) A[p][i] &= mask[i][t%M[i]];
    }
}
 
#undef p
 
void print(){
    int res = 0, p = T & 1;
    REP(i, n) res += count_bits(A[p][i]); cout << res << endl;
    REP_2(i, j, n, n) if (!((i^j^bj^T)&1) && _1(A[p][i], j/2)){
        cout << i+1 << " " << j+1 << endl;
    }
}
 
int main(){
 
    //freopen("in.txt", "r", stdin);
 
    init(); solve();
    print();
}