• 2012 MultiUniversity Training Contest 5


    1011 HDU4349 Xiao Ming's Hope

    代码:

    View Code 
     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int n;
     9     while(~scanf("%d",&n))
    10     {
    11         int num=1;
    12         while(n>0)
    13         {
    14             if(n&1)
    15                 num*=2;
    16             n/=2;
    17         }
    18         printf("%d\n",num);
    19     }
    20     return 0;
    21 }
    22

    附:

    官方题解:

    1001

    树dp。
    显然题中给图的是一颗树。问题可以抽象成对树的每个点都染色,有两中颜色可以选择。
    我们可以知道,如果某一个连通的点集染的是同一种颜色,则这个集合中只要而且必须有一个点取完整的费用,其他的点都只需要对应费用的一半。
    状态:dp[i][j][k] (0 <= i <= n, 0<=j<=1, 0 <= k <= 1) 表示以i为根的子树的费用,其中i节点被染成了第j种颜色,且子树中与i染成同一种颜色的与i连通的点集有k个点选取了完整的费用。
    若选取1为根节点,则最后需要的结果为: min(dp[1][0][1], dp[1][1][1]}。
    状态转移方程:
    v为i节点的儿子节点。令 S = sum{min(dp[v][j][0], dp[v][1-j][1])}, det = min{dp[v][j][1] - min(dp[v][j][0], dp[v][1-j][1])}; 
    dp[i][j][0] = cost[i][j]/2 + S; 
    dp[i][j][1] = min(cost[i][j] + S, cost[i][j]/2 + S + det); 

     

    1003

    显然,必须先拿走前面的金子才能拿后边的,所以排序处理共线情况。
    然后进行背包即可  

     

    1004

    1)To solve the N-th non-square number:
    There is a number K: K^2<N+K<(K+1)^2
    Thus : K^2+1<= N+K <= (K+1)^2-1
    So: (K-1/2)^2+3/4=K^2-K+1 <= n <= K^2 +K = (K+1/2)^2 -1/4
    That is to say: K-1/2 < (N)^1/2 <= K+1/2
    the N-th non-square number is : N+K (K is the nearest integer from N^1/2);
    And for many team, you can just use circular statement, it's simple and fast.
    2)To get the sum:
    for any i , there exists a integer K : K^2<=i<(K+1)^2;
    to find the K:
    the first (1^2) i : 1
    the next (2^2) i : 2
    ...
    the next (K^2) i : K
    ...
    If Sum(K^2) <= N <= Sum( (K+1)^2), R=N-Sum(K^2);
    add them up : 1^2*1 + 2^2*2 + ... + K^2*K + R*(K+1) ;
    use the knowlege of college math,
    Then You Got It! 
    M=N^(1/2)-1, drop the number after the decimal point.
    the Ans=(M*(M+1)*(2*M+1))/3 +(M+1)*M/2+ (M+1)*(N-(M+1)*(M+1)+1);
    3)
    I think this problem is simple, hope that most of you can solve it.  

     

    1005

    首先将坐标离散化,将区间排序后删掉可以覆盖其他区间的大区间。
    这时若将剩余区间的左端点坐标排序,左端点坐标必然严格上升且对应的右端点坐标也是严格上升的。
    此题的贪心思想较为普及,即按y的升序进行贪心固定区间询问的最大数量,不再赘述。
    设g[1][x]为从坐标x开始向右遇到的第一个有效区间的右端点坐标,另g[i][x] = g[1][g[i-1][x]],若不存在则为正无穷。
    则g[k][x]表示从坐标x开始,在经过不相交的k个区间后,第k个区间的右端点的坐标。
    对g进行倍增,即设f[k][x] = g[2^k][x]。则对于一次询问(l,r),可利用f枚举答案各个二进制数位得到答案。
    f[k][x] = f[k-1][f[k-1][x]],f[0][x] = g[1][x]。g只存在于思维过程中。  

     

    1006

    1、长度是N的因子(且大于1小于N),集合中的元素得两两互质 

    2、为了尽可能多的选出,每个L的质因子应当只包含N的一个质因子,L是一个质因子的整数次,所以K的值就是N中不同质因子的个数

    3、要想和最大,那么使得每个L最大,只要使得质因子的指数最大即可

    所以用pollard_rho分解N的质因数,然后统计不同的质因子个数K,以及计算所有相同质因子乘积的和S

    特殊情况:如果N本身是某个质数的整数i次幂,那么K只能等于1,因为L要小于N,所以L最大为该质数的i-1次幂 

     

    1007

    循环节的长度为各独立置换环长度的最小公倍数。问题即求相加和为N的正整数的最小公倍数的可能数。
    由于1不影响最小公倍数,问题转化为相加小于等于N的若干正整数的最小公倍数的可能数。
    如果这些正整数包含大于一个质因子,只会使得正整数的和更大。
    因而问题再次转化为相加小于等于N的若干质数的最小公倍数的可能数。
    N<1000,于是可递推得,标程用记忆化搜索实现的。

     

    1008

    给出一个字符串,字符串由"R","G","?"组成,若字符串存在2个R,且2个R中间是一个G,则称该串为“漂亮串”,现考虑将"?"替
    换成"R"或"G"的所有字符串,求这些字符串中“漂亮串”的总数。
    我们从反面考虑问题,若字符串不是“漂亮串”,则字符串的形式必然为:R...R...R...R,相邻2个R的距离相等且距离为奇
    数。
    所以我们可以枚举距离,构造“非漂亮串”,毛估总共需要枚举的次数为n*n*(1/1+1/2+...1/n),时间复杂度为O(n^2logn),然后
    用总的字符串数(2^k,k为"?"总数)减去“非漂亮串”的总数,就是“漂亮串”的总数了。  

     

    1009

    题意:在K(K<=5)维空间上有n(n<=50000)个点,给一个点查询与该店最邻近的m(m<=10)个点,10000组询问。
    裸的k临近问题。标程是用kd-tree上的knn算法解决的。具体讲解 参看http://en.wikipedia.org/wiki/Kd-tree
    里面有最邻近的讲解。k临近实现方法与最邻近类似。详见标程。  

     

    1010

    本题考查可持久化数据结构,可持久化数据结构可以依据需求,可分为。。

    1. Partially persistent (部分持久化)
    允许对历史查询,但是只能对当前版本进行修改。
    用图论术语描述即是线性结构。。
    2. Fully persistent (完全持久化)
    在部分持久化的基础上,支持在历史版本上修改。
    即是树形结构。。。
    3. Confluently persistent (汇聚持久化)
    在完全持久化的基础上,允许用两个(或多个)历史版本形成一个新结点。。
    图论描述即为 DAG 。。。
    三类。
    本题是介于第1类和第2类之间的形态。
    在线方法:
    1. 带标记的主席树(利用路径指针实现的函数式的线段树。。
    。。可以实现 O(1) 的回档。。和 O(logN) 的询问。。
    (但是对内存要求较为苛刻。
    2. 主席数组(利用 Fat Node 实现的函数式树状数组。。。
    树状数组的每个结点维护一个记录时间戳的栈,
    询问的时候用二分查找。总的复杂度 O(nlog^2n)。。。。
    对 Backup 操作。。我们使用暴力弹栈。。每个结点至多被弹出一次,总共 O(nlogn) 个结点。。 
    离线做法: 
    。。堆维护询问,栈维护操作。。。每次遇到 Backup 操作,则弹出所有至此时刻的询问。。
    最后再弹到 0 时刻即可。。每个操作入栈出栈各一次。。复杂度 O(nlogn)。。

    1011

    解体思路:本题为Lucas定理推导题,我们分析一下 C(n,m)%2,那么由lucas定理,我们可以写
    * 成二进制的形式观察,比如 n=1001101,m是从000000到1001101的枚举,我们知道在该定理中
    * C(0,1)=0,因此如果n=1001101的0对应位置的m二进制位为1那么C(n,m) % 2==0,因此m对应n为0的
    * 位置只能填0,而1的位置填0,填1都是1(C(1,0)=C(1,1)=1),不影响结果为奇数,并且保证不会
    * 出n的范围,因此所有的情况即是n中1位置对应m位置0,1的枚举,那么结果很明显就是:2^(n中1的个数)

  • 相关阅读:
    Eclipse的Debug教程
    Java面向对象--关键字(package、import、this)
    Java面向对象--JavaBean类&UML类图
    Java面向对象--构造器(构造方法)
    Java面向对象--属性和方法
    python | 基础知识与基本概念
    post登录 jsessionid 以及cookie 传递
    JMeter学习-017-java.net.SocketException: Permission denied: connect 解决方案
    python自建模块显示说明与详情
    在linux下pycharm无法输入中文
  • 原文地址:https://www.cnblogs.com/pony1993/p/2627258.html
Copyright © 2020-2023  润新知