0%

思路讲解

检查点之间共有 mm 条单向通道。第 ii 条通道允许从点 sis_i 移动到点 tit_isi<tis_i < t_i),但不允许反方向移动。此外,只有当机器人至少拥有 wiw_i 个充电电池时,才能使用第 ii 条通道;否则,它将在途中耗尽电量。

这个 si<tis_i < t_i 尤为关键,这说明了这张图是有向无环图(DAG)。

那么二分做法不用多说,使用天然的拓扑排序以及类似dp做法解决,然后注意斜体加粗部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
inline bool check(ll mid){
FOR(i,0,N+5){Mxb[i]=0;}
FOR(i,1,N){
if(i!=1 && Mxb[i]==0) continue;
FOR(j,0,SZ(g[i])-1){
ll v=g[i][j][0],w=g[i][j][1];
if(min(mid,Mxb[i]+B[i])>=w){
Mxb[v]=max(Mxb[v],Mxb[i]+B[i]);
Mxb[v]=min(Mxb[v],mid);
}
}
}
if(Mxb[N]==0) return false;
return true;
}

AC代码

https://codeforces.com/contest/2110/submission/324044393

心路历程(WA,TLE,MLE……)

TLE,该代码一个点被访问多次,那么其所有边都将重新遍历一次。

image

思路讲解

题目总结

这是一道关于无人机通过障碍门的问题。有 N 道门,每道门都有高度范围 [l_i, r_i]。无人机初始高度为 0,每次可以选择保持高度不变或上升 1 个单位。部分门的操作已经固定(0 表示保持不变,1 表示上升),部分门的操作待定(-1 表示可以自由选择)。需要判断是否存在合法方案使无人机能通过所有门,如果存在则输出一种方案,否则输出 -1。

虽然这种题不是不可能dp,但dp不太可能。

容易想到一种贪心,在每一道门前尽量增加高度,

但是要注意这个高度的上界是什么。

1
2
3
4
5
6
7
8
9
10
11
12
// 在每一道门前尽量增加高度,但是要注意这个高度的上界是什么
ROF(i,N,1){
ll r=lr[i][1];
if(D[i]==1){
// 这里-1是因为这里当然不会判断,但是当mnR[i-1]来读这个mnR[i]的时候
// 我们希望mnR[i-1]的上界不能是mnR[i],因为+1就超了
// 连续操作与传递同理
mnR[i]=min(r-1,mnR[i+1]-1);
}else{
mnR[i]=min(r,mnR[i+1]);
}
}

这个上界不仅会受到后续最小 r 的影响,还会收到固定操作的影响

AC代码

https://codeforces.com/contest/2110/submission/323871174

心路历程(WA,TLE,MLE……)

思路讲解

注意到呢,把边固定下来,然后这个时候就只要去看简单路径了。因为走越多,遇到大的边的可能性越大。

当然,我们的下一步推进遇到了问题,这个问题不是树上问题,m 没有限定,那么 dp 就废了。

不过问题不大,容易想到如果不是树,我们能不能把它变为树?用最小生成树。

AC代码

AC

https://codeforces.com/contest/2117/submission/323773579

心路历程(WA,TLE,MLE……)

思路讲解

image

注意到,根据题设条件,树必须为严格的“Y”||”1”。

AC代码

心路历程(WA,TLE,MLE……)

注意,写两种dfs记得要清空vis数组。

思路讲解

首先,遇到数论问题不要怕,我们人类其实对许多数论问题其实都束手无策,就靠计算机枚举。

那么,通过素因数分解,不难发现,我们可以把问题转化为这个。

💡 Note: 给你一个序列,比如说1,2,2,3,5,你要将这个序列删空,你一次可以选择任意多的数,只要这些数的乘积小于K。要求你找到一个方式,使用最少删除次数,告诉我这个次数。

那么其实经过素因数分解得出的序列是不会有 1 的。

image

把xrem除掉,再乘上yrem,就相等了。


记忆化搜索的时间复杂度那基本上等于 状态数×入口数量状态数\times入口数量,这里的状态数量其实就是因数的数量,入口数量也是因数数量,所以最坏情况下时间复杂度为 O(n23)O(n^{\frac{2}{3}})

image

这个super composite number 就是因数数量特别多的数,比比他小的所有数的因数都多,那么这样的数大概因数数量也就是 n3\sqrt[3]{n}

highly composite number is a positive integer that has more divisors than all smaller positive integers. If d(n) denotes the number of divisors of a positive integer n, then a positive integer N is highly composite if d(N) > d(n) for all n < N. For example, 6 is highly composite because d(6)=4, and for n=1,2,3,4,5, you get d(n)=1,2,2,3,2, respectively, which are all less than 4.

1
2
3
4
5
6
7
8
9
10
11
12
ll dfs(ll val){
if(dp[val]!=INF) return dp[val]+1;
if(val==1) return 1;
FOR(i,0,SZ(facs)-1){
ll fac=facs[i];
if(fac==1) continue;
if(fac>K) break;
if(val%fac==0) dp[val]=min(dp[val],dfs(val/fac));
}
return dp[val]+1;
}

那么问题的关键就在于减少入口,注意到只有因数是合法的。

AC代码

https://codeforces.com/contest/2114/submission/323597405

心路历程(WA,TLE,MLE……)