CF1090H Linearization
先考虑什么样的串才符合条件.\(s_i=P(x\&i)\oplus b\),其实这里的\(b\)只能使得整体是否取反,所以可以先不管.然后考虑\(x\)的每个二进制位的对\(s_0\)到\(s_{len-1}\)贡献,可以发现如果\(x\)从小到大第\(i\)位为\(1\),那么会给从头开始每一个长度为\(2^i\)区间的后半部分所有\(s_i\)异或上\(1\),类似于这样$$\begin{matrix}&\underbrace{0,0,...0},&\underbrace{1,1,...1},&\underbrace{0,0,...0},&\underbrace{1,1,...1}...\&2{i-1}&2{i-1}&2{i-1}&2{i-1}\end{matrix}$$
然后,根据上面的结论,不管\(x\)是多少,我们都可以发现这样的串,前半部分和后半部分要么完 全 一 致,要么完全不同,并且前半部分和后半部分也满足这个性质.
再考虑怎么求出最小操作次数.题目允许的操作是区间异或,显然可以改成两次前缀异或,还有就是两次前缀异或也可以反向合成一次区间异或.然后如果把串的差分数组搞出来\(t_i=s_i\oplus s_{i+1}\),那么一次前缀操作就是对差分数组单点取反.这个差分数组也有一定性质,因为前面说到这个串前半部分和后半部分要么完全一致要么完全不同,所以这个差分数组的前后两半(不包括中间那个点)\([1,mid)\)到\((mid,n]\)也是完全相同的,并且这两半也满足这个性质(至于中间那个点值是多少暂时不用管).用这个分治过程可以把串分成\(\log n\)层,第\(i\)层都有\(2^{i-1}\)个区间,并且每层的所有区间的中间点都要相同.所以每次把这些点找出来,然后对答案的贡献就是\(0\)个数和\(1\)个数的较小值
每次暴力统计是不行的,注意到每一层相邻两个数间距相等且为\(2^k(k>1)\),所以可以预处理出每个位置以及每次往后走\(2^k\)到达的位置的\(0/1\)个数的后缀和,然后在每一层直接找出这一层第一个中间点,用区间和贡献答案就好了
注意两次前缀操作可以合成为一次区间操作,所以应该输出\(\lceil\frac{ans}{2}\rceil\)
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double
using namespace std;
const int N=2e5+10;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
char cc[N];
int n,a[N],q,sb[N][18];
int main()
{
n=rd();
scanf("%s",cc+1);
for(int i=1;i<=n;++i) a[i]=cc[i]-'0';
int lz=log2(n);
for(int j=0;j<lz;++j)
for(int i=n-1;i;--i)
sb[i][j]=(i+(1<<(j+1))<=n?sb[i+(1<<(j+1))][j]:0)+(a[i]^a[i+1]);
q=rd();
while(q--)
{
int l=rd()+1,r=rd()+1,len=r-l+1,an=0;
for(int i=len>>1,j=0;i;i>>=1,++j)
{
int ii=l+(1<<j)-1,x=sb[ii][j]-(ii+len<n?sb[ii+len][j]:0);
an+=min(x,i-x);
}
printf("%d\n",(an+1)/2);
}
return 0;
}
CF1090H Linearization的更多相关文章
- CF1090H Linearization 构造、位运算、前缀和
传送门 有点神仙的题目 首先注意到对于串\(s\),\(b=s_0\)一定会比\(b = s_0 \bigoplus 1\)更优 考虑先分析linear串的性质.注意到位运算考虑按位处理.我们考虑\( ...
- HDU 5095 Linearization of the kernel functions in SVM(模拟)
主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=5095 Problem Description SVM(Support Vector Machine) ...
- Linearization of the kernel functions in SVM(多项式模拟)
Description SVM(Support Vector Machine)is an important classification tool, which has a wide range o ...
- 模拟 HDOJ 5095 Linearization of the kernel functions in SVM
题目传送门 /* 题意:表达式转换 模拟:题目不难,也好理解题意,就是有坑!具体的看测试样例... */ #include <cstdio> #include <algorithm& ...
- 控制结构(8) 线性化(linearization)
// 上一篇:管道(pipeline) // 下一篇:程序计数器(PC) "编程语言不过是一个工具,什么语言都一样","编程语言能改变人的思维,不同的语言会带给你不同的思 ...
- 控制结构(8): 线性化(linearization)
// 上一篇:管道(pipeline) // 下一篇:程序计数器(PC) "编程语言不过是一个工具,什么语言都一样","编程语言能改变人的思维,不同的语言会带给你不同的思 ...
- HDU 5095 Linearization of the kernel functions in SVM (坑水)
比较坑的水题,首项前面的符号,-1,+1,只有数字项的时候要输出0. 感受一下这些数据 160 0 0 0 0 0 0 0 0 -10 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 ...
- hdu 5095 Linearization of the kernel functions in SVM(模拟,分类清楚就行)
题意: INPUT: The input of the first line is an integer T, which is the number of test data (T<120). ...
- 【JUC】JDK1.8源码分析之ConcurrentLinkedQueue(五)
一.前言 接着前面的分析,接下来分析ConcurrentLinkedQueue,ConcurerntLinkedQueue一个基于链接节点的无界线程安全队列.此队列按照 FIFO(先进先出)原则对元素 ...
随机推荐
- Unity3D_(数据)LitJson创建和解析Json
LitJson github: 传送门 JsonUtility创建和解析Json 传送门 LitJson.dll百度云盘 传送门 密码:p1py 加载LitJson.dll到Unity中 在Asset ...
- Linux 压缩方式测试
测试方法 使用 python 的 Faker 第三方包伪造数据,写入文件 test.txt 复制 test.txt 内容为 test2.txt ,将 test2.txt 的内容重定向到 test.tx ...
- 死磕java多线程
1.线程和进程 1.1线程和进程的区别 进程 它是内存中的一段独立的空间,可以负责当前应用程序的运行.当前这个进程负责调度当前程序中的所有运行细节(操作系统为进程分配一块独立的运行空间): 线程 它是 ...
- IDEA无法自动导入HttpServlet包问题解决
全部都报红,连Alt + Enter都没有提示导包 这时候只需要IDEA右上角的这个键 再点击Libraries 选择添加 → Java 再把你Tomcat中对应的servlet-api.jar添加进 ...
- MySQL 数据库 常用函数
一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x的最小整数 ...
- Why 0.1 + 0.2 === 0.30000000000000004 ?
Why 0.1 + 0.2 === 0.30000000000000004 ? 在浮点数运算中产生误差值的示例中,最出名应该是0.1 + 0.2 === 0.30000000000000004了,到底 ...
- Amphorae 与 Octavia Worker 的安全通信实现
前言 在前面的章节中我们记录了 LoadBalancer.Listener.Pool.Member 等等 Octavia 核心资源对象的创建流程,本篇我们在此之上继续讨论处于 LB Managemen ...
- 阶段3 2.Spring_03.Spring的 IOC 和 DI_7 spring中bean的细节之作用范围
bean的作用范围调整. 我们的bean通常情况下都是一个单例的模式 Spring是否也知道这些都是单例 构造函数只走了一次.也就是spring这个对象默认情况就是单例的 scope属性 定义bean ...
- Delphi中基本控件之SaveDialog控件的使用总结
首先向Form窗体拖一个SaveDialog控件,Name属性改为:dlgSave,然后添加一个按钮,Caption属性改为:浏览,Name属性改为:btnBrowse. 然后双击浏览按钮添加如下代码 ...
- java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)
1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...