SEERC 2018 I - Inversion (Gym - 101964I) DP】的更多相关文章

Gym - 101964I 题意 有一个数组\(p\),如果满足\(i<j,p_i>p_j\),则\(i,j\)之间就有一条边相连,问存在多少个集合满足集合内的元素互不相连,且集合外的元素都有边连到集合内. 思路 现在给你\(p\)数组相连的边, 然后就可以暴力还原\(p\)数组,可以先记录有当前\(i\)位置之小于\(i\)位置的数字的数数量\(k\),然后从小到大找能用的第\(k\)大的数字就是位置\(i\)的数字 还原完\(p\)数组,我们可以发现如果你的子序列是上升序列,那么它们直接互…
layout: post title: 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2018) author: "luowentaoaa" catalog: true tags: mathjax: true - codeforces B.Broken Watch 题解 先不考虑长度 长度不会影响会不会过中心. 如果长度相同 \(C_{n}^{3}\) 再减去不符合的再同一侧的.…
luoguP4383 [八省联考2018]林克卡特树(树上dp,wqs二分) Luogu 题解时间 $ k $ 条边权为 $ 0 $ 的边. 是的,边权为零. 转化成选正好 $ k+1 $ 条链. $ k \le 100 $ 的部分. 毫无疑问是树上打背包dp. 但具体设计还要注意一下. 一个问题是单点成链,这个要特判. 之后由于选择的都是链,所以每个点的度数不会超过2. 这样方程就出来了. $ k \le n $ 的部分. 很明显不能背包了. 但"选正好k个求最大权值和"这个要求如果…
题意: 如果p数组中 下标i<j且pi>pj 那么点i j之间存在一条边 现在已经知道边,然后求p数组 在一张图中,求有多少个点集,使得这个点集里面的任意两点没有边 不在点集里面的点至少有一条边连向点集中一点 思路: 我们考虑一条边 (i,j)那么定义在一个序列中(i,j)为一个逆序对(i,j)那么定义在一个序列中(i,j)为一个逆序对 那么就是找上升子序列的个数 #include<bits/stdc++.h> using namespace std; ; typedef long…
题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变成 \(\displaystyle \lfloor \frac{N}{k} \rfloor\) ,到 \(1\) 停止. 求一共有多少不同的操作序列,也就是操作次数不一样或者某次操作的 \(k\) 不相同. 题解 首先考虑 dp ,令 \(f_i\) 为以 \(i\) 为开头的不同操作序列数. 显然…
题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 , 考虑了并且在独立集中 , 还没考虑 . 转移就很显然了 qwq 然后要优化嘛 , 把其中两个状态合起来 , 也就是分成考虑了和没考虑了的两种 . 其中考虑了的那种 , 只会存在两种状态 , 要么是在独立集内 , 要么就是与独立集联通 , 没有考虑的 绝对不和独立集联通 就行了 . 然后我们枚举…
题目:https://loj.ac/problem/2473 https://www.luogu.org/problemnew/show/P4365 参考:https://blog.csdn.net/xyz32768/article/details/82952313 https://zhang-rq.github.io/2018/05/04/%E4%B9%9D%E7%9C%81%E8%81%94%E8%80%832018-%E7%A7%98%E5%AF%86%E8%A2%AD%E5%87%BBC…
A. Numbers Unsolved. B. Broken Watch Solved. 题意: 一个圆盘上,有等分的n块区域,有三根指针,当三根指针分别位于两块区域的交界处时 指针的三点相连会形成一个三角形,求有多少个三角包含三指针的起点(即交汇处) 思路: #include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; typedef long long ll; ll A, B, C, n; int…
题目链接:https://codeforc.es/gym/101933/problem/A 题意:有 n 只青蛙在一个坑里面,要求可以跳出坑的青蛙的最大数量.每个青蛙有 3 种属性:l 为青蛙一次可以跳的高度,w 为青蛙的重量,h 为青蛙作为垫背时的高度,垫背的前提是垫背的青蛙的重量比在他上面的青蛙的总重量要小. 题解:首先将青蛙按重量排序,dp[j]表示在已经垫背的青蛙上面还可以放一个重量  < j 的青蛙时的垫背最大高度,更新的时候,因为重量从大到小排序,dp[j] 由 dp[j + a[i…
题意 https://loj.ac/problem/2713 思路 对于 \(\text{P1}\) 的档,首先可以看出 \(O(n^3)\) 的方法,即用 \(O(n^3)\) 的 \(\text{DP}\) 判断合法性以及记录路径.具体是这样的,因为括号匹配可以用一个弹栈的模型去表示(前括号入,后括号弹),用一个整数就可以表示当前的匹配状态,所以用 \(dp_{i,j,k}\) 表示第 \(i\) 个括号,忽视蓝色括号栈中有 \(j\) 个前括号,忽视红色括号栈中有 \(k\) 个前括号.则…
j题目链接: http://codeforces.com/contest/913/problem/E 题意: 给你x,y,z三个变量,与&   或|  非!  括号()   四种运算符,规定括号和非优先级最高,其次与&,最后或|. 对于输入的真值表,输出最小字典序的逻辑表达式 挺难想的.关键点在于怎么定义状态并利用已有状态更新出新状态,并处理优先级问题. 状态转移: 对于两个表达式A1,A2及其真值表T1,T2,若没有优先级的问题,A1&A2的真值表为T1&T2,A1|A2…
Dp 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 一块土地有 n 个连续的部分,用 H[1],H[2],-,H[n] 表示每个部分的最初高度.有 n 种泥土可用,他们都能覆盖连续的 k 个部分,第 i 种泥土的价格为 C[i],可以使 i,i+1,-,i+k-1 部分的高度增加 E[i](如果 i+k>n,那就覆盖 i,-,n ),我们必须满足以下条件: 1.每种泥土只能使用一次. 2.成本必须小于等于 m . 要求在上述条件下,使得最低的部分的高度尽量高,请求出这个高度.…
题目链接:https://vjudge.net/contest/273260#problem/C 学习了一下别人的思路,首先去重,然后离散化. dp数组开二维,每一次更新,状态转移方程,dp[ i ][ j ] = (dp[ i-1] [ j ]+dp[ i-1] [ j -1 ]*(ans[ i ]))%mod; 第i种商品第j种(j<=k)的时候,等于第i-1个商品第j种的总方法数加上第i-1个的第j-1个乘以ans[i],ans数组记录的是这种商品当前有多少种. AC代码: #includ…
题目描述 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一个叫做“LCT” 的挑战,它的规则是这样子的:现在有一个N 个点的 树(Tree),每条边有一个整数边权vi ,若vi >= 0,表示走这条边会获得vi 的收益:若vi < 0 ,则表示走这条边需要支付- vi 的过路费.小L 需要控制主角Link 切掉(Cut)树上的 恰好K 条边,然后再连接 K 条边权为 0 的边…
和51nod1055 一样: #include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include&l…
2018. The Debut Album Time limit: 2.0 secondMemory limit: 64 MB Pop-group “Pink elephant” entered on recording their debut album. In fact they have only two songs: “My love” and “I miss you”, but each of them has a large number of remixes. The produc…
题意大概是说在一维数轴上起点和终点的距离是d,现在我们要从起点走到终点.每走一个单位长度消耗一个单位能量,初始时有K单位能量.同时在起点和终点之间分布一些加油站a1,a2,...an,给你加油站数量.位置以及每个加油站储油量,问你要走到终点,至少需要停在几个加油站加油. 类似于http://www.cnblogs.com/wangyiming/p/7193446.html这道题,直接用dp求解“到达一定距离至少停下来几次”的原问题并不方便,于是转换思路,采用一种“对偶”的方式求解“停下来固定次数…
给定一个由N个顶点构成的多边形,每个顶点被赋予一个整数值,而每条边则被赋予一个符号:+(加法运算)或者*(乘法运算),所有边依次用整数1到N标识. 一个多边形的图形表示 首次移动,允许将某条边删除: 接下来的每次顺序移动包括下面步骤: 1.选出一条边E,以及由E联接的顶点V1和V2: 2.用一个新的顶点,取代边E及其所联接的两个顶点V1和V2.新顶点要赋予新的值,这个值是对V1和V2,做由E所指定的运算,所得到的结果. 所有边都被删除后,只剩下一个顶点,游戏结束.游戏的得分就是该顶点的数值. 任…
Problem E: Wooden Signs \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 给出一个\(n\),接下来\(n+1\)个数,前两个数表示最底下那层木板的左右边界,接下来\(n-1\)个数,每个数表示第\(i-1\)层那块木板的结束位置,开始位置要在上一层的边界上,并且这块木板必须和上一层的木板有重叠.问你一共有多少种摆放方法. 其实题中所说的箭头没有什么用 思路 令\(dp[i][j][k]\)表示第\(i\)层的木板边…
UOJ 思路 (以下思路是口胡,但正确性大概没有问题.) 刚学min_25筛的时候被麦老大劝来做这题? 结果发现这题是个垃圾二合一?? 简单推一下式子可以得到答案就是这个: \[ \sum_{T=1}^m (f*\mu)(T)\sum_{\{a_i\le m/T \}} \prod_i [a_{x_i}\le a_{y_i}] \] 其中\(f(n)=(\sigma_0(n^3))^3\). 通过手玩可以得到\((f*\mu)(p^c)=81c^2-27c+9,c\ne 0\),于是可以min_…
题目链接:http://codeforces.com/gym/101964/problem/B 题意:q 种操作,①在(x,y)处加一个点,②加一个矩阵{(x1,y1),(x2,y2)},问每次操作后点在矩阵中或矩阵边界上的对数有多少. 题解:裸的CDQ分治,考虑对点和矩阵分别进行CDQ分治,因为x,y <= 1e9,要将其中一个坐标离散化.要注意先加点和先加矩阵的两种情况下,矩阵的差分边界是不同的. #include <bits/stdc++.h> using namespace st…
https://vjudge.net/contest/299302#problem/E 题意:给出一个01 0101串,然后能量计算是连续的1就按1, 2, 3的能量加起来.然后给出起始的能量,求最少减掉几个一是起始的能量不被消耗完. 思路:不能用贪心,比如11111,按理说拿一个最好是中间分开,但是那两次的这种情况下应该是要把第二个和第四个拿掉来最小 所以要用记忆化搜索或dp: 记忆化搜索 #include<bits/stdc++.h> using namespace std; ; ; in…
LINK:林克卡特树 作为树形dp 这道题已经属于不容易的级别了. 套上了Wqs二分 (反而更简单了 大雾 容易想到还是对树进行联通情况的dp 然后最后结果总和为各个联通块内的直径. \(f_{i,j}\)表示以i为根的子树内有j条边被删掉 可以发现这个状态难以转移. 需要换个状态 一个比较经典的做法是套用树的直径的那套来做 每个点向上传递单条链或者什么都不传来转移. 传递单条链可以在父亲的那个地方合成一条 然后钦定此条为以x为根的联通内的最大值 那么就可以从x所在父亲的那条边切断了. 或者 传…
分析: 这一题给出的遍历的点的序列,不是树的中序遍历,前序遍历,只要遇到一个节点就打印一个节点.关键点就在,这个序列的首字母和尾字母一定要相同,因为最终都会回到根节点,那么每一个子树也一样. 状态: d[i][j]表示i至j的状态数 d[i][j]= d[i][j]=(d[i][j]+dp(i,k)*dp(k+1,j-1)%mod)%mod; #include <bits/stdc++.h> using namespace std; typedef long long ll; const in…
传送门 注意到一种颜色改了之后就不能改回去了. 因此可以启发式合并. 每次把小的合并给大的. 这样每个数最多被合并logloglog次. 如果维护一棵比较下标的平衡树的话,对于答案有贡献的就是每个数与前驱和后继的差值. 于是就用setsetset实现啦. 代码: #include<bits/stdc++.h> #define N 100005 using namespace std; inline int read(){ int ans=0; char ch=getchar(); while(…
题意: 如题 思路: 递推的思想,牛只能在第4年才能开始生小牛,对于 第n年有多少牛 = n-1年的牛数量 + 新出生的牛的数量 新出生的牛的数量 = 已经出生满4年的牛的数量 = n-3年时候牛的数量 代码: #include<iostream> using namespace std; const int maxn = 70; int a[maxn]; void init() { a[1] = 1; a[2] = 2; a[3] = 3; a[4] = 4; for (int i = 5;…
LINK:CountTables 神题! 首先单独考虑行不同的情况 设\(f_i\)表示此时有i列且 行都不同. 那么显然有 \(f_i=(c^i)^\underline{n}\) 考虑设\(g_i\)表示此时有i列且 行列都不同. 考虑将\(g_i\)和\(f_i\)联系起来. 那么对于 \(f_m\) 考虑其有k列是本质不同的 那么有m-k列重复出现的 考虑把这m-k列给缩起来就变成了 n行k列 且行列都不同的矩阵了. 而且可以发现对于n行k列 且行列都不同的矩阵和有k列本质不同且不讲究分配…
我们不难发现,假设抽了x张攻击牌,y张强化牌,那么肯定是打出尽可能多张的强化牌后,再开始出攻击牌(当然最少要一张攻击牌) 我们设G(i,j)表示:所有(抽到的攻击牌牌数为i,打出的攻击牌牌数为j)的方案,所产生的攻击值的总和 形式化地说:​$G(i,j)=\sum\limits_{S∈攻击牌\and|S|=i}S中前j大的牌的攻击值之和$ 考虑到G(i,j)难以一次求出,我们考虑设置一些中间变量 设g[i][j]表示:我们对攻击牌从小大大进行排序,目前选了i张牌,其中最小的牌是第j张的总贡献,其…
Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bits/stdc++.h> using namespace std; #define X first #define Y second typedef long long ll; typedef pair<int,int> P; ,INF=<<; int n,dat[MAXN],dp…
题目很水.睡过了迟到了一个小时,到达战场一看,俩队友AC五个了.. 就只贴我补的几个吧. B - Breaking Biscuits Gym - 101606B 旋转卡壳模板题.然后敲错了. 代码是另一种做法:对于每条边,枚举两边的所有点到直线的距离,分别取最大值,然后加起来. #include <bits/stdc++.h> #define FOPI freopen("in.txt", "r", stdin); #define FOPO freopen…