首师大附中集训D3日报(20231212)-总结部分
分析不是瞎编,杂题不能乱做
这下真突破难度极限了,一下午2个黑题3个紫题,我以前怎么敢想啊(虽然这俩黑题全是对脑电波题,还是直接拿来用的结论)
杂题没什么可以系统总结的,直接贴一波题解思路加深理解就行
神奇的期望/概率dp题
首先排除这道题里的诈骗成分,结果只和最后状态有关,显然,最后会变成<<<<<<<<········>>>>>>>>>>的形式,
其中间隔一定是两个洞围出来的部分,这部分维持原序列
然后分析一波,对于每一种保留间隔的情况,要同时满足左右两边形成成长串,且问题具有对称性
所以设dp[i]为这样的串恰好过i段的概率,初值dp[0]=1;因为每在已有的成立的串上增一段,新增的洞有1/n的概率最后走影响结果,有1/2的概率干飞出去,因此
有递推式
dp[i]=dp[i-1]*(1/2i)
这个值可以预处理
结果呼之欲出
ans=Σdp(左段数)\(*\) dp(右段数)\(*\)(左总点数+段内<数)
o(n)扫描,预处理即可
这个题啊他非常的有趣,好题
首先是部分分
菊花图: 答案必为1/-1,非常简单,画图即可
链: 整个问题直接转化为一个区间类型的贪心问题,直接贪心找最靠一端的可行的点即可
其实难题似乎很多都带有一些诈骗成分
这个题就可以先通过部分分思路 找出几个隐藏性质
菊花图的启发
1.无解的充要条件为存在长度为1的链
2.对于一条链,可以在非端点的链上面任意取点,也可以在这些点引出的子树上任意取点
3.从树的角度讲,可以分为直链(dep单调)和曲链(dep不单调)两种;由性质2,曲链只要在根节点及祖先,祖先的子节点,非端点子树上有点即可消掉。而直链可以在非端点上引出子树上消掉
链的启发
4.由性质2,3,结合链部分分的贪心思想,可以有基本贪心原则:把点向靠近根节点放,这样有更大可能消掉更多的曲链。因此对于直链,应当尽可能取深度小的非端点,称之为关键点。
这个时候已经考虑到曲链的“尽可能消除”和直链自己消自己的情况,全题处于贪心解决的状态。还没讨论直链被子树消除的情况,这个时候问题就大了,假如非端点子树上有其他链,那么可以这样消掉
于是选择树形dp
dpi表示子树所有关键点所在链都消掉,显然可以用用v累加更新fa,对于一个关键点k,需要决策是否用k消掉这个链,有
dpk=max(dpk,dpv+1)
v为这条链深度较大的点
这个dp虽然在求最小,却取了max,为什么呢
首先,dpk在维护前的值是没有考虑当前链的,而dpv+1代表的是消去当前链,且在这条链上消耗了一次取点,由性质2可知,如果dpk<dpv+1说明一定有其他点消了这个链,否则就需要取dpv+1
用同样的方法考虑曲链,直接统计答案ans,对于所有曲链u,v
ans=max(ans,dpu+dpv+1)
同理,不详细推了
个人感觉这道题主要可取他的转化思路,总体流程如下
1.用超级原点连所有电站,跑dij
2.转化边权,走kru
3.lca查询
超级远点和化式子改边权都很可取,但是这个算法拼接确实……
码量挺大,大部分是板子,主要取一个思路
CF1446D2-Frequency Problem (Hard Version)
看见根号复杂度眼睛一下就亮了
性质:局部众数必包含整体众数
直接根号分治
出现次数大于根号n的数量少于根号n直接on扫
出现次数小于根号n的数量大于根号n 枚举出现次数,双指针
结论题,诈骗程度极高,贴个代码就润了
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
int t1=1ll*(1ll*(1ll*i*(i-1)/2+1ll*(n-i)*(n-i+1)/2)%p)%p;
int r1=inv(1ll*n*(n+1)/2%p)%p;
t1=1ll*t1%p*r1%p;
ans=(ans+1ll*i*i%p)%p;
int t2=1ll*qp(t1,m)*a[i]%p*i%p;
int r3=1ll*(1-qp(t1,m)+p)%p;
int t3=1ll*r3*a[i]%p*(n+1)%p*((p+1)>>1)%p;
ans=(ans-1ll*(t2+t3)%p+p)%p;
}
ans=1ll*ans*qp(1ll*n*(n+1)/2%p,m)%p;
cout<< (ans+p)%p;
}
麻了,明天还得讲题,来到ynoi大分块,祝我好运
今天的课堂笔记,有一些东西不太准确,以总结的为主