[合集]国庆休闲补题

Hrbust - 1846

题意:序列每个格子允许放O和X,求长度为n的序列中至少存放m个连续的O的方案数

容斥+dp

设\(dp[i]\)为长度为\(i\)时的合法方案数

转移的个数来自于上一个状态的合法序列后面接上O和X,既\(dp[i-1]*2\)

也有可能来自于本来不合法的方案,转移后就合法了,那先固定一部分状态,因为转移后才合法,所以假定序列中[i-m+1,i]全部为O,那么前面就可以为所欲为,有\(2^{i-m}\)个状态,但\(2^{i-m}\)中会有合法方案的存在,因此需要减去已经合法的\(dp[i-m]\)个方案,剩下的是不合法的方案后面接上\([i-m+1,i]\)的全O的方案数.(然而这连样例都过不了)

YY了一下认为可能是非法方案转移途中还不到最后一位就合法了,而这已经囊括在\(dp[i-1]\)的范畴中,所以后半部分方程歪掉了,那就在\([i-m+1,i]\)置为O,而\(i-m\)处置为X,表示必须转移到最后一位才能形成合法的方案,那么转移用到的非法方案数为\(2^{i-m-1}-dp[i-m-1]\)

两部分加起来就可以了

https://paste.ubuntu.com/p/mYQPpgTb9N/


HDU - 4370

给定\(n*n\)矩阵\(C_{i,j}\),求构造一个\(n*n\)的01矩阵\(X_{i,j}\)

\(X_{i,j}\)满足约束第1行的和为1,第\(n\)列的和为1,其余的第\(i\)行的和等于第\(i\)列的和

使得\(\sum C_{i,j}*X_{i,j}\)最小

由于剧透,得知转化为图,节点1的出度为1,节点n的入度为1,其余\(1<i<n\)节点入度等于出度,\(C_{i,j}\)为\(i→j\)的权值

入度与出度相等意味着非起始点/终点或是可能有环,需要分别讨论1和n是否各自形成环,或者只是1到n的简单路径,对比一下权值即可

https://paste.ubuntu.com/p/pY2gVmJxkf/


FZU - 2234

题意:求双调最短路的最大价值

来回的过程可看作是两个人同时在起点走到终点,但物品只能取一次,但时间无法承受\(O(n^4)\)

因为走的是最短路,对于某个人已经走了\(k\)的长度,可以得到\(x_i+y_i=k+2\)

因此设\(dp[k][x_i][y_i]\)为走了k的长度时第一人在横坐标\(x_i\)而第二个人在横坐标\(x_j\)的最大价值

如果坐标相等则把两个物品的价值除二看作只拿一次

https://paste.ubuntu.com/p/nssf9KynCF/


Codeforces - 337D

题意:给出一棵n个点的树和m个标记的点,求存在多少个点离最远的标记点不超过d

不错的树形DP(换根大法好)

令\(f[i]\)为\(i\)与\(i\)子树下距离标记点最远的距离,若不存在则为\(-\infin\)(保证后面加法的正确性)

令\(g[i]\)为\(i\)与\(i\)子树以外的距离标记点最远的距离,若不存在则为\(-\infin\)

那么答案就是\(max(f[i],g[i])≤d\)的\(i\)的个数

\(f[i]\)很容易搞,只需\(f[u]=max(f[u],f[v]+1)\)

\(g[i]\)则需要考虑\(i\)的父亲以及\(i\)的兄弟,\(g[u]=max(g[u],g[fa]+1,f[v]+2)\)

很显然每个\(u\)对兄弟\(v\)的枚举可以被菊花树卡飞

那么需要一个简单优化,记录对于每个节点\(fa\)记录\(f[]\)最大的儿子节点\(best[fa]=v\)

那么对于枚举到本来就是一个父亲的\(best\)节点\(u\)时,对\(g[u]\)则需要暴力枚举所有兄弟,而不是\(best\)的节点时,\(g[u]=max(g[u],g[fa]+1,f[best[fa]]+2)\)

https://paste.ubuntu.com/p/9JcQYSjGHx/


Codeforces - 675E

题意:\(n\)个车站,每个车站\(i\)可花费用1到达车站\([i+1,a_i]\),设\(p[i][j]\)为\(i\)到\(j\)的最小费用,求\(\sum_{1≤i<j≤n}p[i][j]\),\(n<10^6\)

代价为定值下可贪心的dp

设\(dp[i]\)为\(\sum_{i≤u<v≤n}p[u][v]\),那么答案就是\(\sum_{i=1}^{n-1}dp[i]\)

考虑怎么转移,首先可以知道的是对于\(i→[i+1,a_i]\)费用为1,\(i→[a_{i+1},a_{i+2},...,a_{a_i}]\)费用为2,以此类推

