题目背景

圣乔治:不用拘泥,剩下的时间已不多……

圣乔治:直呼我的真名——

丝佩碧雅:圣乔治大人

圣乔治:如今,已无法维持结界,或是抑制深渊的前进

圣乔治:既然如此,我将献上这副身躯,期望最后的战斗

圣乔治:已经——应该没有再和我多需说明的话语了

圣乔治:我也明白,我和其他4人都一样,是没有内在的傀儡——只不过是曾经存在的幻影罢了……

圣乔治:我本就是,身体被禁忌之龙的诅咒吞噬殆尽,几乎半生不死的状态……

圣乔治:曾经那个被称作虹之圣乔治的男人已经死了

圣乔治:我除了消灭虚无的碎片,消灭那个魔女以外,已别无他望……

丝佩碧雅:我曾经爱过你,圣乔治大人——

美玲:快走,她由我来挡住!

美玲:你们快去打倒虹之圣乔治和莉泽洛特!

我的脊髓与头被一分为二——

跌入黑暗的那一刹那——

我,呼唤着,他的名字——

圣乔治……大人……

为了朋友和明天——

我们是同伴……我这样相信着

因为是同伴……所以相信你……

题目描述

吊打集训队的zcy

给你出了一道题:

给你一个长为n的序列v,你可以从里面选出最多m个数

有一个数a,以及b个规则,每个规则即为:

对于这个序列的所有长为a的连续子区间,

如果这个子区间中对应的给出的x个位置都被选中了,

则这次选择的分数加上y(y可能为负数,这种情况下分数仍然要加上y)

输入输出格式

输入格式:

第一行四个数n,m,a,b

之后一行n个数表示序列v

之后输入b个规则

每个规则先输入两个数x和y,x != 0

之后一行x个数,分别表示这给定的x个位置

输出格式:

一行一个数表示最大可能得到的分数

输入输出样例

输入样例#1:

5 3 3 1
2 3 3 3 3
2 233
1 3
输出样例#1:

474
输入样例#2:

5 3 3 1
111 222 333 444 555
2 52
1 3
输出样例#2:

1384
输入样例#3:

6 3 3 2
1 2 3 3 4 1
2 1
1 2
2 2
2 3
输出样例#3:

16

说明

样例#4,#5,#6见下发的文件

【子任务】

子任务会给出部分测试数据的特点。

如果你在解决题目中遇到了困难, 可以尝试只解决一部分测试数据。

每个测试点的数据规模及特点如下表:

测试点编号 n的范围   m的范围   a的范围   b的范围
测试点1 n <= 20 m <= 20 a <= 10 b <= 5
测试点2 n <= 20 m <= 20 a <= 10 b <= 5
测试点3 n <= 40 m <= 40 a <= 10 b <= 100000
测试点4 n <= 40 m <= 40 a <= 10 b <= 100000
测试点5 n <= 100 m <= 50 a <= 10 b = 0
测试点6 n <= 100 m <= 50 a <= 10 b = 0
测试点7 n <= 100 m <= 50 a <= 10 b <= 100000
测试点8 n <= 100 m <= 50 a <= 10 b <= 100000
测试点9 n <= 100 m <= 50 a <= 16 b <= 100000
测试点10 n <= 100 m <= 50 a <= 16 b <= 100000

对于100%的数据,n <= 100 , m <= 50 ,a <= 16 , b <= 100000 , 序列中每个值以及每条规则带来的加分的绝对值 <= 100

【说明】

【样例1说明】

【样例2说明】

【样例3说明】

分析:一开始想着贪心,但是贪不出来.仔细观察题目就会发现,这其实就是状压dp.因为a <= 16,我们可以状压a.先预处理出每个状态的贡献值.设f[i][j][k]为前i个数中选了j个末尾a个的状态为k的分数,枚举i-1位置上末尾a个的状态s,那么当前如果不考虑第i位的状态t就是(s << 1) & ((1 << a) - 1).如果第i位不选,那么f[i][j][t] = max{f[i][j][t],f[i - 1][j][s] + p[t]},p是预处理出的每个状态的贡献值,如果第i位要选,那么f[i][j][t | 1] = max{f[i][j][t | 1],f[i-1][j-1][s] + v[i] + p[t | 1]}

