随机做题记录
觉得天天改完抽象模拟赛的抽象题有点浪费时间,怪东西太多的打算直接扔,马上省选了改出来场上也不会,最近自己翻了点简单题做,迎合一下打部分分的策略,顺便提供一点信心。
发现 "r相似" 的定义本质就是parent树上两点lca的
对每个节点完成treedp后答案仅会被汇总到
把问题转换成:将一个节点染黑&查询一个(黑)点到所有黑点的距离和。这个题前两天才考过,考虑树剖维护换根时边的贡献从根换到查询节点即可。
特殊有向图的拓扑序计数。考虑treedp,设
树上查询问题,一般有链剖分,dp和优化dp和离线啥的做法。
考虑链的情况设
然后这个方程可以广义矩阵乘法维护
然后树上倍增维护一下向上和向下的转移矩阵,注意一下细节即可。
从根往下跑,最优解里取负的说明下面有收益,考虑维护有正收益的子树二元组
#include<bits/stdc++.h>
#define int long long
#define MAXN 300005
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
using namespace std;
const int inf=9e18;
int n,S;
struct node{
int v,nxt;
}edge[MAXN<<1];
int h[MAXN],tmp;
inline void add(int u,int v){
edge[++tmp]=(node){v,h[u]};
h[u]=tmp;
}
int Val[MAXN],fa[MAXN],rt[MAXN],sav[MAXN];
priority_queue<pii,vector<pii>,greater<pii> >Q[MAXN],q;
inline int merge(int x,int y){
if(Q[x].size()<Q[y].size())swap(x,y);
while(!Q[y].empty())Q[x].push(Q[y].top()),Q[y].pop();
return x;
}
int f[MAXN];
inline void dfs(int u){
for(int i=h[u];i;i=edge[i].nxt){
int v=edge[i].v;
dfs(v);
}
Q[rt[u]].push(mp(f[u],u));
int now=0;
while(!Q[rt[u]].empty()){
pii T=Q[rt[u]].top();Q[rt[u]].pop();
int v=T.se,w=T.fi;
if(now<w)f[u]+=w-now,now=w;
if(u==v){
now+=Val[u];
for(int i=h[u];i;i=edge[i].nxt){
int tar=edge[i].v;
Q[rt[u]].push(mp(f[tar],tar));
}
}
else{
now+=Val[v];
rt[u]=merge(rt[u],rt[v]);
}
if(now>=f[u]){
Val[u]=now-f[u];
return ;
}
}
f[u]=inf;
}
signed main(){
scanf("%lld%lld",&n,&S);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&Val[i],&fa[i]);
add(fa[i],i);
rt[i]=i;
sav[i]=Val[i];
}
dfs(0);
int ans=S;
q.push(mp(f[0],0));
while(!q.empty()){
pii T=q.top();q.pop();
int u=T.se,w=T.fi;
if(ans<f[u])break;
ans+=sav[u];
for(int i=h[u];i;i=edge[i].nxt){
int v=edge[i].v;
q.push(mp(f[v],v));
}
}
printf("%lld\n",ans-S);
return 0;
}
喵喵题,把条件变换一下变成
找个环就行了,真神奇。
第999AC。
想到正解没发现性质,有点唐。
可以考虑先allin再调整,现在结果比L大就从高到低扣正的,否则就从低到高扣负的,不难发现这样跑完答案肯定离
之后考虑如何取舍第一步完了之后的集合,考虑背包,初值0给到
让这题给卡住了我还活什么啊。答案只能是一段连续区间,感性理解。策略的话,用某种方法确定起点后每次去找最小的
傻逼克高手。显然要在
但是这样很明显是死掉的,考虑优化这个暴力:想这样一个事情,既然
考虑使用一些手法最大化一个后缀不清空段,这样肯定是最优的;后缀不清空段是还有0还能直接打满。但是倒着求这个段好像有点扯。
考虑正着跑一个
有意思的treedp。
显然要在节点儿子个数<10做文章。考虑直接设
其中
但是这样不好合并,无法处理多个不影响路径之间贡献的叠加,这时候就要考虑那个很小的儿子个数了,状态压缩:设
看
依赖关系不一定是树状的,缩完点跑treedp即可。
我怎么一直在做treedp???
这个可以cdq做,但是我不会。
长得特别lct维护最小生成树,问题是随着边权的改变会虚空索边,然后就死了。就可以考虑用线段树分治来维护,每次修改操作相当于在原先那条边对应的链表上新加入一条边,边权
话是这么说的但是细节有点小多,这两个东西随便锅一下都要调好久...主要是没做过线段树分治加dsu以外数据结构的题。
显然根据
有了这个后继之后就比较好办了,从后往前扫一下原序列,对于当前要处理的
lct维护最小瓶颈生成树板子。按
上面那个2018B的后继题目。根据结论合法的位置是一个连续段,设
钦定,走完还得走:
钦定,走完正好到那个位置了
不钦定写成
但是这样复杂度是死掉的,因为你一直在枚举一个
后半部分可以预处理,前半部分会变成
为什么我不会概期.jpg
有一个比较聪明的dp,设
复杂度
随机跳题跳到省赛模拟时的t4,就那个命运的X,当时口胡过去的,今天看明白了。
先只研究匹配完整的串,则于时间
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律