但\([a_{i+1},a_{a_i}]\)是非单调的,仍需要维护最大值让每次转移尽量远,令这个存在最大值的下标为\(m\)

那转移方程就是\(dp[i]=dp[m]+[(n-i)-(a_i-m)]\)

YY一下正确性,每次转移都按照这样的贪心策略,对于每一个\(i\)而言肯定是一种最快到达\(n\)的方案之一?

其实这样看的话这题不算是DP,只是一种记忆化手段

https://paste.ubuntu.com/p/xwHRv4SqSn/


Hrbust - 1256

题意:给出\(n\)个人,要求组建\(k\)支队去打铁,每支队的战力为\(a[i]+a[j]+a[k]+b[i][j]+b[i][k]+b[j][k]\),求最高总战力

范围\(n<19\)状压DP优化

首先\(O(n^3*2^n)\)没戏,需要压常数,参考dalao的发言,由于状态总是3个出现,与其暴力三层枚举,不如用k-1次凑数来更新答案,这样复杂度是\(O(能过)\)

https://paste.ubuntu.com/p/2wd72Ddg6B/


Codeforces - 611D


HDU - 6070

题意:求\(\frac{cnt[l,r]}{r-l+1}\)的最小值,\(cnt[l,r]\)表示区间\([l,r]\)的数值种类

分数规划问题考虑二分答案\(mid\),有\(cnt[l,r]≤(r-l+1)*mid\),次数需要维护种类数和长度的关系,不好check

把式子改为\(cnt[l,r]+(l-1)*mid≤r*mid\),每次check枚举右端点,左边用线段树更新答案,每次插入新的r更新只会影响cnt的值,只要记录各类型前一个值在哪即可,既维护一个动态的后缀

(感觉自己的counting能力太弱了)

https://paste.ubuntu.com/p/dtDGK6YPJT/


Codeforces - 817D

题意:求\(\sum max(a[l,r]) - \sum min(a[l,r])\)

喜闻乐见单调栈

首先求最小的部分,

对于每个\(i\),它能扩展到的极左边界为\(l[i]\),使得\(a[j]>a[i],j∈[l[i],i-1]\),并对应求出极右边界\(r[i]\),使得\(a[j]≥a[i],j∈[i,r[i]]\)

此时\(i\)对答案的贡献为\((i-l[i]+1)*(r[i]-i+1)\),注意包含\(i\)的区间个数应该是两边都有\(i\)的交集!

同理,维护最大的部分,对于每个\(i\),\(a[j]<a[i],j∈[l[i],i-1]\),并且\(a[j]≤a[i],j∈[i,r[i]]\)

https://paste.ubuntu.com/p/kY2Ws2bfG6/


Codeforces - 478D

题意:r个红方块和g个绿方块,要求第\(i\)行搭\(i\)个同色方块,求总共有多少种方案

垃圾题目,浪费时间

\(dp[i][j]\):第\(i\)层用了\(j\)个红方块的方案数,然后分别用红方块和绿方块转移即可,注意细节

尤其是sum的break判断不要放在while底部,因为这样h可能是刚好缺少的那一层

https://paste.ubuntu.com/p/jQJxsVmHcB/


Codeforces - 366C

题意:给出\(a[1...n],b[1...n]\),求\(\frac{\sum a[i]}{\sum b[i]}=k\)且\(\sum a[i]\)尽量大的集合方案,输出\(\sum a[i]\)

总费用为0的背包

由于是集合,每个元素最多只能拿一次,且要求价值和最大,符合01背包的背景

把式子展开为\(\sum a[i]-\sum k*b[i]=0\),可以看出体积为\(a[i]-k*b[i]\),价值为\(a[i]\)

对着跑一遍01背包就ok,目标是\(dp[n][0]\)

作死尝试unordered_map

https://paste.ubuntu.com/p/BkyMYqxzPJ/


Codeforces - 466D


HDU - 2833


HDU - 5242


Codeforces - 489F

题意:已知前m行01矩阵,求构造\(n*n\)的01矩阵使得每一行列只有2个1的方案数

\(dp[i][j][k]\):当前第\(i\)行的列和为0的总数是\(j\),列和为1的总数是\(k\)

由于要求每一行都要由2个1,就是说转移过程中新构造的一行必须填入2个1,这是突破口

\(dp[i][j][k]=dp[i-1][j+2][k-2]* {j+2 \choose 2} + dp[i-1][j+1][k]*(j+1)*(k)+dp[i-1][j][k+2]*{k+2\choose 2}\)

目标是\(dp[n][0][0]\)

但这样会T

一种解决方法是枚举\(i\)行和\(j\)个位置,可以计算得到\(k=(n-i+1)*2-j*2\)

https://paste.ubuntu.com/p/rjNc844Hcj/


