摘要:
题面传送门 首先设$dp_{i,j}$为$i$个点的树高度为$j$的方案数,这个很好$O(n3)$做。 然后发现因为树很平衡,所以树高大概是$O(logn)$级别的,然后就$O(n2logn)$可以过了。 但是还有更优的方法。 我们设$Up_i$为高度为$i$的树的最小点数,$Down_i$表示高度 阅读全文
摘要:
题面传送门 首先把这颗树转化成最小的括号序。 然后有一个神奇的结论:如果两棵有根树的最小括号序相同,那么他们同构。 仔细想想其实是这么回事,这个东西使树的形态确定。 然后对于无根树我们找到它的重心做根就好了 时间复杂度$O(mn^2)$ code: #include<bits/stdc++.h> # 阅读全文
摘要:
题面传送门 这个东西肯定是有一个中转点满足到三个点距离相同。 我们设$f_{i,j}$为$i$子树内的距离$i$为$j$的点的个数,$g_{i,j}$为$i$子树内无序对$(x,y)$满足$dist(x,lca(x,y))=dist(y,lca(x,y))=dist(i,lca(x,y))+j$ 这 阅读全文
摘要:
题面传送门 考虑长链剖分。我们对于每个链顶存下这条链上的点和往上$len$长度个点。 然后倍增预处理出一个点往上$2i$祖先。 对于一个点的$k$的$k$级祖先,我们让他先跳$2{\lfloor logk\rfloor}$级祖先,此时这个点所在的长链一定大于等于$2^{\lfloor logk\rf 阅读全文
摘要:
题面传送门 发现自己不会斯特林反演于是去学习了一下。 大概就是$mn=\sum\limits_{i=0}{m}{C^{m}{i} {^n{i}}i!}$ 感性理解一下就是$mn$是把$n$个球放到$m$个不同的盒子里。所以枚举非空的盒子然后斯特林数最后因为斯特林数无序所以乘以$j!$即可。 然后这道 阅读全文
摘要:
题面传送门 就这?就这?建议评蓝。 首先这个东西肯定是所有点的出现期望加起来。 考虑单个点怎么算,那么就是所有儿子的子树内不出现概率乘个边权乘起来最后用1减掉就好了。 那多个点不就换个根就好了。 时间复杂度$O(n)$ code: #include<bits/stdc++.h> #define I 阅读全文
摘要:
题面传送门 似乎是很平凡的idea了啊,而且这道题也不卡常啊。 容易想到一个暴力dp,就是设$dp_{i,j,k}$表示$i$点,有了$j$的状态,当前点为$k$的方案数,这样子是枚举子集要$O(n33n)$的过不掉。 然后接下来这个idea大概出自[SHOI2016]黑暗前的幻想乡(也不能说出自因 阅读全文
摘要:
题面传送门 不得不说这个正解是真的暴力本来还想写可持久化平衡树的( 考虑我们将每个新加入的树看作一个点。 那么我们要支持这些操作: 查询一个点在那个树里面,这个直接lowerbound就好了。 查询一颗树内某个点在原树哪个节点,这个直接把原树的dfs序拍了然后主席树区间$k$大就好了。 查询现在树上 阅读全文
摘要:
题面传送门 发现自己写了个屑的$O(n\sqrt nlogn)$做法。 首先这种走$k$步的东西想到根号分治。 设阈值$B$,若$C>B$的话那么就暴力跳,时间复杂度$O(\sqrt nlogn)$ 若$C\leq B$的话那么对于每个$C$一起处理,每次做一遍倍增就好了。这个单次倍增时间复杂度$O 阅读全文
摘要:
题面传送门 看到这种东西想到差分,即差分成$[1,r]\(减去\)[1,l]$的答案。 距离的式子其实是$dist_u+dist_v-2*dist_{lca(u,v)}$前面两项平凡所以要求$dist_{lca(u,v)}$ 然后这个有经典套路就是每个点往根加和查就是这个式子,直接树剖就好了。 因为 阅读全文
摘要:
1003 手玩一下发现如果是一维的只能有两个,二维的只能有三个。 所以得出结论,一维能分开一个。 code: int T;ll n,k; int main(){ scanf("%d",&T);while(T--) scanf("%lld%lld",&n,&k),puts(n<=k+1?"Yes":" 阅读全文
该文被密码保护。 阅读全文
摘要:
A 因为所有方案的平均价格是一样的所以我们就可以考虑每个方案怎么能被最少地凑出来。 如果是奇数那么肯定要加一变成偶数。然后如果$>6$一定能被凑出来。$\leq6$只能输出$15$ code: using namespace std; int T;ll n; int main(){ freopen( 阅读全文
该文被密码保护。 阅读全文
摘要:
题面传送门 比原来平衡树多了一个可持久化操作。 我们考虑和线段树一样可持久化,就是对于每个新访问到的点多新增一个节点和原来的版本区别开来。 这里有几个注意事项: 下推标记的时候要可持久化。merge的时候因为split一定已经可持久化过了所以不用新开节点。 时空复杂度$O(nlogn)$ code: 阅读全文
摘要:
D1T1 很一眼不能直接LCT维护。 考虑树剖。先看修改。 当我们跳上一个重链时,重链当前点下的点的边权要置为0,然后整段覆盖1和打上时间标记。 在我们查询的时候,重链内部的点肯定是没有问题的,重链顶的点暴力查询时间和链顶上面一个点的时间标记看是不是要计算入答案。 时间复杂度$O(nlog^2n)$ 阅读全文
摘要:
游记 这次居然网站没卡好评。 进去先看了1011感觉没有看懂( 后来看到了一堆人切掉了1001就去看1001结果一堆高数内容。就扔给了cqy 然后看到1002发现是个sb题就切掉了。 cqy说1009是AT678然后去看了一下。 发现是sb题就切掉了。 然后去看1004因为觉得很可做,这种最小值一眼 阅读全文
摘要:
游记 12:00去开题,然后开了个锤子。 网站疯狂卡崩。 直到12:50才进去。 为什么有的队伍开局6min就切题了啊 看到1011很多人过了就去看。 然后发现并不会( 想了一下决定暴力硬刚,写了个map+队列维护每一层的垃圾玩意,交上去WA了。 然后转眼一看这不直接记搜就好了嘛?我是小丑。 然后发 阅读全文
摘要:
Day0 停了一天来训练找手感。 然而ccf说公布地址到十一点还没公布。 写了几道往年的NOI题目希望有用。 Day1 说是8:30开赛ccf总是鸽子。 听说是因为台风所以推迟了,正式赛选手也推迟了。 一直到10:00才开始比赛。 然后题目文件下不下来…… 求助yzx巨佬才拿到题目。 开场发现T1看 阅读全文
摘要:
题面传送门 现在来看这种东西真的很屑啊当时我是真的菜。 首先这个欧拉函数很难搞,我们考虑设$F_i$为和为$i$的方案数。 然后发现其实这个也是所有数或的和为$i$的方案数。 所以枚举一下子集不就可以dp了。 然后因为要保证顺序所以我们强制加入的数最高位递增。 时间复杂度$O(3^+n)$,注意特判 阅读全文
摘要:
题面传送门 居然还有这种做法,学到了学到了。 首先这个肯定是有一条分割线,上半边为$0$,下半边为$1$,证明显然。 所以这启发我们跑最小割。 但是这个东西T了一个点。 考虑到这个是一张平面图,可以转化成对偶图然后跑最短路即可。时间复杂度$O(SPFA)$ code: #include<bits/s 阅读全文
摘要:
A 容易发现只有进位的时候会出现这种情况。 所以直接输出$\frac{n+1}{10}$即可。 code: int T,n; int main(){ freopen("1.in","r",stdin); scanf("%d",&T);while(T--){ scanf("%d",&n);printf 阅读全文
摘要:
题面传送门 这么小的$n$,这么大的$T$肯定是矩阵快速幂的节奏。 我们考虑这个边的时间怎么处理。 因为时间是真的小,所以我们可以将每个点拆成$5$个点,然后由每个点的第$w$个点向那边的点连边。 然后这个美食节我们可以拆成$k+1$段,每一段直接矩阵快速幂,中间乘上特殊矩阵。 然后我们发现这个东西 阅读全文
摘要:
题面传送门 这个东西不太会log做法就写了分块算法。 考虑分块。 我们设$F_{i,j}$表示$i$点从$i$后面那个块到$j$块的答案,这个东西可以直接将两块归并得到答案。 同样我们处理出$G_{i,j}$表示$i$点从$i$点前面那个块到$j$块的答案,方法同上。 我们再处理出$H_{i,j}$ 阅读全文
摘要:
题面传送门 如果我们想求一个矩阵的逆,那么只要将一个矩阵变换成单位矩阵,然后操作矩阵的乘积就是答案。 然后这个过程可以用一个类似高斯消元的方法实现,时间复杂度$O(n^3)$ code: #include<bits/stdc++.h> #define I inline #define max(a,b 阅读全文