传送门

先考虑什么样的串才符合条件.\(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. Unity3D_(游戏)卡牌03_选关界面

      启动屏界面.主菜单界面.选关界面.游戏界面 卡牌01_启动屏界面 传送门 卡牌02_主菜单界面 传送门 卡牌03_选关界面 传送门 卡牌04_游戏界面    传送门 选关界面效果 (鼠标放在不同关 ...

  2. Pollard-rho算法[因子分解算法]

    试除法:最简单的因数分解算法,从$ 2 $到$ \sqrt n $一个一个试. 试除法(改进):从$ 2 $到$ \sqrt n $挑素数一个一个试. 然而这样复杂度是相当高的. 生日悖论:指如果一个 ...

  3. iOS检测QQ是否安装

    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"mqq://"]]) {     ...

  4. LeetCode 168. Excel表列名称(Excel Sheet Column Title)

    题目描述 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 - ...

  5. 字符串 kotlin(6)

    字符串用 String 类型表示.字符串是不可变的. 字符串的元素——字符可以使用索引运算符访问: s[i] . 可以用 for 循环迭代字符串: for (c in str) { println(c ...

  6. leetcode-easy-string-7 Reverse Integer

    mycode class Solution(object): def reverse(self, x): """ :type x: int :rtype: int &qu ...

  7. mysql replaceinto VS insertinto

    https://blog.csdn.net/t8116189520/article/details/78908975 所以,若想基于插入值累加是不行的,需要insert into https://ww ...

  8. vuex里面的store架构

    将store文件夹分为四个文件夹,分别是actions,getters,mutations,state. action:和mutatation功能是类似的,都是修改state里面的数据,区别是acti ...

  9. np.hstack和np.vstack

    np.vstack:按垂直方向(行顺序)堆叠数组构成一个新的数组 In[3]: import numpy as np In[4]: a = np.array([[1,2,3]]) a.shape Ou ...

  10. 浏览器端-W3School-JavaScript-HTML DOM:HTML DOM Attribute 对象

      ylbtech-浏览器端-W3School-JavaScript-HTML DOM:HTML DOM Attribute 对象 1.返回顶部 1. HTML DOM Attribute 对象 HT ...