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 ...
随机推荐
- Python课程第六天作业
1.以自己的理解总结为什么会出现循环导入,并用代码举例说明 循环导入报错并不是应为相互之间引用而导致报错,实际上是在导入一个模块时发现引用的模块不存在 示例如下: m1.py from m2 impo ...
- Key ssd_300_vgg/block3_box/L2Normalization/gamma not found in checkpoint的解决方案
在Tensorflow下使用SSD模型训练自己的数据集时,经过查找很多博客资料,已经成功训练出来了自己的模型,但就是在测试自己模型效果的时候,出现了如下错误. 2019-10-27 14:47:12. ...
- Redis(六)管道(Pipelining)
管道技术并不是Redis特有的,管道技术在计算机科学中有很多地方的应用. 来自wiki的解释: In computing, a pipeline, also known as a data pipel ...
- Mybatis系列(一)— 处理冲突字符
在Mybatis的配置文件中编写SQL经常会遇到字符冲突问题 where或者having中使用"<"过滤,Mybatis xml解析器将其当做配置的开始标签处理: " ...
- 【LeetCode】230. Kth Smallest Element in a BST
Difficulty: Medium More:[目录]LeetCode Java实现 Description https://leetcode.com/problems/kth-smallest- ...
- layui 动态表格设置单元格样式
col.push({ field: , templet: function (d) { ") { return '<span style="color:white;backg ...
- 安全漏洞系列(一)---XSS漏洞解决方案(C# MVC)
参考地址:https://www.cnblogs.com/sagecheng/p/9462239.html 测试项目:MVCDemo 一.XSS漏洞定义 XSS攻击全称跨站脚本攻击,它允许恶意web用 ...
- spring容器的功能扩展
容器的扩展功能主要实现为: org.springframework.context.support.AbstractApplicationContext.refresh() public void r ...
- 看一下“Dubbo 2.7”的三大新特性
Dubbo 2.7.x 作为 Apache 的孵化版本,除了代码优化之外,还新增了许多重磅的新特性,本文将会介绍其中最典型的三个新特性: 一.异步化改造 二.三大中心改造 三.服务治理增强 一.异步支 ...
- 安装ceres-solver win10遇到Eigen安装的问题
1.无法打开包括文件: “Eigen/Core”: 去github上下载最新的源码 2. "The Eigen/Array header does no longer exist in E ...