首页 > 其他分享 >P3870 [TJOI2009] 开关

P3870 [TJOI2009] 开关

时间:2024-04-03 19:33:24浏览次数:15  
标签:lazy int tree value 开关 TJOI2009 区间 P3870 root

题目大意
进行两项区间操作,一种是修改区间和,一种是查询区间和,数据范围不大,显然,可以以线段树解,其中,修改区间和比较简单,用区间总长度减去区间和即可,即\(tree[root].value =(tree[root].r - tree[root].l + 1) - tree[root].value\),区间查询就是普通的线段树区间查询。复杂度分析,修改查询皆为\(O(logn)\)
代码如下

#include <iostream>
#include <cstdio>
using namespace std;
int n, m;
const int maxn = 1e5 + 5;
struct segment_tree
{
	int l, r;
	int value;
	int lazy_tag;
};
segment_tree tree[maxn * 4];
void pushup(int root)
{
	tree[root].value = tree[root << 1].value + tree[(root << 1) + 1].value;
}
void build(int root, int l, int r)
{
	tree[root].l = l, tree[root].r = r;
	if(l == r)
	{
		tree[root].value = 0;
		return;
	}
	int mid = (l + r) >> 1;
	build(root << 1, l, mid);
	build((root << 1) + 1, mid + 1, r);
	pushup(root);
}
void pushdown(int root)
{
	if(tree[root].lazy_tag == 0) return;
	tree[root << 1].lazy_tag ^= 1, tree[(root << 1) + 1].lazy_tag ^= 1;
	tree[root << 1].value = (tree[root << 1].r - tree[root << 1].l + 1) - tree[root << 1].value;
	tree[(root << 1) + 1].value = tree[(root << 1) + 1].r - tree[(root << 1) + 1].l + 1 -tree[(root << 1) + 1].value;
	tree[root].lazy_tag = 0;
}
void update(int root, int L, int R)
{
	int l = tree[root].l, r = tree[root].r;
	if(L <= l && r <= R)
	{
		tree[root].lazy_tag ^= 1;
		tree[root].value = (r - l + 1) - tree[root].value;
		return;
	}
	int mid = (l + r) >> 1;
	tree[root].lazy_tag %= 2;
	pushdown(root);
	if(L <= mid) update(root << 1, L, R);
	if(R > mid)update((root << 1) + 1, L, R);
	pushup(root);
}
int query(int root, int L, int R)
{
	int l = tree[root].l, r = tree[root].r;
	if(L <= l && r <= R) return tree[root].value;
	int res = 0;
	int mid = (l + r) >> 1;
	tree[root].lazy_tag %= 2;
	pushdown(root);
	if(L <= mid) res += query(root << 1, L, R);
	if(R > mid) res += query((root << 1) + 1, L, R);
	return res;
}
int main()
{
	scanf("%d%d", &n, &m);
	build(1, 1, n);
	while(m--)
	{
		int opt;
		scanf("%d", &opt);
		if(opt == 0)
		{
			int a, b;
			scanf("%d%d", &a, &b);
			update(1, a, b);
		}
		else
		{
			int a, b;
			scanf("%d%d", &a, &b);
			printf("%d\n", query(1, a, b));
		}
	}
	return 0;
}

标签:lazy,int,tree,value,开关,TJOI2009,区间,P3870,root
From: https://www.cnblogs.com/coder2023/p/18113386

相关文章

  • 飞行员兄弟 费解的开关
    标签:位运算递推枚举费解的开关枚举第一行的所有按法是用来减少步数的,我之前一直觉得从第二行直接看就好,但是从第二行开始其实就已经固定了最后的答案,这样的解不一定是最少的甚至可能超出范围而没有解。所以,枚举第一行的意义是:不需要在意第一行的灯是灭是暗,只需把第一......
  • Verilog语法回顾--门级和开关级模型
    目录门和开关的声明门和开关类型支持驱动强度的门延迟实例数组and,nand,nor,or,xor,xnorbuf,notbufif1,bufif0,notif1,notif0MOSswitchesBidirectionalpassswitchespullup,pulldown参考《Verilog 编程艺术》魏家明著Verilog共有14中逻辑门和12种开关,用于提供门级和开关......
  • 区间开关灯模型
    P3870[TJOI2009]开关先看一道经典的区间开关灯问题的模型,维护一个lz每次异或操作就好了#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<int,int>;constintN=1e5+10;constintinf=0x3f3f3f3f;constintmod=1e9+......
  • Android Switch开关按钮使用和自定义样式
    最终效果minHeight,switchMinWidth调整switch开关高度、宽度android:thumb开关按钮上原型滑块的样式android:track开关按钮下面导轨的样式<Switchandroid:layout_width="48dp"android:layout_height="24dp"android:layout_marginEnd="21dp"......
  • C# winform窗口打开关闭后不释放内存问题
    问题解决一:如果是窗体属性加载了背景图导致的内存占用,在关闭窗体前,释放掉背景图资源即可释放占用的内存privateImagebackgroundImage;publicForm2(){InitializeComponent();backgroundImage=Image.FromFile(@"D:\XX......
  • GBU3510-ASEMI开关电源整流桥GBU3510
    编辑:llGBU3510-ASEMI开关电源整流桥GBU3510型号:GBU3510品牌:ASEMI封装:GBU-4平均正向整流电流(Id):35A最大反向击穿电压(VRM):1000V产品引线数量:4产品内部芯片个数:4产品内部芯片尺寸:160MIL峰值正向漏电流:<10ua恢复时间:>2000ns正向浪涌电流:350A正向压降:1.05V恢复时间:工作结温......
  • GBU3010-ASEMI开关电源整流桥GBU3010
    编辑:llGBU3010-ASEMI开关电源整流桥GBU3010型号:GBU3010品牌:ASEMI封装:GBU-4特性:插件、整流桥平均正向整流电流(Id):30A最大反向击穿电压(VRM):1000V恢复时间:>2000ns最大RMS电压:引脚数量:4芯片个数:4最大正向压降:1.05V芯片尺寸:160MIL工作温度:-55℃~150℃正向浪涌电流:300A类型......
  • 8. 基于51单片机的感应震动&按键&超声波&蜂鸣器开关盖桶
    项目概述功能描述检测靠近时,垃圾桶自动开盖并伴随滴一声,2秒后关盖发生震动时,垃圾桶自动开盖并伴随滴一声,2秒后关盖按下按键时,垃圾桶自动开盖并伴随滴一声,2秒后关盖硬件说明SG90舵机,超声波模块,震动传感器,蜂鸣器链接:7.PWM开发SG90(手把手教会)链接:6.超声波测距的使......
  • 安卓14谷歌GooglePlay商店安装 谷歌基础服务打开 GMS服务开关 谷歌三件套安装
    环境:最新的安卓手机已经内置了谷歌三件套例如小米手机打开Go安装器可以看到结果,但是为什么没有Play商店的桌面进入图标呢,因为默认厂商把图标给隐藏了,只需要重新打开即可。提示安装Google服务后系统会增加显著的耗电,不用时建议关闭GMS服务添加快捷方式(使用其他软件)主程序......
  • yml文件-动态开关
    本质:${}读取字符串方案一增加一个属性swith来判断业务流走向//test.swith是配置文件中定义的参数@value("${test.swith}")Stringswith;publicvoidfunc(){if("on".equals(swith)){//执行对应的定时任务代码}} 方案二通过@ConditionalOnProperty......