4月开始试着拿workflowy写了半个月的每日记录。既然博客重开了,还是转移到博客上为好。
- 4月3日
- uvalive 5107 A hard Aoshu Problem
- 2010 福州 H题
- 题意
- 给三个只由ABCDE组成的字符串,现在ABCDE分别代表一个数字0~9,不同字母代表不同的数字,问总共有多少种方案使得算式成立
- 题解
- 生成排列然后判断就好
- 首先需要加一个离散化,因为ABCDE可能不全,如第二个数据只出现BCD,离散化成ABC好操作
- 代码
- uvalive 5105 Selecting courses
- 2010 福州 J
- 题意
- 有N个区间可以选课
- 你只能5分钟选一次,这个时间点要么选,要么不选,问最多可以选几个
- 题解
- 这个经典贪心问题,以结束时间早的来排序,先选这个,因为结束时间晚的后面还有机会
- 然后枚举0~4开头,因为5开头相当与0开头 + 5
- 代码
- uvalive 5107 A hard Aoshu Problem
- 4月4日
- hdu 5978 To begin or not to begin
- 2016 大连赛区 H 题
- 当时情况 3/161
- 其实就是找规律然后输出0 1 0 1 一开始由于精度问题一直不对 后来猜一下果然如此
- 题目链接
“http://acm.hdu.edu.cn/showproblem.php?pid=5978” - Code
“http://git.oschina.net/yygist/codes/pc8o4njf1u2ehqw9tkabg84”
- hdu 5979 Convex
- 2016 大连赛区 I 题
- 当时情况 2/44 WYF在搞,我看都没看,当然了,他1WA之后我就去写J题了,J题也写了很久
- 题意
“一个多边形,N个点,每个点到原点的距离都一样,是D,再告诉相邻两条边的夹角,问这个多边形的面积” - 解
- 那就是这N个三角形面积之和了,1/2absinθ
- 然后θ换成弧度制 /180 * M_PI
- M_PI需要使用
# define _USE_MATH_DEFINES
不然会HDU过不了(不过uvalive上这一套题都交不了)
- http://git.oschina.net/yygist/codes/4d6yh17jzt20kbc5urwen19
- hdu 5980 Find Small A
- 2016 大连赛区 J题
- 当时情况 3/87 一直都是我在搞 也就是一个半小时才作出两道题,这不GG有鬼= =
- 原因分析 首先题目没看太懂 这个可能是最主要原因,其次很多东西都不知道,比如可以拿python看下2进制啊这样的,sprintf,这个当时估计也是知道,但是没有使出来
- 题意
- 给一个数,这个数里的2进制有多少个A。
- 相当于32进制里面有多少个a
- 题解
- 那就sprintf输出16进制然后看就好了
- 代码
- hdu 5974 A Simple Math Problem
- 2016 大连赛区 D题
- 当时情况 2/121 这道题应该算是做的比较正常的,我先推了一下,然而WYF推了一下,发现我想复杂了,然后写了一下,1WA好像是freopen忘记去掉了,尴尬
- 题意
- 解方程 x + y = a lcm(x,y) = b,现在给出a,b求x,y
- 题解
- 很容易想到 设gcd(x, y) = c
- x = k1c, y = y2c, gcd(k1, k2) = 1
- a = (k1+k2)c, b = k1k2*c
- 既然k1,k2互质了,那么应该有 gcd(x,y) = gcd(a, b) = c
- 那只要解出k1 k2就好了
- 设k1 + k2 = a/c = A, k1 * k2 = b/c = B
- 解得 k2 = (A + sqrt(A^2 - 4*B)) / 2, k1 = A - k2
- No Solution直接带入判断就好,此题HDU卡得较紧,如果直接判断__gcd(x, y)会TLE,直接用__gcd(x, y) = c则不会
- 代码
- hdu 5971 Wrestling Match
- 2016 大连赛区 A题
- 当时情况 3/209 都是 WYF在搞 我按他的想法帮他DE了一个BUG
- 他的方法应该就是暴力,不过具体细节怎么搞的,我不是很能理解。事后他说应该是正解应该是并查集。
- 题解
- 提示是并查集的话显然不是那个判断图的联通性的并查集,此题要分成两组
- 顺着并查集的往下想,可以想到一个点所连的全部边应该是1个集合的,这样就解决了大部分,不过还是不够
- 可以想到用两个super root来记录good 和 bad
- 然后,如果除去super root之后的集合个数如果 小于 3, 那么就可以随便安置这两个集合,输出yes,但是如果是3个集合,那么就输出NO。对应题目样例的情况。
- 代码
“http://git.oschina.net/yygist/codes/6xsoe1wnup8zd9c2kvmtj79”
- hdu 5976 Detachment
- 2016 大连F题
- 当时情况 4/284 WYF最后一刻钟搞定,用了线段树,不知道他怎么高级搞出来的
- 题意
- 给一个数X,让若干个数组成X,使这若干个数乘积最大
- 题解
- 容易推理出从2,3,…数越多越大
- 剩下来的数再从后往前依次加一
- 那么首先找到 2 + 3 + 4 + … + n < x < 2 + 3 + 4 + … + n + 1
- 这个Lower_bound就可以找到 我们用s数组记录前缀和, 设找到的s[r]
- 此时有3种情况
- s[r] + r + 1 == x,这样就是 2 * 3 * … * r + 1
- s[r] + r == x, 注意 2…r 有r-1个数,也就是说把 2…r 变成 3…r + 1还是多1 所以要变成 3…r, r+2
- s[r] + r < x, 那么从后往前依次加1,这样可以看出中间会缺1个数,别的一切正常
- 可以用前缀积来处理,不过要除去缺的数,所以需要逆元
- 逆元类似倒数,不过是模运算里面的 比如现在要算 (6 / 2) % MOD, 可以用 6 * inv(2) % MOD来算
- 对于质数为模的逆元,有公式pow_mod(a, mod-2, mod)
- 同时还有递推求逆元的公式,本题就是这个
- 知道了这些,就容易做了
- 特别注意 x = 1 的情况
- 代码
- hdu 5978 To begin or not to begin
- 4月5日
- POJ 1741 Tree
- 树的点分治第1题
- http://git.oschina.net/yygist/codes/acd3u2yxpwsvhot6ink7f85
- 题意
- 给一棵树,编号1~N,问满足两点之间距离不超过k的点对个数
- 题解
- 树的重心 centroid
- 满足这个节点的子树中的节点个数最大的最小
- 以树的重心作为分治的点,把原树分成两个子树,这两个子数最平均,效果最好
- 如何找树的重心
- DFS就好
- 用sz[i] 表示以i为根的子树的点数
- maxsubsz[u]表示u的子树里面最大的点数
- 然后用min_max维护maxsubsz就可以找到了
- 回到此题
- 考虑一个节点s,只要找出这个节点的子孙节点i,j满足d(s,i) + d(s,j) < k就好了
- 但是要排除i,j在同一个子树里面,不然d(s,i) + d(s,j) > d(i,j), 以上情况是d(s,i) + d(s, j) == d(i,j)
- 我们用calcdis把节点s的全部子节点以及到s的距离存在d里面,对d排序,然后通过一头一尾两个指针就可以O(n)的时间里算出全部d(i,s) + d(j,s) < k的情况
- 注意,这个s永远是重心,因为这样才满足最平均
- 然后将重心标记,这样下次访问到重心的时候就会被截断,找不到
- 接下来排除上述那种情况,直接找这个节点里面全部的子节点满足上述的,然后ans
- 接下来DFS
- 特别注意每一次的重心会变,所以需要用临时变量来存中心
- 树的重心 centroid
- 4月6日
- 做了NOIp2016 day1 水题一枚
- day2 90分
- 4月7日
- 研究了一下PC2 ICPC官方环境
- 4月8日
- 比了蓝桥杯
- 4月9日
- 训练赛4题
- 4月10日
- 心情不好 没做
- 4月11日
- 学习了shift and 算法
- 尝试解决icpc2016大连 此题,杭电输入要求太高,超时
- 4月12日
- ICPC 2016沈阳3题
- HDU 5949 水
- HDU 5948 水
- HDU 5950 矩阵加速
- 4月13日
- 团队训练 2015上海网络赛
- 4道
- 线段树
- 水题
- 数学
- 数学几何
之后的故事,就继续在这个blog里了。