因为i是从i-1转移过来的,所以可以用滚动数组优化一下.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n, m, a, b, v[], c[( << ) + ], p[( << ) + ];
int f[][( << ) + ], now, last, ans, g[][( << ) + ]; int main()
{
scanf("%d%d%d%d", &n, &m, &a, &b);
for (int i = ; i <= n; i++)
scanf("%d", &v[i]);
for (int i = ; i <= b; i++)
{
int x, y, stu = ;
scanf("%d%d", &x, &y);
while (x--)
{
int t;
scanf("%d", &t);
stu |= << (a - t);
}
c[stu] += y;
}
for (int i = ; i < ( << a); i++)
for (int j = i; j; j = (j - ) & i)
p[i] += c[j];
memset(f, -0x3f, sizeof(f));
memset(g, -0x3f, sizeof(g));
f[][] = ;
int zhuangtai = ( << a) - ;
for (int i = ; i <= n; i++, swap(f, g), memset(g, -0x3f, sizeof(g)))
for (int j = ; j <= min(m, i); j++)
for (int s = ; s <= zhuangtai; s++)
if (f[j][s] != -)
{
int t = (s << ) & zhuangtai;
g[j][t] = max(g[j][t], f[j][s] + (i >= a ? p[t] : ));
g[j + ][t | ] = max(g[j + ][t | ], f[j][s] + v[i] + (i >= a ? p[t | ] : ));
}
for (int i = ; i <= m; i++)
for (int j = ; j < ( << a); j++)
ans = max(ans, f[i][j]);
printf("%d\n", ans); return ;
}

noip模拟赛 时之终末的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  3. CH Round #48 - Streaming #3 (NOIP模拟赛Day1)

    A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...

  4. 【noip模拟赛5】细菌 状压dp

    [noip模拟赛5]细菌   描述 近期,农场出现了D(1<=D<=15)种细菌.John要从他的 N(1<=N<=1,000)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携 ...

  5. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对   描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们 ...

  6. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  7. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  8. NOIP模拟赛-2018.11.6

    NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...

  9. Nescafe #29 NOIP模拟赛

    Nescafe #29 NOIP模拟赛 不知道这种题发出来算不算侵权...毕竟有的题在$bz$上是权限题,但是在$vijos$似乎又有原题...如果这算是侵权的话请联系我,我会尽快删除,谢谢~ 今天开 ...

随机推荐

  1. astgo常见问题(FAQ)知识库

    Q:为什么我在astgo 的一些列表页面看不到右侧顶端的高级功能菜单?R:因为你没有先选择代理商,这些操作都是针对于某个代理商才可以操作的! Q:为什么我无法给astgo 的代理商充值?R:因为你登录 ...

  2. php验证手机号是否合法

    用正则匹配手机号码的时候, 我们先分析一下手机号码的规律: 1. 手机号通常是11位的 2. 经常是1开头 3. 第二个数字通常是34578这几个数字, 2014.5.5日170号段的手机号开卖所以这 ...

  3. 9.2NOIP模拟题

    9.2 NOIP模拟 题目名称 “与” 小象涂色 行动!行动! 输入文件 and.in elephant.in move.in 输出文件 and.out elephant.in move.in 时间限 ...

  4. Windows(7/8/10)搭建Elasticsearch 6.x版本

    今天公司用到了Elasticsearch ,记录一下单机版搭建的流程. 首先我们来看下什么是Elasticsearch : ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分 ...

  5. Kafka详解与总结(四)

    Kafka消息分发和消费者push.pull机制 1. 消息分发 Producer客户端负责消息的分发 kafka集群中的任何一个broker都可以向producer提供metadata信息,这些me ...

  6. 关于static函数在类中的定义和使用

    刷题的时候遇到了这样一个问题:平时经常使用 sort()函数, 对结构体进行排序, 但是在类中使用时会出现 这样的错误提示:“Solution::cmp”: 函数调用缺少参数列表:请使用“&S ...

  7. 【转】Linux下变量内容删除与替换

    转自:http://www.linuxidc.com/Linux/2015-01/111781.htm 当一个变量被赋予值后,有时会对变量的值进行一些微小的调整,比如删除变量值中特定一部份,或替换掉一 ...

  8. Hadoop Hive概念学习系列之hive里的桶(十一)

    不多说,直接上干货!  Hive还可以把表或分区,组织成桶.将表或分区组织成桶有以下几个目的: 第一个目的是为看取样更高效,因为在处理大规模的数据集时,在开发.测试阶段将所有的数据全部处理一遍可能不太 ...

  9. [ NOIP 2002 ] TG

    \(\\\) \(\#A\) 均分纸牌 有\(N\)堆纸牌,每堆有若干张,但纸牌总数必为\(N\)的倍数.可以在任一堆上取若干张纸牌,然后移动给其左右任意一侧的纸牌堆,求将所有的牌堆牌数都变为平均值最 ...

  10. 怎么用css hack处理各浏览器兼容IE6,IE7,IE8,IE9/ FF

    第一:什么事浏览器兼容性 浏览器兼容性问题又被称为网页兼容性或网站兼容性问题,指网页在各种浏览器上的显示效果可能不一致而产生浏览器和网页间的兼容问题.在网站的设计和制作中,做好浏览器兼容,才能够让网站 ...