Codeforces 1131G(dp)
传送门
与Codeforces1107G一起食用
思路
- 想到要用dp……然后常规地设dp[i]为推倒前i个牌的最小花费
- 有两种情况:一是当前这个推,二是不推而被别人推。对于第一种,需要找到这个左推(因为扫到这里他是最后一个所以不用右推)的最远处,于是有了预处理每一位的最左边;对于第二种,巨弱鲁莽地优先队列搞了,看大佬代码直接单调栈快了我好几倍,菜不成声。
const int maxn = 25e4 + 5, maxm = 1e7 + 5;
int n, m, k[maxn], q, tot, h[maxm], L[maxm], R[maxm];
ll val[maxm], dp[maxm];
vector<int> a[maxn];
vector<ll> c[maxn];
void Read() {
read(n), read(m);
rep(i, 1, n) {
read(k[i]);
rep(j, 1, k[i]) {
int aa;
read(aa);
a[i].push_back(aa);
}
rep(j, 1, k[i]) {
ll cc;
read(cc);
c[i].push_back(cc);
}
}
for (read(q); q; q--) {
int id, mul;
read(id), read(mul);
rep(i, 1, k[id]) {
h[tot + i] = a[id][i - 1];
val[tot + i] = c[id][i - 1] * mul;
}
tot += k[id];
}
}
void Pre() {
stack<pii> st;
rep(i, 1, m) {
int l = max(1, i - h[i] + 1);
while (!st.empty() && st.top().second >= l) st.pop();
if (st.size() && l <= st.top().first) l = st.top().second;
L[i] = l;
st.push({i, L[i]});
}
while (!st.empty()) st.pop();
irep(i, m, 1) {
int r = min(m, i + h[i] - 1);
while (!st.empty() && st.top().second <= r) st.pop();
if (st.size() && r >= st.top().first) r = st.top().second;
R[i] = r;
st.push({i, R[i]});
}
}
ll Dp() {
typedef pair<ll, int> P;
priority_queue<P, vector<P>, greater<P>> Q;
rep(i, 1, m) {
dp[i] = val[i] + dp[L[i] - 1];
while (!Q.empty() && Q.top().second < i) Q.pop();
if (Q.size()) dp[i] = min(dp[i], Q.top().first);
Q.push({dp[i - 1] + val[i], R[i]});
}
return dp[m];
}
int main() {
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
Read();
Pre();
writeln(Dp());
return 0;
}
Codeforces 1131G(dp)的更多相关文章
- Codeforces 1142D(dp)
题目传送 先给出设计dp的结论: dp[i][j]:以第i个位置.以rankj的数拓展出去的方案数.意会一下,我实在想不好语言-- 其中所谓rankj=真·rank%11 找到拓展的规律,转移也就顺理 ...
- Codeforces 1107F(dp)
怎么就没人解释一下为啥用b排序可以保证正确性呢……太菜了,理解了好久. 时间流逝价值会丢失的背包,类似题洛谷1417 本题与洛谷1417不同之处在于流逝是有截止的. 1.这个dp[j]的含义是:最后跑 ...
- Codeforces 1107G(dp)
1.答案要取连续的区间疯狂暗示线段树. 2.外层枚举r,内层枚举l显然过于暴力. 3.考虑内层的优化.dp[i]:以第i位为结尾的答案(长度大于1的).dp[i] = max(第一种情况,第二种情况) ...
- codeforces 682D(DP)
题目链接:http://codeforces.com/contest/682/problem/D 思路:dp[i][j][l][0]表示a串前i和b串前j利用a[i] == b[j]所得到的最长子序列 ...
- codeforces 666A (DP)
题目链接:http://codeforces.com/problemset/problem/666/A 思路:dp[i][0]表示第a[i-1]~a[i]组成的字符串是否可行,dp[i][1]表示第a ...
- Codeforces 1144G(dp)
据说这题是种dp的套路?然后被我国红名神仙(南大Roundgod)贪心了,不过思路上非常相近了,故而可贪吧. 设的dp[i][0]是:如果把第i个数放在上升序列里了,那么下降序列结尾的那个最大是多少: ...
- Codeforces 1152D(dp)
要点 寻找最多边的匹配的结论:贪心地从叶子开始找,最后答案都是奇数层下边的那条边. 设\(dp[i][j]\)表示当前长度为\(i\),平衡度为\(j\),平衡度为(数量减去)数量. 增加左右括号转移 ...
- Three displays CodeForces - 987C (dp)
C. Three displays time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
随机推荐
- Android Weekly Notes Issue #252
Android Weekly Issue #252 April 9th, 2017 Android Weekly Issue #252. 本期内容: 变化的渐变背景实现; Kotlin 1.1特性; ...
- appcompat_v7出现红叉解决方法
右键属性,java build path 勾选Android5.5.2
- system调用命令行命令而不显示命令行窗口
system调用命令行命令而不显示命令行窗口 通常用system调用命令行命令时都会弹出黑底白字的命令行窗口,下面的代码可以不显示弹出的命令行窗口. 代码如下 #pragma comment( lin ...
- 在js里UTF-8与GB2312的互转
js的函数如下: function GB2312UTF8() { this.Dig2Dec = function(s) { var retV = 0; if (s.length == 4) { for ...
- 使用idea导入远程git版本库项目
1.选择git方式导入 2.设置远程git项目地址 3.测试是否连接成功 4.选择yes,检查项目 5.如果有下一步,直接next下去就可以了.
- 乐曲主题Musical Themes
SA例题 题面 对于串 \(S\) 的两个子串 \(A\) 和 \(B\) ,满足 \(k = |A| = |B|\),\(\exists c \forall i\, a_i + c=b_i\),且 ...
- 将linux系统用户导入mysql表
下面这个程序实现的一个很简单的功能,读取passwd文件,将里面的用户信息写入到mysql里面, 具体代码如下: #!/usr/bin/python import pymysql import tim ...
- Tutte矩阵求一般图最大匹配
[集训队2017论文集] 一张无向图的Tutte矩阵为 其中xi,j为一个random的值. Tutte矩阵的秩(一定为偶数)/2 就是这张图的最大匹配. 原理大概就是: 一个图有完美匹配,则det( ...
- nvidia-smi 查看GPU信息字段解读
第一栏的Fan:N/A是风扇转速,从0到100%之间变动,这个速度是计算机期望的风扇转速,实际情况下如果风扇堵转,可能打不到显示的转速.有的设备不会返回转速,因为它不依赖风扇冷却而是通过其他外设保持低 ...
- C++之remove和remove_if
一.Remove()函数 remove(beg,end,const T& value) //移除区间{beg,end)中每一个“与value相等”的元素: remove只是通过迭代器的指针向前 ...