「CQOI2006」简单题 线段树
「CQOI2006」简单题 线段树
水。区间修改,单点查询。用线段树维护区间\([L,R]\)内的所有\(1\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可。
#include <cstdio>
#include <cmath>
#define sl (x<<1)
#define sr (x<<1|1)
#define MAXN 100010
using namespace std;
struct nod{
int l; int r;
bool lazy; int val;
} tre[MAXN*4];
void buildt(int l, int r, int x){
tre[x].l=l,tre[x].r=r;
if(l==r){
tre[x].val=0;
return;
}
int mid=(l+r)>>1;
buildt(l, mid, x<<1);
buildt(mid+1, r, x<<1|1);
}
void push_down(int x){
if(tre[x].lazy==0) return;
tre[sl].lazy=!tre[sl].lazy;
tre[sr].lazy=!tre[sr].lazy;
if(tre[x].lazy) tre[sl].val=(tre[sl].r-tre[sl].l+1)-tre[sl].val;
if(tre[x].lazy) tre[sr].val=(tre[sr].r-tre[sr].l+1)-tre[sr].val;
tre[x].lazy=0;
}
void change(int x, int ql, int qr){
if(ql<=tre[x].l&&tre[x].r<=qr){
tre[x].val=tre[x].r-tre[x].l+1-tre[x].val;
tre[x].lazy=!tre[x].lazy;
return;
}
push_down(x);
int mid=(tre[x].l+tre[x].r)>>1;
if(ql<=mid) change(sl,ql,qr);
if(qr>mid) change(sr,ql,qr);
tre[x].val=tre[sl].val+tre[sr].val;
}
int query(int x, int q){
if(tre[x].l==tre[x].r){
return tre[x].val;
}
push_down(x);
int mid=(tre[x].l+tre[x].r)>>1;
int ans=0;
if(q<=mid) ans=query(sl,q);
else ans=query(sr,q);
tre[x].val=tre[sl].val+tre[sr].val;
return ans;
}
int n,m;
int main()
{
scanf("%d %d", &n, &m);
buildt(1,n,1);
while(m--){
int t;
scanf("%d", &t);
if(t==1){
int l,r;
scanf("%d %d", &l, &r);
change(1,l,r);
}else{
int i;scanf("%d", &i);
printf("%d\n", query(1,i));
}
}
return 0;
}
「CQOI2006」简单题 线段树的更多相关文章
- 洛谷P5057 [CQOI2006]简单题(线段树)
题意 题目链接 Sol 紫色的线段树板子题??... #include<iostream> #include<cstdio> #include<cmath> usi ...
- 「洛谷4197」「BZOJ3545」peak【线段树合并】
题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...
- 「洛谷3870」「TJOI2009」开关【线段树】
题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...
- LOJ2255. 「SNOI2017」炸弹 (线段树)
本文为线段树做法 (听说可以tarjan缩点+拓扑? 感觉差不多..而且这样看起来方便很多 找到左端点的过程可以看作 点 -> 区间内lowerbound最小的点 -> lowerboun ...
- LOJ 2585 「APIO2018」新家 ——线段树分治+二分答案
题目:https://loj.ac/problem/2585 算答案的时候要二分! 这样的话,就是对于询问位置 x ,二分出一个最小的 mid 使得 [ x-mid , x+mid ] 里包含所有种类 ...
- 2018.11.01 loj#2319. 「NOIP2017」列队(线段树)
传送门 唉突然回忆起去年去noipnoipnoip提高组试水然后省二滚粗的悲惨经历... 往事不堪回首. 所以说考场上真的有debuffdebuffdebuff啊!!!虽然当时我也不会权值线段树 这道 ...
- LOJ2319. 「NOIP2017」列队【线段树】
LINK 思路 神仙线段树 你考虑怎么样才能快速维护出答案 首先看看一条链怎么做? 首先很显然的思路是维护每个节点的是否出过队 然后对于重新入队的点 直接在后面暴力vector存一下就可以了 最核心的 ...
- Solution -「洛谷 P5787」「模板」二分图(线段树分治)
\(\mathcal{Description}\) Link. \(n\) 个结点的图,\(m\) 条形如 \((u,v,l,r)\) 的边,表示一条连接 \(u\) 和 \(v\) 的无向 ...
- 「洛谷 P3834」「模板」可持久化线段树 题解报告
题目描述 给定n个整数构成的序列,将对于指定的闭区间查询其区间内的第k小值. 输入输出格式 输入格式 第一行包含两个正整数n,m,分别表示序列的长度和查询的个数. 第二行包含n个整数,表示这个序列各项 ...
随机推荐
- echarts配置项说明//持续添加
<template> <div> <!-- <h2>本月抄表完成率</h2> --> <!-- <div id=&qu ...
- angular select 的第一行option 空白问题
记录一下这个问题的解决方案 <select class="form-control" ng-init="vm.columnId = vm.columnList[0] ...
- Java 之 HashMap 集合
一.HashMap 概述 java.util.HashMap<k,v> 集合 implements Map<k,v> 接口 HashMap 集合的特点: 1.HashMap 集 ...
- Java 面向对象(二)封装
一.封装(Encapsulation) 1.概述 封装是面向对象编程的核心思想.把对象的属性和行为封装起来,其载体就是类. 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的, ...
- Python UDP 通信
UDP_Client.py import socket # 创建一个 UDP 套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DG ...
- Linux服务器centos7系统下搭建Jenkins
Jenkins是什么? Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建.部署.自动化, 满足任何项目的需要. 所以现在是越来越多的公司都在使用Jenkins做持续 ...
- c去除空格 小写转大写
int isalnum(int c); //字母或数字 int isalpha(int c); //英文字母 int isascii(int c); //ASCII 码字符(0 到127) int i ...
- VS code C++代码没有自动提示
用了一段时间的VS code,发现一直都没有代码提示,奇了个怪?可能是插件有问题,于是重装C/C++,clang...等插件.结果......没用,
- EF方式增、删、改、查(基本使用)
右击项目——添加——新建项——数据(C#)——选择ADO.NET实体数据模型——点击添加——然后根据实体数据模型向导来一步步的做. 用到的表 using System; using System.Da ...
- 使用MySQL审计Plugin
本文来源:http://blog.chinaunix.net/uid-20785090-id-5018977.html 越来越多的企业把应用往mysql上迁移,这时候对数据库的审计又成了一件紧急的事情 ...