10 2020 档案

摘要:比较裸的拆点最短路吧 注意特判起点终点相等的情况,起点终点相等不需要换乘任何线路,答案为0 const int N=1010,M=510; struct Node { int u,line,dis; bool operator>(const Node &W) const { return dis>W 阅读全文
posted @ 2020-10-23 10:32 Dazzling! 阅读(119) 评论(0) 推荐(0) 编辑
摘要:MST板子题 const int N=5e5+10; struct Node { int a,b,c; bool operator<(const Node &W) const { return c<W.c; } }e[N]; int p[N]; int n,m; int find(int x) 阅读全文
posted @ 2020-10-10 23:07 Dazzling! 阅读(86) 评论(0) 推荐(0) 编辑
摘要:dijkstra dijkstra求最短路中我们每次选取的是离原点的最短边来松弛剩下的节点 在这里我们要找到到达终点的的一条路使其路径上的最小边尽量大,才能使其载重量较大。 也就是说每次选择一个从源点到某个载重量最大的点,来松弛其他点。 dist将记录到达每个点的路径上的最小载重,选择最大的 阅读全文
posted @ 2020-10-10 17:57 Dazzling! 阅读(91) 评论(0) 推荐(0) 编辑
摘要:同追债之旅 分层图最短路 每次的决策:用/不用免费票 const int N=10010; vector<PII> g[N]; struct Node { int dis,u,cnt; bool operator>(const Node &W) const { return dis>W.dis; } 阅读全文
posted @ 2020-10-10 11:56 Dazzling! 阅读(86) 评论(0) 推荐(0) 编辑
摘要:最短路变形题,加一维状态就好啦 dist[i][j]表示到达第i号点,到达时间为第j天的最短距离 判重数组要和dist数组一致 直接跑dijkstra即可 const int N=1010; vector<PII> g[N]; struct Node { int dis,u,da 阅读全文
posted @ 2020-10-10 11:36 Dazzling! 阅读(100) 评论(0) 推荐(0) 编辑
摘要:update 如果按照正确理解题意的情况下, 好多题解的代码都错的啊,但毕竟十几年前的题了,数据水了 二分 一眼二分 最后输出答案前一定要check一遍最优解,才能得到正确的方案 const int N=10010,M=20010; struct Edge { int a,b,c; }e 阅读全文
posted @ 2020-10-04 22:04 Dazzling! 阅读(97) 评论(0) 推荐(0) 编辑
摘要:太菜了。。。这么简单的模型都看不出来。。。 模型:图的直径 注意:原题为无向图 暴力思路:从1000个点中选取3个点的排列,然后求路径和。 上述思路过于暴力,我们知道dijkstra算法求得的dist数组是源点s到其余点的最短距离 我们只需将源点看成中转点,然后求出当前点到其余点 阅读全文
posted @ 2020-10-04 20:22 Dazzling! 阅读(114) 评论(0) 推荐(0) 编辑
摘要:MST裸题 const int N=110; int g[N][N]; int dist[N]; bool vis[N]; int money; int n,m; int prim() { memset(dist,0x3f,sizeof dist); memset(vis,0,sizeof vi 阅读全文
posted @ 2020-10-04 17:22 Dazzling! 阅读(129) 评论(0) 推荐(0) 编辑
摘要:因为每组至多选择一个物品,可以将每组看做一个整体,这样就类似于01背包问题。 用f(i,j)表示前i组物品放入一个容量不超过j的背包可以获得的最大价值。 对于第i组物品: 不放入第i组物品,f(i,j)=f(i1,j) 放入第i组的第k个物品,\(f(i 阅读全文
posted @ 2020-10-02 22:32 Dazzling! 阅读(215) 评论(0) 推荐(0) 编辑
摘要:暴力拆分 暴力拆分就是把第i种物品看做si个独立的物品,每个物品只有一个,转化为01背包问题。 const int N=110; int f[N]; int n,m; int main() { cin>>n>>m; for(int i=1;i<=n;i++) { int v,w,s; ci 阅读全文
posted @ 2020-10-02 22:25 Dazzling! 阅读(96) 评论(0) 推荐(0) 编辑
摘要:状态表示:f(i,j,k,l)\(\)(i,j)\(\)(k,l)的价值最大值 特判一下坐标相等情况就好了。 const int N=15; int f[N][N][N][N]; int g[N][N]; int n; int main() { cin>>n; in 阅读全文
posted @ 2020-10-02 10:45 Dazzling! 阅读(143) 评论(0) 推荐(0) 编辑
摘要:和简单瞎搞题 类似 状态表示:f[i][j] 表示前i个数能组成的模3600的数,f只有0、1两种状态 答案:判断f[n][0]是否为真即可 时间复杂度:O(Tn3600),显然无法接受 优化:将bool数组替换成bitset const int N=1e5+10; 阅读全文
posted @ 2020-10-01 20:45 Dazzling! 阅读(102) 评论(0) 推荐(0) 编辑
摘要:状态表示:f[i][j]表示前i个数是否能组成数j 状态转移:枚举xi[li,ri] 时间复杂度最坏为:1010,显然不能接受 空间复杂度为:100M,可采用滚动数组优化 下面针对时间复杂度优化: f[i][j] 为前i个数字能否构成j,考虑第 阅读全文
posted @ 2020-10-01 18:22 Dazzling! 阅读(121) 评论(0) 推荐(0) 编辑
摘要:正着求一遍LIS,反着求一遍LIS,最后拿总人数减去满足T1<...<Ti>Ti+1>>TK(1<=i<=K)的人数即可。 const int N=110; int f[N],g[N]; int a[N]; int n; int main() { cin>>n; for(i 阅读全文
posted @ 2020-10-01 16:25 Dazzling! 阅读(201) 评论(0) 推荐(0) 编辑
摘要:递推计数,注意边界为1n的时候特判一下 状态表示:f(i,j):传了i次球后,球在第j个人手中的方案数 状态转移: 填表法:f(i,j)=f(i1,l)+f(i1,r)l表示j左边的人,r表示j右边的人 刷表法:\(f(i+1,l)+=f(i, 阅读全文
posted @ 2020-10-01 14:48 Dazzling! 阅读(145) 评论(0) 推荐(0) 编辑
摘要:01背包裸题 const int N=10010,M=30010; int f[M]; int a[N],b[N]; int n,m; int main() { cin>>m>>n; for(int i=1;i<=n;i++) cin>>a[i]>>b[i]; for(int i=1;i<=n; 阅读全文
posted @ 2020-10-01 11:18 Dazzling! 阅读(98) 评论(0) 推荐(0) 编辑
摘要:n<=15,直接指数枚举就行,时间复杂度O(2n) const int N=20; int a[N],b[N]; int c[N],d[N]; int n; LL ans; void dfs(int u,int wealth,int magic) { if(u == n) { ans= 阅读全文
posted @ 2020-10-01 10:53 Dazzling! 阅读(126) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示