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(先进先出)原则对元素 ... 
随机推荐
- JavaWeb_ XML文件
			百度百科 传送门 W3school 传送门 XML语言(可扩展标记语言):是一种表示数据的格式,按照xml规则编写的文本文件称为xml文件 Learn 一.编写XML文件 二.DTD约束 三.sche ... 
- Spring boot之使用freemarker
			大纲 (1)在pom.xml中引入freemarker; (2)如何关闭freemarker缓存 (3)编写模板文件.ftl (4)编写访问文件的controller 在pom.xml中引入freem ... 
- android gradle,groovy--https://blog.csdn.net/hebbely/article/details/79074460
			android grale,groovyhttps://blog.csdn.net/hebbely/article/details/79074460 Gradle编译时报错:gradle:peer n ... 
- bootstrap 学习笔记(部分)
			这个课程中的boostrap是3.0+版本的.(2.0与3.0有区别) bootstrap中的JS是依赖于jquery的,所以需要事先引用jquery(1.9.0版本以上). <!DOCTYPE ... 
- Why are dashes preferred for CSS selectors / HTML attributes?
			Why are dashes preferred for CSS selectors / HTML attributes? I use dashes because I don't have to h ... 
- AS之Lint 工具
			AndroidStudio内置的Lint工具,对app中的代码规范带来了极大的方便.对内存泄漏.代码冗余.代码安全.国际化.代码规范等很多方面都能检测,是一款非常强大的工具! 使用: 在AS--> ... 
- chrome浏览器爬虫WebDriverException解决采用python + selenium + chrome + headless模式
			WebDriverException: Message: unknown error: Chrome failed to start: crashed 第一种:如果出现下面情况: chrome浏览器有 ... 
- UniEAP Platform V5.0 Unable to compile class for JSP
			流程设计器报错: http://127.0.0.1:8080/framework/workflow/webdesign/procmodify/procmodifydetail.jsp?isLoadDa ... 
- 红帽学习笔记[RHCSA] 第十课[计划任务Cron与At、逻辑卷管理]
			计划任务[At & Cron Jobs] at # at 命令只能计划一次性任务但是比较方便. # 先输入时间 [root@localhost Desktop]# at 10:02 # 输入要 ... 
- PMP几种说明书
			信息系统的生命周期包括5个阶段:系统规划(可行性分析与项目开发计划).系统分析(需求分析).系统设计(概要设计.详细设计).系统实施(编码.测试).运行维护等阶段. 系统规划阶段:初步调查组织环境目标 ... 
