摘要:
Lisa 首先强行选择一个点 然后计算它左边最多长区间,右边也是 就可以了 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int a[600001]; in 阅读全文
摘要:
Jennie 从左往右处理骨牌,需要知道什么就可以确定状态了? 需要知道当前的差值,然后dp决定取不取反 怎样知道差值 当然是扔到状态里 然后这就是一个背包了 #include<iostream> #include<cstdio> #include<algorithm> #include<cstri 阅读全文
摘要:
Jennie 显然可以模拟,但是谁会喜欢写高精和逆元呢? 需要撤销乘法操作,该怎么做呢 如果说一个个乘法结合起来的话,那么撤销就是把一个数变成1 那么就是一个线段树的问题了 #include<iostream> #include<cstdio> #include<algorithm> #includ 阅读全文
摘要:
CSP2021初赛爆炸记 黄色的树林里分出两条路,可惜我不能同时去涉足 今天是2021/9/19,最后一次NOIP 早晨起的很晚,因为昨晚的CF的原因,打了一个小时跟我说不计rate,shit 好吧好吧不上学还是有自己的轻松之处,买个咖啡就走了 在车上应该学习吗,看来是不合适的,于是也只能睡觉 lj 阅读全文
摘要:
jisoo 简单的二分 #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; int n,m; struct po{ int x; 阅读全文
摘要:
jisoo 可以证明,一定只需要考虑需要翻转的边 如果一种合法方案,需要翻转不需要翻转的边,那么就必然有一个过程是把这条边翻转过来, 那么这一条边有两种可能,要不它连着偶数个由需要翻转的边组成的环,要不是有许多同样的此类不翻转边组成的环 对于以上两种可能,可以发现都会出现需要翻转的边连成环的可能。 阅读全文
摘要:
jisoo 这是一个拓扑排序,对于一条路线,中间没有走过的节点,一定等级低于路线上经过的节点 然后就可以了 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #defin 阅读全文
摘要:
Jisoo 首先呢,可以知道,每个数都要去它右边第一个空位置 然后对于$a_i,a_j$,假如$b_i,b_j$是空位的话,那么无论$a_i,a_j$谁去哪里,总距离不变 那么显然让每一个数去它右边的第一空是最有的(拉开距离差距) 然后按照距离分配b #include<iostream> #incl 阅读全文
摘要:
Jisoo $dp_i$表示节点i为头的最长毛毛虫 (我这里i的父节点呗算作腿的一条) 然后就可以不用特判地进行转移 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define int long 阅读全文
摘要:
Jisoo 这种背包是不是把一维扔进状态就都能做了啊 $dp_{i,j}$表示到了第i个任务的时候A机器工作了j时间,转移显然 有点卡时间,注意常数优化 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> 阅读全文
摘要:
Jisoo 显然找硬币和付钱是两个过程 然而最多给多少钱呢 有应该找最多多多少呢? 方案一 时间绰绰有余,我们开的大一点 证明 找钱的数量不会超过$V_{max}^2$ #include<iostream> #include<cstdio> #include<algorithm> #include< 阅读全文
摘要:
jennie 怎样处理呢 $O(n^2)$肯定不行 不如,二进制拆分一下 这样$do_i$表示第i位为1的最长长度 对于每一个数,如果他的某一个二进制位为1,那么他可以从之前这一位为1的状态转移过来,然后转移这一位为1的状态 #include<iostream> #include<cstdio> # 阅读全文
摘要:
Lisa 情商和智商和,这不就是个背包 怎样保证大于零呢,我们吧一个商作为维度存进去,另外一个商就是我们转移的值了 然后,直接背包 最后检查所有大于零的部分,统计就可以了 \(dp_i=max(dp_i,dp_{i-s[i]+f_i})\) 注意一下负数要反着转移 然后就可以了 #include<i 阅读全文
摘要:
Jennie 一个比较水的动态规划 \(dp[i][j]=max(dp[i][j],dp[i-1][k])+a_i*j\quad k\in [j-1,j-1+s]\) 然后这个玩意可以用有限队列 #include<iostream> #include<cstdio> #include<algorit 阅读全文
摘要:
Jennie 很简单的东西 分左右端点讨论 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; int n; int l[20005],r[20005]; int dp[ 阅读全文
摘要:
Lisa 这个题其实很水 \[ dp_{ij}=max(dp_{i-1,j-1}+a_{i,j},dp_{i-1,j}) \] 这是什么意思呢,到第i行放j盆花,可能上一个花瓶放的是j-1种花,也可能上一个花瓶(或更久)已经有j-1种花了 #include<iostream> #include<cs 阅读全文
摘要:
Lisa 去年考的这东西 今年写写解析 T3 为什么是位,当然就是说一个比特啦 然后×起来就可以了 T15背过呗 然后没啥好说的了 阅读程序 T1 1 1000是必挂好不好 2 如果是个常数列呢 3 没错,例如递增序列和递减序列 4 当然,因为这个i和j互换也是会出现的 5 128的二进制全是1,那 阅读全文
摘要:
初赛胡扯 也就是写写我都见过什么 主定理:个人理解删减版 对于$T(n)=aT(\frac{n}{b})+f(n)$如果$n^{log_b{a}}>f(n)$,那么$t(N)=o(N^{log_ba})$ 如果相等,那么$T(n)=O(n^{log_ba}logn)$ 如果小于,那么$T(n)=O( 阅读全文
摘要:
Lisa 这个序列只需要考虑最大值和次大值的数量 如果最大值数量大于1,那么所有排列都可以,输出全排列 如果最大值为1且不等于次大值加1,那么不可能存在 如果最大值为1且等于次大值加1,那么只要最大值后面有至少一个次大值就可行 然后就是组合数学算一算 #include<iostream> #incl 阅读全文
摘要:
jisoo 从只有几个棋子开始考虑 只有一个的话先手必胜 只有两个的话先手如果动前一个棋子,那么后手一定也可以动 那么先手唯一的方案就是动后面的棋子 这样的话如果有三个,先手动中间的那一个是没有意义的,后手一定可以动最后于一个 如果先手动第一个,后手动中间的也是没有意义的,那么后手要不动第一个要不动 阅读全文