HDU - 2853


HDU - 4360


Ural - 2080

观赏题:CF669D/51nod-1021/HDU4101/

OJ挂了:CSU1809

回收站:HDU4472/CF550C/CF660C/CF353D/Hrbust1774/CF430D

建图相关:CF821D(把行列看作点)

原文地址:https://www.cnblogs.com/caturra/p/9739696.html

时间: 2024-10-09 04:27:25

[合集]国庆休闲补题的相关文章

【多题合集】网络流24题练习(更新至魔术球问题)

飞行员配对问题(仅求方案总数) 传送门 思路:二分图后dinic走起,各边容量为1 代码: #include<bits/stdc++.h> #define inf 0x7ff using namespace std; int ans,n,n1,s,t,tot=1; int first[105],dis[105],up[105]; bool vis[105]; queue<int>q; struct edge { int u,v,next,w; }e[500]; void add(i

《github一天一道算法题》:搜索二叉树接口实现大合集

读书.思考.写代码! 说明: (1)这里实现了搜索二叉树的全部常用操作 (2)限于时间和精力,实现的较为粗糙,内存泄露.成员变量访问控制.返回类型.异常安全等没有照顾的到 (3)一切实现的手段都是贴近底层操作,关注原理.以后可能对推倒重来,实现一个完备的接口系统. /********************************************* * [email protected] * 题目:二叉树接口实现大合集 * 具体:二叉树的创建.插入.最大值.最小值.前中后序递归遍历与非递

[题解+总结]动态规划大合集II

1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2.lis 最长上升子序列 唯一一道裸题,但是O(n^2)过不了,临时看了看O(n log n)的二分做法和线段树做法.先来讲讲简单的二分做法,其本质就是在O(n^2)上进行优化,需要证明一个结论.设当前处理数列第k位,存在: (1)a[i]<a[j]<a[k]: (2)i<j<k: (3

前端资源教程合集

综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v2.2 En类资源汇总 免费的编程中文书籍索引 前端书籍 前端免费书籍大全 前端知识体系 免费的编程中文书籍索引 智能社 - 精通JavaScript开发 重新介绍 JavaScript(JS 教程) 麻省理工学院公开课:计算机科学及编程导论 JavaScript中的this陷阱的最全收集--没有之一 JS函数式编程指南 JavaScript Promise迷你书

[知识点]NOIP动态规划大合集

1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NOIP2003 加分二叉树 树形DP入门题,根据题意,一个树的加分=左子树*右子树+根节点,由此可以设f[i][j]为子树i到j的加分,则有方程:f[i][j]=max{d[t]+f[i,t-1]*f[t+1,j]} ( t∈[i,j] ) 3.NOIP2004 合唱队形 应该是最简单的一道了,枚举队

前端相关网址合集

综合类 | 地址--- | --- 前端知识体系--http://www.cnblogs.com/sb19871023/p/3894452.html前端知识结构--https://github.com/JacksonTian/fks免费的编程中文书籍索引--https://github.com/justjavac/free-programming-books-zh_CN智能社 - 精通JavaScript开发--http://study.163.com/course/introduction/2

2014年880个合集Android-实例子源代码文件下载地址合集

***************************************************************************************************优质Android 源码现有各类源码接近6000套,视频教程100套,主要涉及.net网站.软件与安卓系列源码,每套源码都已经经过测试,必须附加使用说明或帮助文档.靠谱不坑爹! 需要打包下载合集地址请的朋友 ,欢迎您与我交流 QQ群: 258450620 或QQ:50841662Android 源代码

Android基础入门教程——8.4.1 Android动画合集之帧动画

Android基础入门教程--8.4.1 Android动画合集之帧动画 标签(空格分隔): Android基础入门教程 本节引言: 从本节开始我们来探究Android中的动画,毕竟在APP中添加上一些动画,会让我们的应用变得 很炫,比如最简单的关开Activity,当然自定义控件动画肯定必不可少啦~而Android中的动画 分为三大类,逐帧动画(Frame)以及补间动画(Tween),还有Android 3.0以后引入的属性动画 (Property),而本节给大家带来的是第一种动画--逐帧动画

【开发者福利】最全面的移动端免费素材合集

在移动端设计风起云涌的今天,移动端的UI和UX设计师任重而道远.巧妇难为无米之炊,好素材就是设计师的底气.这次搜集的移动端免费素材覆盖全面,从教学资源到UI Kit,从开发工具到图标合集,一应俱全. 学习资源 UX Design for Mobile Developers 移动端开发的用户体验设计是Udacity所推出的课程,教授移动端应用开发用户体验设计的技术和案例,主要是针对移动端开发者,提高他们对于设计和用户体验的知识和意识,让他们开发的APP兼具好功能和好体验,不过编程开发的体验设计并不