码迷,mamicode.com
首页 > 其他好文 > 详细

HDU多校2017第7场

时间:2018-07-21 00:51:20      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:style   超时   fine   do it   clock   turn   div   uil   ++i   

6121 Build a tree

6125 Free from square

6126 Give out candies

6127 Hard challenge

6128 Inverse of sum

6129 Just do it

对于变换$m$次之后的序列,考虑$a_0$对$a_i(0 \le i < n)$的贡献,为$C_{m-1+i}^i$个$a_0$相异或的结果。同样地,$a_1$对$a_{i+1}(0 \le i<n-1)$的贡献也为$C_{m-1+i}^i$。然后,组合数判定奇偶性:杨辉三角第$i$行第$j$列的元素为$C_i^j$,如果$(i \& j) == j$,则$C_i^j$为奇数,否则为偶数。接下来,只需要枚举$a_0$对$a_i(0 \le i < n)$的贡献,若为奇数,则$a_1$对$a_{i+1}$的贡献,$a_2$对$a_{i+2}$的贡献,$\dots$,只需要暴力做相同的处理即可。放心,不会超时的。我随机造了几十组数据规模$2 \times 10^5$的大数据,有的数据需要迭代近$4 \times 10^8$次,只需要300+ms左右就能迭代完。下面的代码通过hdu所有数据的测试,只需要900+ms。而且是在没做任何常数优化的情况下。

另外,杨辉三角具有一个性质:用$P_n$表示$n$层三角形中奇数的占比,有:${\lim\limits_{n \to \infty}P_n \to 0}$。

 

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200010
int a[MAXN], b[MAXN], n, m;
int main(){
    //freopen("input.txt", "r", stdin);
    int T;
    scanf("%d", &T);
    while(T--){
        scanf("%d%d", &n, &m);
        for(int i = 0;i < n;++i)scanf("%d", a + i);
        memset(b, 0, sizeof(b));
        for(int i = 0;i < n;++i){
            if((((m - 1) + i) & i) == i){
                for(int j = i, k = 0;j < n;++j,++k){
                    b[j] ^= a[k];
                }
            }
        }
//        cout << cnt << " " << clock() - st << endl;
        for(int i = 0;i < n;++i)printf("%d%c", b[i], i == n - 1 ? \n :  );
    }
    return 0;
}

 

HDU多校2017第7场

标签:style   超时   fine   do it   clock   turn   div   uil   ++i   

原文地址:https://www.cnblogs.com/dowhile0/p/9344697.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!