[正经向] 九月杂题整理

  • \(\rm{LG1858}\) 多人背包

挺新颖的DP虽然是很早的题了

设计状态\(f_{i,v,k}\)表示考虑前\(i\)个物品,现在装了\(v\),排名\(k\)的解。我们考虑这个解一定是可以从\(f_{i-1,v,1\to K}\)或者\(f_{i-1,v-cost_i,1\to K}+val_i\)转移过来的,并且随着\(k\)递增,\(f\)递减,所以转移的时候就可以从两个状态集各拉一个指针过来,单调转移一下即可。

    for (i = 0 ; i < M ; ++ i)
            for (j = 1 ; j <= K ; ++ j)
                    f[i][j] = - Inf ; f[0][1] = 0 ;
    for (i = 1 ; i <= N ; ++ i)
            for (j = M ; j >= c[i] ; -- j){
                    int H1 = 0, H2 = 0 ;
                    if (f[j - c[i]][1] < 0) continue ;
                    tmp[1] = f[j][1] ;
                    for (k = 1 ; k <= K ; ++ k, tmp[k] = f[j][k]){
                            if (f[j - c[i]][H1 + 1] + v[i] > tmp[H2 + 1])
                                H1 ++, f[j][k] = max(f[j][k], f[j - c[i]][H1] + v[i]) ;
                             else H2 ++, f[j][k] = max(f[j][k], tmp[H2]) ;
                        }
                }
    for (i = 1 ; i <= K ; ++ i) ans += f[M][i] ;
  • \(\rm{LG4641}\) 序列

以前写过详细的:Link

  • \(\rm{LG3071}\) 座位

很简单的线段树,就是“所\(maintain\)非所\(query\)”这个技巧还是可以学一下的。简单记一下比较妙的\(query\)函数吧:

int query(int rt, int l, int r){
    down(rt) ;
    if (l == r) return l ;
    int ls = rt << 1, rs = rt << 1 | 1, mid = (l + r) >> 1 ;
    if (T[ls].S >= O) return query(ls, l, mid) ;
    else if (T[ls].Rs + T[rs].Ls >= O) return mid - T[ls].Rs + 1 ;
    return query(rs, mid + 1, r) ;
}
  • \(\rm{LG1005}\) 矩阵取数

\(f_{l,r}\)表示只剩\([l,r]\)之间没取的最大值,\(n^2\)之后统计每个\(f_{i,i}\)算贡献,挺水的一dp。

原文地址:https://www.cnblogs.com/pks-t/p/11748728.html

时间: 2024-08-30 17:15:22

[正经向] 九月杂题整理的相关文章

杂题整理 简单复习

随心情更新 不复习 就是模拟赛遇到三月份写的欧拉路 想一年都不会 二分 POJ3104 题意:有一些衣服,每件衣服有一定水量,有一个烘干机,每次可以烘一件衣服,每分钟可以烘掉k滴水. 每件衣服没分钟可以自动蒸发掉一滴水,用烘干机烘衣服时不蒸发.问最少需要多少时间能烘干所有的衣服.. 其实和模拟赛T2 很像 你面临着两个决策的选择 不过一个需要等待 一个可以直接进行 考虑 此时二分这个风干的时间 mid 那么 考虑check怎么写 如果一个点的晾干时间 > 此时二分的mid  那么我们考虑 最有策

【最小生成树杂题】

这里谈一下最小生成树 生成树的概念:连通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树.生成树是连通图的极小连通子图.所谓极小是指:若在树中任意增加一条边,则将出现一个回路:若去掉一条边,将会使之变成非连通图. 生成树各边的权值总和称为生成树的权.权最小的生成树称为最小生成树. 最小生成树一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.常用于求最小生成树得算法包括kruskal(克鲁斯卡尔)算法或Prim(

linux 基础题整理

基础题: 1.查看系统内核版本号及系统名称 2.查看smb服务所用的端口号 3.禁ping 4.查出22端口现在运行什么程序 5.登录提示符前的输出信息"you are welcome!!!" 6.成功登录后自动输出信息"距离全国比赛还剩1天!!!" 7.确认安全终端为tty1 8.取消普通用户的控制台访问的三个权限:reboot.halt.shutdown 9.只允许组ID为10的成员通过su命令改变为root用户 10.禁止Control-Alt-Delete键

_杂题_

杂题集 是个放题的好地方! **** 5.28 **** - BZOJ [3052] 糖果公园 - 据说是一道区间操作的综合题,但现在貌似蹦了? 现在还是太水,之后再来写吧. *************

[杂题]URAL1822. Hugo II&#39;s War

看懂题意的请直接跳过下一坨! 本人有表达障碍! ========================================== 题意: (题意真的很难很难懂啊!!!  去他娘的**) 有一个王国,王国里有一个国王(编号为1),他有(编号为2~n) n-1个臣子(这些臣子并不全和他有直接关系) 然后呢 国王要去打架,但是只有当他的x%个及以上的直系下属(与他有直接关系的臣子)做好打架的准备了,他才能去打架 他的直系下属也有下属,也要其中x%及以上的下属做好打架准备了,那些直系下属才会开始准备

hdu 3641 数论 二分求符合条件的最小值数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*==================================================== 二分查找符合条件的最小值 ======================================================*/ ll solve() { __int64 low = 0, high = INF, mid ; while(low <=

hdu 4961 数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=4961 先贴个O(nsqrtn)求1-n所有数的所有约数的代码: vector<int>divs[MAXN]; void caldivs() { for(int i=1;i<MAXN;i++) for(int j=i;j<MAXN;j+=i) divs[j].push_back(i); } 有了这个当时理下思路就可写了,但是重复数处理注意: 1.用一个数组vis[]  vis[i]=1表示i存在

poj 杂题 - 1959 Darts

这一题放在杂题里,是因为我没有用DP,而是使用的枚举,当然是受到了discuss里面的启发. 因为我们只能有三次机会,每一次只可以是固定的63个数,所以枚举感觉更加直观,但是不知道是不是没有DP快. #include<stdio.h> #include<string.h> int n; int Darts[63]; int main(){ int t,c=1,i,j,k,res; scanf("%d",&t); for(i = 0 ;i<=20;i

poj 杂题 - 2081 Recaman&#39;s Sequence

这道题目一开始就能知道考点在如何缩短查找时间.所以加快查找是我们的重点.但是在大数据面前,查找算法都不够快,所以我们用简单的hash思想来做. 我们开一个数组a,当出现了一个数b时,把该数作为下标调整值,即a[b] = -1,下一次出现该值的时候直接去找这个值作为下标的a值是否为-1即可. #include<stdio.h> #include<string.h> #define MAX 5000010 int p[MAX]={0}; int s[MAX]={0}; int main