B 题解————2019.10.16
相信他说的话,但不要当真
【题目描述】
有一个长度为 n 的自然数序列 a,要求将这个序列恰好分成至少 m 个连续子
段。 每个子段的价值为该子段的所有数的按位异或。要使所有子段的价值按位与
的结果最大,输出这个最大值。
【输入描述】
第一行一个正整数 q,表示询问组数。
接下来 q 组输入,每组输入两行:
第一行两个正整数 n,m。
第二行 n 个正整数,描述序列 a。
【输出描述】
一行一个正整数,表示答案。
【输入样例】
1
5 3
1 2 3 4 5
【输出样例】
1
【数据范围】
20%的数据:n<=20
40%的数据:n<=100,ai<256
60%的数据:n<=100
100%的数据:1<=q<=12,1<=m<=n<=1000,0<=ai<2^30
题意:
q组数据。
给你一个长为n的非负数序列a。
定义一个区间的权值为区间的异或和。
定义一个划分的权值为分出的区间的权值的按位与的值。
要求至少把序列分成m个非空字段,求满足条件的划分的最大权值。
题解:
因为异或运算具有交换律且(x异或x = 0),所以区间异或和可以由两个前缀异或和异或得到。
考虑从高位到低位确定答案的二进制位,然后考虑判断是否能分成至少m段。
如何判断是否能分成至少m段?
"能分成至少m段"与"最多能分成的段数>=m"等价。
令dp[i] = "a[1..i]这一段数最多能分成多少段"
转移就是直接枚举上一段的末尾j,如果[j+1,i]可以组成一段,那么就把dp[i] = max(dp[i],dp[j] + 1);
这样DP的复杂度是O(n^2)。
总复杂度就是O(q * log(值域) * DP) = O(30qn^2) ≈ 3.6 * 10^8,因为常数较小可以过。
值得一提的是,直接O(N^3)DP是错误的。因为它不满足最优子结构。
代码:
#include<bits/stdc++.h>
using namespace std; typedef long long LL; int q,n,m,ans,x,s[],f[]; int rd(){
int re=,f=;char c=getchar();
while ((c<'')||(c>'')) {if (c=='-') f=-f;c=getchar();}
while ((c>='')&&(c<='')) {re=re*+c-'';c=getchar();}
return re*f;
} int Max(int x,int y){
return ((x>y)?x:y);
} int main(){
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
q=rd();
for (;q>;--q){
n=rd();m=rd();
s[]=;
for (int i=;i<=n;++i){
x=rd();s[i]=s[i-]^x;
} ans=;
for (int i=;i>=;--i){
memset(f,,sizeof(f));
f[]=;
for (int j=;j<=n;++j){
for (int k=;k<j;++k) if (f[k]>){
x=s[j]^s[k];
if (((ans&x)>=ans)&&((x&(<<i))>))
f[j]=Max(f[k]+,f[j]);
}
}
if (f[n]>m) ans|=(<<i);
} cout<<ans<<'\n';
}
return ;
}
B 题解————2019.10.16的更多相关文章
- A 题解————2019.10.16
[题目描述] 对于给定的一个正整数n, 判断n是否能分成若干个正整数之和 (可以重复) ,其中每个正整数都能表示成两个质数乘积. [输入描述]第一行一个正整数 q,表示询问组数.接下来 q 行,每行一 ...
- C 题解———2019.10.16
现在很痛苦,等过阵子回头看看,会发现其实那都不算事. [题目描述]定义一个排列 a 的价值为满足|a[i]-i|<=1 的 i 的数量.给出三个正整数 n,m,p,求出长度为 n 且价值恰好为 ...
- 2019.10.16&17小结
话说也蛮久没写小结了,主要这两次考试失分严重,还是总结下吧. 10.16 T1 小奇挖矿2 100/0 [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市 ...
- @CSP模拟2019.10.16 - T3@ 垃圾分类
目录 @description@ @solution@ @accepted code@ @details@ @description@ 为了保护环境,p6pou建设了一个垃圾分类器. 垃圾分类器是一个 ...
- js第二次作业——2019.10.16
第一题:完成省城市的三级联动(包括湖南省),附代码和效果图. 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 </head> ...
- Fiborial 题解——2019.10.14
一看到这个题 就感觉...cao,, 什么东西...??! 然后就开始暴力求Fn 然鹅我并不会写高精(我太菜了) 只能求到大概10左右 在吧Fn给质因数分解 求出其因子个数 妄图找到什么有关的规律 但 ...
- 忍者钩爪 ( ninja) 题解———2019.10.19
可以到这里测..嘿嘿嘿 题目: [问题 描述 ] 小 Q 是一名酷爱钩爪的忍者, 最喜欢飞檐走壁的感觉, 有一天小 Q 发现一个练习使用钩 爪的好地方,决定在这里大显身手. 场景的天花板可以被描述为一 ...
- T1 :最小值(min)题解 ——2019.10.15
思路: 对于 % 30 的数据,可以想到一个 Dp 方程: 其中dp[i]表示分割[1,i]的最大答案 代码: #include<cstdio> #include<cstring&g ...
- 背水一战 Windows 10 (16) - 动画: ThemeAnimation(主题动画)
[源码下载] 背水一战 Windows 10 (16) - 动画: ThemeAnimation(主题动画) 作者:webabcd 介绍背水一战 Windows 10 之 动画 PopInThemeA ...
随机推荐
- 《Interest Rate Risk Modeling》阅读笔记——第一章:利率风险建模概览
目录 第一章:利率风险建模概览 思维导图 一些想法 第一章:利率风险建模概览 思维导图 一些想法 久期向量模型类似于研究组合收益的高阶矩. 久期向量模型用的是一般多项式表达高阶久期,试试正交多项式? ...
- SQL ------------ avg() 与 sum 函数
AVG() 函数返回数字列的平均值 注意是数字的平均数, 语法: select avg(字段) from 表名 建个表,弄点数据 使用 select avg(字段) as 平均数 from 表名 与w ...
- 小记:iterator && auto
小记:iterator && auto iterator 众所周知,我们有一种强大的东西,它叫做STL,比如queue.vector.set.map.multimap .deque等. ...
- 基于word2vec的文档向量模型的应用
基于word2vec的文档向量模型的应用 word2vec的原理以及训练过程具体细节就不介绍了,推荐两篇文档:<word2vec parameter learning explained> ...
- 搭建RocketMQ集群
一.环境及准备 集群环境: 软件版本: 部署前操作: 关闭防火墙,关闭selinux(生产环境按需关闭或打开) 同步服务器时间,选择公网ntpd服务器或者自建ntpd服务器 [root@es1 ~]# ...
- dotnet验证参数
组长提了一个需求,前端传递过来参数的时候,我们要验证一下参数是否都传递过来了,所以我专门写了一个验证工具类,调用就好了. 第一个参数为 前端传递到Controller封装的实体类,第二个参数为这个实体 ...
- WPF 精修篇 倾斜 SkewTransform
原文:WPF 精修篇 倾斜 SkewTransform 倾斜 SkewTransform AngleX 倾斜X角度 AngleY 倾斜Y角度 CenterX CenterY 中心点 <Stack ...
- springboot的pom.xml配置
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...
- 如何让SQL语句不执行默认排序,而是按照in语句的顺序返回结果
Oracle: ')order by instr('111,222,333,444,555,666',order_id); Mysql: ') order by instr(',111,222,333 ...
- 使用Vue CLI构建Vue项目
第一步:首先在控制台输入vue --version,如果出现版本号则进入第三步:否则进入第二步: 第二步:输入npm install cnpm -g --registry=https://regist ...