传送门

先考虑什么样的串才符合条件.\(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的更多相关文章

  1. CF1090H Linearization 构造、位运算、前缀和

    传送门 有点神仙的题目 首先注意到对于串\(s\),\(b=s_0\)一定会比\(b = s_0 \bigoplus 1\)更优 考虑先分析linear串的性质.注意到位运算考虑按位处理.我们考虑\( ...

  2. HDU 5095 Linearization of the kernel functions in SVM(模拟)

    主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=5095 Problem Description SVM(Support Vector Machine) ...

  3. Linearization of the kernel functions in SVM(多项式模拟)

    Description SVM(Support Vector Machine)is an important classification tool, which has a wide range o ...

  4. 模拟 HDOJ 5095 Linearization of the kernel functions in SVM

    题目传送门 /* 题意:表达式转换 模拟:题目不难,也好理解题意,就是有坑!具体的看测试样例... */ #include <cstdio> #include <algorithm& ...

  5. 控制结构(8) 线性化(linearization)

    // 上一篇:管道(pipeline) // 下一篇:程序计数器(PC) "编程语言不过是一个工具,什么语言都一样","编程语言能改变人的思维,不同的语言会带给你不同的思 ...

  6. 控制结构(8): 线性化(linearization)

    // 上一篇:管道(pipeline) // 下一篇:程序计数器(PC) "编程语言不过是一个工具,什么语言都一样","编程语言能改变人的思维,不同的语言会带给你不同的思 ...

  7. 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 ...

  8. 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). ...

  9. 【JUC】JDK1.8源码分析之ConcurrentLinkedQueue(五)

    一.前言 接着前面的分析,接下来分析ConcurrentLinkedQueue,ConcurerntLinkedQueue一个基于链接节点的无界线程安全队列.此队列按照 FIFO(先进先出)原则对元素 ...

随机推荐

  1. es6字符串的扩展——模板

    todo1.模板字符串 传统的 JavaScript 语言,输出模板通常是这样写的(下面使用了 jQuery 的方法). $('#result').append( 'There are <b&g ...

  2. Python--安装第三方库的方法

    一:安装方法(以numpy为例,安装其他包把numpy改为包名即可) 1.有设置python包中pip.exe环境变量的情况下 同时按住win+R输入cmd打开cmd,直接输入pip install ...

  3. LeetCode 17. 电话号码的字母组合(Letter Combinations of a Phone Number)

    题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出: ...

  4. 数字 kotlin (1)

    数字Kotlin 处理数字在某种程度上接近 Java,但是并不完全相同.例如,对于数字没有隐式拓宽转换(如 Java 中 int 可以隐式转换为 long ——译者注),另外有些情况的字面值略有不同. ...

  5. 对保存的参数checkpoints进行可视化读取 1.pywrap_tensorflow.NewCheckpoint(获得checkpoint的读取器) 2.np.save(对npy文件进行保存) 3.tl.file.load_npy_to_any(对保存的npy文件进行读取)

    1. pywrap_tensorflow.NewCheckpoint(path)获得checkpoint的读取器 参数说明: path表示checkpoint的路径 2.np.save(path, d ...

  6. C++抽象类实践

    实践如下: #include <iostream> using namespace std; class Service { public: // 有一个虚函数即为抽象类 int id; ...

  7. Android Studio安装Unable to access Android SDK add-on list处理方法

    Unable to access Android SDK add-on list. 很多人写的加屏蔽语句,跳过检测,其实是不行的,因为最后还是要下载. 不翻墙的情况下,一般都是修改host文件:C:\ ...

  8. Anaconda 配置 Python 环境

    原文地址:Anaconda 配置 Python 环境 0x00 环境 Anaconda: 2019.03 Python: 3.6.8 0x01 Linux 安装 Anaconda 交互安装 Anaco ...

  9. 代码实现:输入3个数a,b,c,按大小顺序输出。

    import java.util.Arrays; import java.util.Scanner; //输入3个数a,b,c,按大小顺序输出. public class Test34 { publi ...

  10. doctype是什么?

    1.<!doctype>声明必须处于HTML文档的头部,在<html>标签之前,HTML5中不区分大小写 2.<!doctype>声明不是一个HTML标签,是一个用 ...