1011 HDU4349 Xiao Ming's Hope
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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的个数)