一些复习总结
暴力好题
字符串匹配
微信步数
宝藏 ——搜索
回文 ——贪心+搜索
多叉堆 ——组合
Emiya家今天的饭
模拟好题
儒略日
网络连接
时间复杂度
表达式——栈
划分合并类dp
通过划分合并来维护一个单调不减的序列
贪心偶尔会出问题
P5665划分
signed main(){
n=read(); type=read();
for(int i=1;i<=n;i++){
a[i]=read();
s[i]=s[i-1]+a[i]; //前缀和
}
for(int i=1;i<=n;i++){
int j;
for(j=i-1; j>=0;j--) //寻找以i结尾的最优解
if(s[i]-s[j]>=k[j]) break; //单调不减
f[i]=f[j]+(s[i]-s[j])*(s[i]-s[j]); //递推式 即所求的平方和
k[i]=s[i]-s[j]; //更新以i结尾的最小划分和
}
printf("%lld",f[n]);
return 0;
}
P2300合并神犇
同理 改一下递推式就行
f[i]=f[j]+i-j-1;
表示以j结尾的最少合并次数
树
P5666 树的重心
【树】【动态规划】关于树上的一些问题
暴力枚举删了每条边之后的子树的大小,并求重心,最后相加。大概有个40分
位运算
P2114 起床困难综合症
0在二进制表示中全是0, -1在二进制表示中全是1
利用这一性质可对一系列位运算操作之后的结果做预判
P5283异或粽子
求异或的前缀和
sum[j]^sum[i-1]
就是做一遍异或的逆运算,还是异或,注意不是减法
暴力位运算本题60
正解在下面
字典树Tie
P2580 于是他错误的点名开始了
水题 板子
最大异或对
void insert(int x){
int p=0;
for(int i=30;i>=0;i--){
int u=x>>i&1;
if(!son[p][u]) son[p][u]=++idx;
p=son[p][u];
}
}
int query(int x){
int p=0, res=0;
for(int i=30;i>=0;i--){
int u=x>>i&1;
if(son[p][!u]){
p=son[p][!u];
res+=1<<i;
}
else p=son[p][u];
}
return res;
}
异或粽子
就是求k对的最大异或对咯
1LL
才是longlong
1不是longlong!!!
代码
最短路
P5563加工零件
由题意可知答案与奇偶性有关,因此将一个点看两个点,一个奇点,一个偶点。跑一遍spfa单源最短路,求出1号点到其他所有工人的距离,若到L%2同奇偶的点的最短路大于L,则无法到达。
最小生成树
P5687网格图
最小生成树板子 注意建图
DP
P7074方格取数
第三维状态储存从哪个方向过来的
dp[j][i][0]=max(dp[j][i-1][0],max(dp[j][i-1][1],dp[j-1][i][0]))+a[j][i];
dp[j][i][1]=max(dp[j][i-1][0],max(dp[j+1][i][1],dp[j][i-1][1]))+a[j][i];