zoukankan      html  css  js  c++  java
  • (思维题)HDU

    题意:

    给一颗K叉树,统计所有子树大小的异或和,节点数n和k都小于1e18。

    分析:

    比赛时候一开始被公式搞懵逼了,然后队友30分钟就A掉了。

    昨天自己写了一下,哇好难写,各种bug,什么时候自己的代码能力这么弱了- -。

    其实也很简单,因为n个节点分成K叉树,最后一层必然出现三种情况。

    一种是满K叉,一种是不满K叉,还有一种是上一层满叉。

    只要知道每一层,存在不满K叉的子树是第几叉,然后就能推算出前面满K叉的数量,和后面不满K叉的数量。

    根据异或的性质,判一下奇偶,然后ans异或左边子树大小(可以预处理,也可以递归时候保存)。

    同理右边的就是去掉一层的子树。最后对于中间单独不满K叉的,用一个变量统计节点个数即可。

    (写的时候,各种bug。返回值没用longlong找了一个多小时。。。

    代码很短:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 long long n, k;
     5 long long ans, dep, du, pw[100];
     6 
     7 long long dfs(long long d, long long tol, long long lotol) {
     8     dep++;
     9     pw[dep - 1] = tol;
    10     if(tol >= n) {
    11         long long idx = lotol - tol + n - 1;
    12         if((idx + 1) & 1)ans ^= 1;
    13         du = idx % k + 1;
    14         return idx / k;
    15     }
    16     long long idx = dfs( d + 1, tol + lotol * k, lotol * k);
    17     du++;
    18     ans ^= du;
    19     if(idx & 1)ans ^= pw[dep - d];
    20     if((lotol - idx - 1) & 1)ans ^= pw[dep - d - 1];
    21     du += (idx % k) * pw[dep - d] + (k - idx % k - 1) * pw[dep - d - 1];
    22     return idx / k;
    23 }
    24 
    25 long long xor_n(long long g) {
    26     long long t = g & 3;
    27     if (t & 1) return t / 2 ^ 1;
    28     return t / 2 ^ g;
    29 }
    30 
    31 int main() {
    32     int t;
    33     scanf("%d", &t);
    34     while(t--) {
    35         ans = dep = 0;
    36         scanf("%lld%lld", &n, &k);
    37         if(k == 1) {
    38             printf("%lld
    ", xor_n(n));
    39             continue;
    40         }
    41         dfs(1, 1, 1);
    42         printf("%lld
    ", ans);
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    GNU make manual 翻译(九十九)
    GNU make manual 翻译( 九十五)
    Shell的 for 循环小例子
    makefile中对目录遍历的小例子
    GNU make manual 翻译(九十三)
    GNU make manual 翻译( 一百)
    GNU make manual 翻译( 九十七)
    GNU make manual 翻译( 九十八)
    mapserver4.8.3 的readme.win32的中文翻译文件
    遥控器编程
  • 原文地址:https://www.cnblogs.com/tak-fate/p/7410718.html
Copyright © 2011-2022 走看看