Hdu 5372 Segment Game
链接
题意
给定n个操作,操作有两种
0 b 插入一条[b,b+i] ,并输出被这条线段完全覆盖的线段条数,其中i表示这条线段是第i次插入
1 b 删除第b次插入的线段
分析
对于新插入的线段,查询有多少个线段左端点大于等于该线段的左端点。再查询有多少个线段的右端点大于该线段右端点,两者之差就是答案。用两个树状数组搞定。时间复杂度 nlogn
若该线段为[l,r],也可以查询线段右端点小于等于r,线段左端点小于等于l-1,它们的差即为答案
题中插入线段的左端点$ |b|<10^9 $,数据很大存不开,需要将端点坐标离散化
用 $ unique() $函数去除重复的端点值,用 $ lowwer\_bound() $函数查询某端点离散化后的下标,
树状数组 c[i][0] 存的是线段左端点大于等于以i为下标的左端点的值
c[i][1] 存的是线段右端点大于等于以i为下标的右端点的值
参考代码
1 | #include <stdio.h> |
Hdu 5373 The shortest problem
链接
题意
给定一个数n,每次将n各位数字的和插入数n的末尾的到新的数n,
求经过t此操作后的到的数能否被11整除。如 n=123,t=3, 123->1236->123612->12361215.
分析
能被11整除的数其奇数位数字的和和偶数位数字的和的差能被11整除
每次操作时,分别记录奇数为的和和偶数为的和,最后判断它们的差是否能被11整除
参考代码
1 | #include<stdio.h> |
Hdu 5375 Gray code
链接
题意
给定用’1’,’0’,’?’表示的n位二进制数,和长度为n的序列{a1,a2…an}
若二进制对应的格雷码第i位为1,可得到ai分,求该二进制数最多能得多少分
分析
$若一个二进制数位 a_1a_2a_3…a_n$
$则其对应的格雷码为 a_1,a_1 xor a_2,…,a_{n-1} xor a_n$
0 xor 1 =1,1 xor 0 =1, 0 xor 0 =0, 1 xor 1 = 0
设dp[i][0]表示第i位为0可得的最大分数,dp[i][1]表示第i位为0可得的最大分数
则状态转移方程为
$dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i])$
$dp[i][1]=max(dp[i-1][1],dp[i-1][0]+a[i])$
参考代码
1 | #include<stdio.h> |
Hdu 5379 Mahjong tree
链接
题意
有一个以结点1为根包含n个结点的树,给定这些结点间的n-1组关系ui vi,表示ui与vi相连
有n个不同的麻将标号为{1,2…n},要将这些麻将放入树中,每个结点放一个麻将
且要求任意一个子树里的点编号连续,每一个点的儿子编号连续,求有多少种方案
分析
在一棵树上给所有点标号,要求任意一个子树里的点编号连续,每一个点的儿子编号连续。 那么,一个点的非叶子儿子应该是连续的,即一个点的非叶子儿子最多只有两个。 对于每一个点,我们把它的叶子儿子的个数记作S,所有儿子的方案数积为T。当非叶子儿子节点个数小于2的时候,方案数为2T*(S!). 当非叶子儿子节点数等于2的时候,这个点为根的子树合法方案数位T*(S!). 这样dfs一遍即可以处理整棵树的方案数。
参考代码
1 | #pragma comment(linker, "/STACK:102400000,102400000") //手动扩栈 |