题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据的节点集合不可能相同,因为在这两种走法中,节点i必有两个子树中的棋子数量不同.所以,题目中的"被占据的集合唯一"等价于"每个棋子走向的节点唯一". 根据题意,一个初始状态合法当且仅当这个状态可以进行任意次操作,且进行k步操作后,接下来一步操作唯一(不管这样走之后,是否还…
题目 建图很妙,不会. 考虑每一对要求合法的巫师(x,y),他们两个的\(a\)必须都大于\(min(b_x,b_y)\).所以在输入的时候,如果\(a_x\)或者\(a_y\)小于\(min(b_x,b_y)\),可以先把\(a_x\)和\(a_y\)提升到\(min(b_x,b_y)\)(以后的a数组都指做过这步操作的).接下来如果\(max(a_x,a_y)\geq max(b_x,b_y)\),那么这一对已经符合要求,可以直接不管.接下来只考虑需要管的. 发现每一对需要管的(x,y),两…
[题解]POJ2279 Mr.Young′s Picture Permutations dp 钦定从小往大放,然后直接dp. \(dp(t1,t2,t3,t4,t5)\)代表每一行多少人,判断边界就能dp. 然后你发现\(30^5\)开不下,但是你仔细观察由于它保证\(\sum < 30\)所以你只用开\(30^5 \div 5!\)就好了. 具体为什么我相信你会 //@winlere #include<iostream> #include<cstring> #include…
[题解]HDU4689 Derangement(有技巧的计数DP) 传送门 呵呵没告诉我多测组数,然后\(n\le 20,7000\mathrm{ms}\)我写了个状压上去T了 题目大意: 要你求错排的方案数,但要求\(i\)位上的数比\(i\)大/小.大小关系用正负号告诉你,读入一个字符串. \(O(n2^n)\) 设\(dp(s)\)表示已经放了\(|s|\)个数进去,放的数占满了\(s\)中的位置的方案数 转移太显然直接贴代码 //@winlere #include<iostream>…
[题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过至少一遍的情况下最大收益 设\(dp(s,i)\)表示已经看过\(s\)集合中的节目,且看过的节目的结束时间是\(i\)的最大收益. 转移: \[ dp(s,e[t].r)=\max(dp(s,k),dp(s-e[t].id,k))+e[t].val,k\le e[t].l \] 由于\(O(m^3…
[题解]CF1056F Write the Contest(三分+贪心+DP) 最优化问题的三个解决方法都套在一个题里了,真牛逼 最优解应该是怎样的,一定存在一种最优解是先完成了耗时长的任务再干别的(不干白不干啊),所以我们按照耗时先排序. 假设你最优解是去事件\(e_1,e_2,e_3,e_4\),你可以在规定时间里干完,那么你如果按照耗时从大往小干也一定可以干完. 好像只能找到"按照耗时从大往小干"一种钦定方法使得所有方案可以归纳到这种情况 考虑最终耗时是怎样的:\(t\)表示练习…
点我看题 A - Max Mod Min 非常诈骗.一开始以为要观察什么神奇的性质,后来发现直接模拟就行了.可以证明总操作次数是\(O(nlog a_i)\)的.具体就是,每次操作都会有一个数a被b取模,然后变成a%b.注意到a%b是\(\leq \frac a2\)的,并且a被操作之后会变成整个数据最小的数,作为下一轮的b.所以把原数组排序后,最小值的位置是不断往左移的,每次移动1个位置,直接模拟即可. 时间复杂度\(O(nlog a_i)\). 点击查看代码 #include <bits/s…
首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次数为 \(x\),表示节点实际上被选择的次数是父亲被选择的次数 \(+x\).显然,这个 \(x\) 是小于等于 \(D\) 的.分析这样我们发现,选择了一个节点实际上对应子树内的所有节点的选择次数均增加,所以我们重新定义选择一个节点的价值为子树内(含自身)节点的个数,而代价则是子树内所有代价的总和…
Atcoder刷不动的每日一题... 首先注意到一个事实:随着 \(l, r\) 的增大,\(f(r) - f(l)\) 会越来越小.考虑暴力处理出小数据的情况,我们可以发现对于左端点 \(f(l) <=  7\) 的情况下,右端点的最大限度为 \(\frac{10^8}{8} + 10^7\) .这个范围并不大,可以直接用 two-pointer 处理出来. 那么这部分的数据和后面的数据有什么不同呢? 当 \(f(l) > 7\) 的时候,\(f(r) - f(l) <= 1\).那么…
再次膜拜此强题!神级性质之不可能发现系列收藏++:首先,对于长度<=3的情况,我们采取爆搜答案(代码当中是打表).对于长度>=4的情况,则有如下几条玄妙的性质: 首先我们将 a, b, c 三个字母看做 0, 1, 2.发现(不知道怎么发现的)当我们做出一次变换之后,数列的和在模意义下是不改变的.(*启示:很多关系好像都和取模之后的某些东西有关,例如食物链,此题,and so on). 那么:当一个序列 T 可以由 S 转化过来时,T必须满足如下几条性质: 1.T的各位字母之和与S的各位字母之…