Luogu P2574 XOR的艺术 P3870 [TJOI2009]开关 P2846 [USACO08NOV]光开关Light Switching SP7259 LITE - Light Switching
四倍经验题
简单线段树qwq(那你怎么还调了好几个小时)
修改:\(ans[cur]=(r-l+1-ans[cur]);\)
点表示的区间有多长就是有多少盏灯 亮着的关掉 暗的开启 就是上述语句了。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define MAXN 200233
#define leftson cur<<1
#define rightson cur<<1|1
#define mid ((l+r)>>1)
#define ll long long
#define push_up ans[cur]=ans[leftson]+ans[rightson]
#define push_down add(cur,leftson,l,mid); add(cur,rightson,mid+1,r); tag[cur]=0
ll ans[MAXN<<2]={};
int tag[MAXN<<2]={};
//char c;
//void build(int cur,int l,int r)
//{
// if (l==r)
// {
// cin>>c;
// ans[cur]=c-'0';
//// printf("\n??::%lld",ans[cur]);
// return;
// }
// build(leftson,l,mid);
// build(rightson,mid+1,r);
// push_up;
//}
inline void add(int delta,int cur,int l,int r)
{
if (tag[delta])
{
// if(l==r)
// {
// printf("\n:::::::::%d's %lld\n",l,ans[cur]);
// }
ans[cur]=(r-l+1-ans[cur]);
tag[cur]^=1;
}
// if (tag[cur]!=tag[delta])
// {
// printf("\n::%lld %lld\n",(r-l+1),ans[cur]);
// ans[cur]=(r-l+1-ans[cur]);
// tag[cur]=tag[delta];
// }
}
inline void change(int cur,int l,int r,int adl,int adr)
{
// printf("\nm%d~~%d 's tag::%d\n",l,r,tag[cur]);
if (adl<=l&&r<=adr)
{
ans[cur]=(r-l+1-ans[cur]);
tag[cur]^=1;
return;
}
push_down;
if (adl<=mid) change(leftson,l,mid,adl,adr);
if (adr>mid) change(rightson,mid+1,r,adl,adr);
push_up;
}
ll query(int ql,int qr,int cur,int l,int r)
{
if (ql<=l&&r<=qr)
{
// printf("sum::%d %d %lld\n",l,r,ans[cur/2]);
return ans[cur];
// printf("\n\n\n ONE::%lld\n\n\n",ans[cur]);
}
push_down;
ll answer=0;
if (ql<=mid)
{
// printf("\n\n\n TWO::%d\n\n\n",query(ql,qr,leftson,l,mid));
answer+=query(ql,qr,leftson,l,mid);
}
if (qr>mid)
{
// printf("\n\n\n THREE::%d\n\n\n",query(ql,qr,rightson,mid+1,r));
answer+=query(ql,qr,rightson,mid+1,r);
}
return answer;
}
int main()
{
int n,m;
int p,l,r;
scanf("%d%d",&n,&m);
getchar();
// build(1,1,n);
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&p,&l,&r);
if (!p)
{
change(1,1,n,l,r);
/* printf("\ntree1::\n%lld\n",ans[1]);
for (int j=2;j<=3;j++)
{
printf("%lld ",ans[j]);
}
printf("\n");
for (int j=4;j<=7;j++)
{
printf("%lld ",ans[j]);
}
printf("\n\n");
*/
// printf("\ntree2::\n%lld\n",tag[1]);
// for (int j=2;j<=3;j++)
// {
// printf("%lld ",tag[j]);
// }
// printf("\n");
// for (int j=4;j<=7;j++)
// {
// printf("%lld ",tag[j]);
// }
// printf("\n\n");
//
// for (int j=100;j<=200;j++)
// {
// printf("%d ",ans[j]);
// }
continue;
}
printf("%lld\n",query(l,r,1,1,n));
}
return 0;
}
Luogu P2574 XOR的艺术 P3870 [TJOI2009]开关 P2846 [USACO08NOV]光开关Light Switching SP7259 LITE - Light Switching的更多相关文章
- luogu P2574 XOR的艺术 (线段树)
luogu P2574 XOR的艺术 (线段树) 算是比较简单的线段树. 当区间修改时.\(1 xor 1 = 0,0 xor 1 = 1\)所以就是区间元素个数减去以前的\(1\)的个数就是现在\( ...
- 【洛谷】【线段树+位运算】P2574 XOR的艺术
[题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...
- 洛谷——P2574 XOR的艺术
P2574 XOR的艺术 很久之前就想挑战一下这道题了,线段树下传标记的入门题,跟区间加法下传标记类似. #include<bits/stdc++.h> #define N 1000005 ...
- 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)
To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...
- 洛谷P2574 XOR的艺术
题目描述 \(AKN\)觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为\(n\)的\(01\)串. 2 ...
- 洛谷 P2574 XOR的艺术
刚刚学了,线段树,一道线段树入门题试试水 下面是题面 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个 ...
- P2574 XOR的艺术
题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[l,r ...
- 洛谷P3870 [TJOI2009]开关
题目描述 现有\(N(2 ≤ N ≤ 100000)\)盏灯排成一排,从左到右依次编号为:\(1,2,......,N\).然后依次执行\(M(1 ≤ M ≤ 100000)\)项操作,操作分为两种: ...
- 洛谷P2574 XOR的艺术(线段树)——Chemist
当线段树遇上无敌位运算! 还是老套路,线段树维护区间和,一个区间有几个"1"就是这个区间的区间和,同时支持区间修改区间查询,只不过操作从加法变成了异或.主要难点就在更新懒标记那里, ...
- P3870 [TJOI2009]开关
思路 重题 代码 #include <iostream> #include <vector> #include <cstdio> #include <cstr ...
随机推荐
- 会议室NTP同步时钟布置与系统建设要领
深圳市立显电子有限公司,专业LED时钟生产厂家!--------[点击进入] NTP同步时钟之会议室设计要领: 会议室是企业必不可少的办公配套用房,一般分为大中小不同类型,有的企业中小会议室有多 ...
- C代码调用C++动态库
最近在工作中遇到了修改C++代码嵌入到C代码中去,C肯定不能直接用C++代码,就需要自己去修改成C代码,所以我就决定在C中调用C++动态库(谁让我懒呢),话不多说,直接上步骤 第一步:编写C++代码 ...
- 多文件下载并打成zip文件传输到浏览器响应流
import lombok.extern.slf4j.Slf4j; import javax.servlet.http.HttpServletResponse; import java.io.*; i ...
- 2020/03/25 CSS相关知识点
2020-03-25 16:35:03 又是一个风和日丽的下午!今天的内容比较多 真是令人头大 ,手速又慢所以缺的可能比较多,而且这东西还是多靠实践为好. 文件下载地址: https://share. ...
- idea初学
IDEA 什么是IDE IDEA官网 idea中文设置:打开右上角设置选择设置,选择Plugins ,搜索Chinese,安装插件后重启即可 IDEA基础语法 注释 编写代码量多时,项目结构复杂,需要 ...
- manjaro挂载NTFS系统的方法
本文部分引自https://blog.csdn.net/baimaozi/article/details/3134267?utm_medium=distribute.pc_relevant.none- ...
- docker&docker-compose安装
一.docker安装 1.通过 uname -r 命令查看当前的内核版本,Docker 要求 CentOS 系统的内核版本高于 3.10 uname -r 2.查看系统是否安装过docker yum ...
- 116、商城业务---分布式事务---seata的AT模式存在的问题&&最终一致性库存解锁逻辑
seata的AT模式不适合高并发的项目,因为它需要加锁来保证回滚.因此我们的订单服务方法中就尽量不能使用@GlobalTransactional来管理分布式事务. 因此在订单服务中,我们使用下面这种方 ...
- docker安装配置gitlab时的常用命令整理
1.下载安装dockerapt install docker.io2.服务启动service docker start 3.拉取gitlabdocker pull beginor/gitlab-ce: ...
- python selenium 操作文件上传,并发操作时,文件选择窗口混乱解决方案
上传文件 使用的是 python + autoit 模块,这种方式有一个问题,当出现多条任务同时选择文件上传的时候,无法判断那个文件选择窗口的归属,从而出现上传了错误的文件! 解决方法: 要上载文件而 ...