codeforces 425C
题意:给定长度为n,m<=100000的范围在100000以内的数组a,b。
现在给定两种操作:
第一种是ai,bj相等,ai,bj之前的数全删掉,费用为e,收益为1
第二种是把剩下的全部删掉,花费为之前删除的数的个数,并且得到的之前的收益(也就是必须这一步,不然1的收益都无效)
思路:刚开始看错题意了。。以为第二种操作花费为剩下的个数。。
然后多写了一段。。。还wa了。。虽然思路差不多。。
那么题目等价与a,b数组中找到最多的不相交线段。。
但是单纯这样还是要跪。。注意到s/e<=300,那么就可以二维dp
f[i][j]表示做到a[i],有j对不相交线段的最近额b数组出现在什么位置。。
那么做法就很像不下降子序列nlogn版本的做法了。。
具体看代码吧。。
code:
#include <bits/stdc++.h>
using namespace std;
#define vii vector<int>::iterator
#define M0(a) memset(a, 0, sizeof(a))
#define repf(i, a, b) for (int i = (a); i <= (b); ++i)
int a[], b[], n, m, s, e;
int f[];
vector<int> p[]; void init(){
repf(i, , n) scanf("%d", &a[i]);
repf(i, , m) scanf("%d", &b[i]);
for (int i = ; i <= ; ++i) p[i].clear();
repf(i, , m) p[b[i]].push_back(i);
} void solve(){
int t = s / e;
// cout << t << endl;
for (int i = ; i <= t; ++i) f[i] = m+;
f[] = ;
int ans = ;
for (int i = ; i < n; ++i){
for (int j = t; j >= ; --j) if (f[j] <= m){
vii it = upper_bound(p[a[i+]].begin(), p[a[i+]].end(), f[j]);
if (it != p[a[i+]].end()) f[j+] = min(f[j+], *it);
}
for (int j = ; j <= t; ++j) if (f[j] <= m)
if (j * e + f[j] + i + <= s) ans = max(ans, j);
}
cout << ans << endl;
} int main(){
// freopen("a.in", "r", stdin);
while (scanf("%d%d%d%d", &n, &m, &s, &e) != EOF){
init();
solve();
}
}
codeforces 425C的更多相关文章
- codeforces 425C Sereja and Two Sequences(DP)
题意读了好久才读懂....不知道怎么翻译好~~请自便~~~ http://codeforces.com/problemset/problem/425/C 看懂之后纠结好久...不会做...仍然是看题解 ...
- Sereja and Two Sequences CodeForces - 425C (dp)
大意: 给定序列$a,b$, 每次可以任取两个相同大小的$a_i,b_j$删除$a_i,b_j$左侧所有元素, 花费为e, 得分1, 最后结束时必须再花费之前删除元素的个数, 不得分. 初始能量$s$ ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
随机推荐
- python中的装饰器
一.什么是装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能 ...
- Java介绍(重要特点)
Java语言平台版本 JavaSE标准版本,是JavaME 和Java EE的基础,能够开放基本桌面程序. JavaME 一句话,安卓开发. JavaEE 一句话,网页开发. Java重要特性(跨平台 ...
- Form文件夹开发步骤
1.开发完一个Form,测试OK 1.添加Object Groups 操作如下:在同一窗口打开标准的Form APPSTAND.FMB 和我们自己客制的Form,并且选择APPSTAND.FMB的Ob ...
- DataAdapter与DataSet的使用
1.创建数据库连接: 2.创建数据适配器(Adapter); 3.创建容器数据集(DataSet); 4.从数据集中取出指定表: 5.遍历表数据并输出: using System; using Sys ...
- 【转】详解Oracle的dual表
网址:http://www.adp-gmbh.ch/ora/misc/dual.html dual is a table which is created by oracle along with t ...
- GBDT基本理论及利用GBDT组合特征的具体方法(收集的资料)
最近两天在学习GBDT,看了一些资料,了解到GBDT由很多回归树构成,每一棵新回归树都是建立在上一棵回归树的损失函数梯度降低的方向. 以下为自己的理解,以及收集到的觉着特别好的学习资料. 1.GBDT ...
- NO.2
虚拟语气的终结版.英语语法的终结时刻.迎接新的英语挑战!!!
- MySQL大数据分页的优化思路和索引延迟关联
之前上次在部门的分享会上,听了关于MySQL大数据的分页,即怎样使用limit offset,N来进行大数据的分页,现在做一个记录: 首先我们知道,limit offset,N的时候,MySQL的查询 ...
- singleton(单件)-对象创建型模式
1.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2.动机 对一些类来说,只有一个实例是很重要的.让类自身负责保存它唯一的实例,这个类可以保证没有其他实例可以被创建(通过截取创建新对象 ...
- JDBC第一天
(一)JDBC访问数据库的工作过程: <1>加载驱动,建立连接 oracle数据库:在项目中导入ojdbc.jar包 数据库驱动路径:String driver ...