【bzoj5108】[CodePlus2017]可做题 拆位+乱搞
题目描述
给出一个长度为 $m$ 的序列 $a$ ,编号为 $a_1\sim a_m$,其中 $n$ 个位置的数已经确定,剩下的位置的数可以任意指定。现在令 $b$ 表示 $a$ 的前缀异或和,求 $\sum\limits_{i=1}^mb_i$ 的最小值。
输入
输出
样例输入
5 3
4 0
3 7
5 0
样例输出
7
题解
拆位+乱搞
首先容易发现:每一个连续段的影响是独立的。
进一步可以发现:对于两个连续段之间没有填数的一段,该未填段除最后一个数以外的数的异或和均在取0(显然可以取到)时最优,而该未填段最后一个数只对自己以及后面的连续段产生影响。
更加具体地,若该未填段的最后 $b_i$ 是 $x$ ,后面连续段的数的前缀异或和为 $c_1\sim c_l$ ,则代价就是 $x+\sum\limits_{i=1}^lx\ xor\ c_i$ 。
显然每一位互不影响,于是我们可以拆位,统计出前缀异或和中该位0和1的个数,进而判断 $x$ 的这一位取0和取1时哪一个更优,然后计算答案即可。
这里需要注意一个坑点:如果第一个连续段是从第一个位置开始的,由于没有前一个位置,不能“钦定”最优解,需要特判这种情况,直接计算。
时间复杂度 $O(n\log n)$
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
using namespace std;
struct data
{
int p , v;
bool operator<(const data &a)const {return p < a.p;}
}a[N];
int s[N] , cnt[31] , tot;
int main()
{
int m , i , j , c;
long long ans = 0;
scanf("%*d%d" , &m);
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d" , &a[i].p , &a[i].v);
sort(a + 1 , a + m + 1);
for(c = 1 ; c <= m ; c ++ )
{
tot = 1 , s[1] = a[c].v;
while(c < m && a[c + 1].p - a[c].p == 1)
tot ++ , s[tot] = a[++c].v ^ s[tot - 1];
if(!(c - tot) && a[1].p == 1)
for(i = 1 ; i <= tot ; i ++ )
ans += s[i];
else
{
for(i = 0 ; i < 30 ; i ++ )
{
cnt[i] = 0;
for(j = 1 ; j <= tot ; j ++ )
if(s[j] & (1 << i))
cnt[i] ++ ;
ans += (1ll << i) * min(cnt[i] , tot - cnt[i] + 1);
}
}
}
printf("%lld\n" , ans);
return 0;
}
【bzoj5108】[CodePlus2017]可做题 拆位+乱搞的更多相关文章
- bzoj5108 [CodePlus2017]可做题 位运算dp+离散
[CodePlus2017]可做题 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 87 Solved: 63[Submit][Status][Dis ...
- bzoj5108: [CodePlus2017]可做题
Description qmqmqm希望给sublinekelzrip出一道可做题.于是他想到了这么一道题目:给一个长度为n的非负整数序列ai,你需 要计算其异或前缀和bi,满足条件b1=a1,bi= ...
- hihocoder 1236(2015北京网络赛 J题) 分块bitset乱搞题
题目大意: 每个人有五门课成绩,初始给定一部分学生的成绩,然后每次询问给出一个学生的成绩,希望知道在给定的一堆学生的成绩比这个学生每门都低或者相等的人数 因为强行要求在线查询,所以题目要求,每次当前给 ...
- AtCoder Grand Contest 11~17 做题小记
原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-11-to-20.html UPD(2018-11-16): ...
- BZOJ4888 [Tjoi2017]异或和 FFT或树状数组+二进制拆位
题面 戳这里 简要题解 做法一 因为所有数的和才100w,所以我们可以直接求出所有区间和. 直接把前缀和存到一个权值数组,再倒着存一遍,大力卷积一波. 这样做在bzoj目前还过不了,但是luogu开O ...
- 二进制拆位(贪心)【p2114】[NOI2014]起床困难综合症
Description 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作斗争.通过研究相关文献,他找到了 ...
- 【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和
题意:给出N个数,M个操作.操作有修改和询问两种,每次修改将一个数改成另一个数,每次询问一个区间的所有连续子区间的异或和.n,m<=100000,ai<=1000 题解: 当年(其实也就是 ...
- PKUWC/SC 做题笔记
去年不知道干了些啥,什么省选/营题都没做. 现在赶应该还来得及(?) 「PKUWC2018」Minimax Done 2019.12.04 9:38:55 线段树合并船新玩法??? \(O(n^2)\ ...
- HNOI做题记录
算是--咕完了? 2013.2014的就咕了吧,年代太久远了,并且要做的题还有那么多-- LOJ #2112. 「HNOI2015」亚瑟王 发现打出的概率只和被经过几次有关. 于是\(dp_{i,j} ...
随机推荐
- 【转】odoo装饰器:model
model装饰器的作用是返回一个集合列表,一般用来定义自动化动作里面,该方法无ids传入. 应用举例: 定义columns langs = fields.Selection(string=" ...
- 西安Uber优步司机奖励政策(12月14日到12月20日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 抽样分布(3) F分布
定义 设U~χ2(n1), V~χ2(n2),且U,V相互独立,则称随机变量 服从自由度为(n1,n2)的F分布,记为F~F(n1,n2),其中n1叫做第一自由度,n2叫做第二自由度. F分布的概率密 ...
- OSG-更新和回调
本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html 作者写的比较好,再次收藏,希望更多的人可以看到这个文章 互联网是是一个相 ...
- mysql优化理解笔记(持续更新)
主要包括存储引擎.索引.sql语句 一.存储引擎 目前最常见的是InnoDB和MyISAM两个存储引擎 (1)InnoDB:支持事务处理,提供行级锁.外键约束索引,行锁 (2)MyISAM:支持全文搜 ...
- Python3.5+selenium(11)脚本模块化&参数化
mail126.py脚本如下 from selenium import webdriver from time import sleep from model1 import Login driver ...
- 获取App的PackageName包名和LauncherActivity启动页
第一种情况: 查看手机里面已经安装的App: 用数据线连接手机, 打开开发者模式, 并赋予相关权限: 1. 清除日志: adb logcat -c 2. 启动日志: adb logcat Activi ...
- 聊聊Bug引发事故该不该追求责任
最近读极客时间朱赟的一篇文章有感,在这也聊一下,在互联网的公司大多数以迭代的方式上线需求,节奏一般都比较快,经常会一个需求当天来了第二天就上线,开发和测试时间总共就两天,中间还穿插着别的需求测试,不像 ...
- Python数学运算入门把Python当作计算器
让我们尝试一些简单的 Python 命令.启动解释器,等待界面中的提示符,>>> (这应该花不了多少时间). 3.1.1. 数字 解释器就像一个简单的计算器一样:你可以在里面输入一个 ...
- python中出现ascii编码问题的解决办法
一劳永逸,一次性全盘解决的办法 环境变量中去设置 以centos 7为例: vim /etc/profile export PYTHONIOENCODING=utf-8 source /etc/pro ...