题解 P3870 【[TJOI2009]开关】/基础分块学习小结
直接进入正题:
分块:
分块分块,就是把一个长串东西,分为许多块,这样,我们就可以在操作一个区间的时候,对于在区间里面完整的块,直接操作块,不完整的直接操作即可,因为不完整,再加上一个块本身就不大,复杂度会很小的,然后需要输出的时候,单点输出直接把本来自身的值加上对块的操作加起来即可,而对于区间询问,格外在维护一个区间总和数组即可。那么问题来了:分为几块呢? 答案是当大小为\(n\)的序列,分为\(\sqrt{n}\),因为对于上述的操作,设块数为\(k\),复杂度是为\(O(\frac{n}{k}+k)\)的,根据计算,可以得出\(k\)为\(\sqrt{n}\)时复杂度最优。
下面给出例题来讲解吧\(qwq\)。
例题:开关
这道题就是一个区间修改+区间查询的裸题了,他操作一次,就相当于加一次,看最后mod2为几,1则是开着的,0则是关着的。然后还有一个点,对于区间操作时,我们维护一个\(ans_i\)代表第\(i\)块块的总开灯数,如果这一个块都被操作了,就可以\(ans_i=sq-ans_i\),\(sq\)为块的大小,是一个定值,就是\(\sqrt{n}\)(因为分为了\(\sqrt{n}\)块嘛,一块大小当然也为\(\sqrt{n}\)咯)。
\(code\)时间:
#include <bits/stdc++.h>
using namespace std;
int n , m , sq;
int a[100010] , f[100010] , tag[10010] , ans[10010]; //a存放灯泡是否开着的,f为当前的位置为第几块,tag是区间标记,ans就是区间和
void work(int x , int y){
for(int i = x; i <= min(y , f[x] * sq)/*有可能不构成一块,所以取min*/; i++){
if((a[i] + tag[f[i]]/*!!!这里一定要加上标记,调了好久*/) % 2) ans[f[i]]--; //为开着的关上后就是-1
else ans[f[i]]++;
a[i]++;
}
if(f[x] != f[y]) //在一块就说明区间不构成一块
for(int i = (f[y] - 1) * sq + 1; i <= y; i++){
if((a[i] + tag[f[i]]) % 2) ans[f[i]]--;
else ans[f[i]]++;
a[i]++;
}
for(int i = f[x] + 1; i <= f[y] - 1; i++){ //两边的前面已经处理过了
ans[i] = sq - ans[i];
tag[i]++;
}
}
int sum(int x , int y){
int k = 0;
for(int i = x; i <= min(y , f[x] * sq); i++) if((a[i] + tag[f[i]]) % 2) k++;
if(f[x] != f[y]) for(int i = (f[y] - 1) * sq + 1; i <= y; i++) if((a[i] + tag[f[i]]) % 2) k++;
for(int i = f[x] + 1; i <= f[y] - 1; i++) k += ans[i];
return k;
}
int main(){
cin >> n >> m;
sq = sqrt(n);
for(int i = 1; i <= n; i++) f[i] = (i - 1) / sq + 1; //标记某一个点是哪一块的
while(m--){
int x , y;
cin >> x;
if(!x){
cin >> x >> y;
work(x , y);
}else{
cin >> x >> y;
cout << sum(x , y) << endl;
}
}
return 0;
}
我讲的很差对吧,这应该只是作为我的应该记录吧,如果真的要学习分块,去看hzwer大佬的分块九讲吧,非常清晰。
题解 P3870 【[TJOI2009]开关】/基础分块学习小结的更多相关文章
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- 洛谷 P3870 [TJOI2009]开关 题解
原题链接 前置知识: 线段树的单点.区间的修改与查询. 一看,我们需要维护两个操作: 区间取反: 区间求和. (因为区间 \(1\) 的个数,就是区间的和) 典型的 线段树 . 如果你只会线段树的 区 ...
- 洛谷 P3870 [TJOI2009]开关
题意简述 有n盏灯,默认为关,有两个操作: 1.改变l~r的灯的状态(把开着的灯关上,关着的灯打开) 2.查询l~r开着的灯的数量 题解思路 维护一个线段树,支持区间修改,区间查询 懒标记每次^1 代 ...
- Luogu3870 [TJOI2009]开关 (分块)
线段树做法很简单,但分块好啊 #include <iostream> #include <cstdio> #include <cstring> #include & ...
- P3870 [TJOI2009]开关
思路 重题 代码 #include <iostream> #include <vector> #include <cstdio> #include <cstr ...
- JavaWeb基础—XML学习小结
一.概述 是什么? 指可扩展标记语言 能干什么? 传输和存储数据 怎么干? 需要自行定义标签. XML 独立于硬件.软件以及应用程序 通常.建立完xml文件后首要的任务是:引入约束文件! 二.XML简 ...
- JavaWeb基础—JS学习小结
JavaScript是一种运行在浏览器中的解释型的编程语言 推荐:菜鸟教程一.简介js:javascript是基于对象[哪些基本对象呢]和和事件驱动[哪些主要事件呢]的语言,应用在客户端(注意与面向对 ...
- JavaWeb基础—CSS学习小结
重点记忆:四种结合方式 三种基本选择器 1.CSS:层叠样式表 相当于皮肤 提高了可维护性.样式与内容分离(注释格式/* */) 2.CSS与HTML结合的四种方式:内联式.嵌入式.外部式 1.每个 ...
- 洛谷P3870 [TJOI2009]开关
题目描述 现有\(N(2 ≤ N ≤ 100000)\)盏灯排成一排,从左到右依次编号为:\(1,2,......,N\).然后依次执行\(M(1 ≤ M ≤ 100000)\)项操作,操作分为两种: ...
随机推荐
- Java实现 蓝桥杯 算法训练 K好数
算法训练 K好数 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K ...
- Java实现 LeetCode 415 字符串相加
415. 字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num ...
- Java实现 蓝桥杯VIP 算法训练 数的统计
问题描述 在一个有限的正整数序列中,有些数会多次重复出现在这个序列中. 如序列:3,1,2,1,5,1,2.其中1就出现3次,2出现2次,3出现1 次,5出现1次. 你的任务是对于给定的正整数序列,从 ...
- Linux 用户管理命令-useradd
useradd [选项] 用户名,用来添加用户,实质是创建了几个用户信息的相关文件,选项可以支持手动创建 常见选项 -u UID:手动指定用户的UID -d 家目录 -c 用户说明 -g 组名:指定用 ...
- 连接mongoodb并且向数据库添加信息
连接mongoodb 首先安装mongoose 配置URL 连接Mongoodb数据库 控制台输入指令运行该js文件 像这样就连接成功了 向Mongodb数据库增加信息,首先需要写入表格信息 接着解构 ...
- k8s学习-安全
4.8.安全 4.8.1.概念 一些内容可参考4.6.2.Secret的内容 说明 Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务.API Server 是集群 ...
- js防抖函数
一.什么是函数防抖 概念:函数防抖(debounce),就是指触发事件后,在 n 秒内函数只能执行一次,如果触发事件后在 n 秒内又触发了事件,则会重新计算函数延执行时间. 举个栗子,坐电梯的时候,如 ...
- 一篇文章教会你用Python抓取抖音app热点数据
今天给大家分享一篇简单的安卓app数据分析及抓取方法.以抖音为例,我们想要抓取抖音的热点榜数据. 要知道,这个数据是没有网页版的,只能从手机端下手. 首先我们要安装charles抓包APP数据,它是一 ...
- 被迫重构代码,这次我干掉了 if-else
本文收录在个人博客:www.chengxy-nds.top,技术资源共享,一起进步 最近公司貌似融到资了!开始发了疯似的找渠道推广,现在终于明白为啥前一段大肆的招人了,原来是在下一盘大棋,对员工总的来 ...
- pytorch入门2.0构建回归模型初体验(数据生成)
pytorch入门2.x构建回归模型系列: pytorch入门2.0构建回归模型初体验(数据生成) pytorch入门2.1构建回归模型初体验(模型构建) pytorch入门2.2构建回归模型初体验( ...