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

P3870 [TJOI2009] 开关

时间:2024-10-12 15:43:21浏览次数:6  
标签:int sum rc tr 开关 build TJOI2009 P3870 include

区间修改和区间查询的话,想到线段树,每次区间的内的操作就用区间长度减去已经亮了的灯的数量。然后将懒标记反转即可。

点击查看代码
#include <iostream>
#include <stack>
#include <cmath>
#include <algorithm>
#include <set>
#include <vector>
#include <climits>
#include <string.h>
#include <map>
#include <queue>
#include <list>
#include <cmath>
#include <iomanip> 
#define int long long 
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define lc u<<1
#define rc u<<1|1
#define gcd __gcd
#define double long double
#define endl "\n"
#define INF LLONG_MAX
#define mod  1000000007
#define N 1000005
const double PI = 3.14159265358979323846;
using namespace std;
int n, m, w[1000005];
struct Tree { int l, r, sum, add; }tr[4 * 1000005];//sum区间内开灯的数量
void pushup(int u) { tr[u].sum = tr[lc].sum + tr[rc].sum; }//上传
void pushdown(int u)//下传
{
    if (tr[u].add)
    {
        tr[lc].sum = (tr[lc].r - tr[lc].l + 1 - tr[lc].sum);
        tr[rc].sum = (tr[rc].r - tr[rc].l + 1 - tr[rc].sum);
        tr[lc].add ^= 1;tr[rc].add ^= 1;
        tr[u].add = 0;
    }
}
void build(int u, int l, int r)
{
    tr[u] = { l,r,0,0 };
    if (l == r)return;//到根节点了
    int m = l + r >> 1;
    build(lc, l, m); build(rc, m + 1, r);
}
void change(int u, int l, int r)//区间修改
{
    if (l <= tr[u].l && r >= tr[u].r)//覆盖所以做懒标记
    {
        tr[u].sum = tr[u].r - tr[u].l + 1 - tr[u].sum;
        tr[u].add ^= 1;
        return;
    }
    int m = tr[u].l + tr[u].r >> 1;
    pushdown(u);//去除懒标记
    if (l <= m)change(lc, l, r);
    if (r > m)change(rc, l, r);
    pushup(u);//跟新节点
}
int query(int u, int l, int r)//查询
{
    if (l <= tr[u].l && tr[u].r <= r)return tr[u].sum;//覆盖返回
    int m = tr[u].l + tr[u].r >> 1;
    pushdown(u);
    int sum = 0;
    if (l <= m)sum += query(lc, l, r);//覆盖返回,所以全部传过去
    if (r > m)sum += query(rc, l, r);
    return sum;
}
signed main()
{
    ios;//会超时
    cin >> n >> m;
    build(1, 1, n);//建树
    while (m--)
    {
        int op, a, b; cin >> op >> a >> b;
        if (op == 0)change(1, a, b);
        else cout << query(1, a, b) << endl;
    }

}

标签:int,sum,rc,tr,开关,build,TJOI2009,P3870,include
From: https://www.cnblogs.com/youyong1/p/18460689

相关文章

  • 想要电脑一接通电源就自动开机?把这个开关打开就可以
    前言每个电脑都可以在通电的一瞬间自动开机,这个功能叫做来电启动。啊,啊,啊,有哪个小姐姐能跟我来一下电?让我能醒过来啊!这个功能有啥用?很简单,分为好几种:电脑开机键坏了,电源开关键代替电脑开机键加远程控制插座,实现远程开机纯粹是为了帅今天就算是硬凑也要凑三个(因为按......
  • 开关打开输入框才能输入文字,否则为禁用状态
    页面开关默认为关闭状态,输入框为禁用状态。当点击开关,打开开关后,输入框禁用状态解除,才可以在输入框内输入。html结构:<divclass="page_top"> <!--第一行--> <divclass="top_first"> <divclass="shangwu">上午</div> <divcla......
  • Flutter基础组件(6):单选按钮、复选框、单选开关
    在移动应用开发中,单选和复选是常见的用户交互模式,用于选择一个或多个选项。Flutter提供了一些内置的组件和机制,方便我们实现单选和复选功能。本文将介绍Flutter中的单选按钮(RadioButton)和复选框(Checkbox)的使用方法和示例。一、单选按钮(RadioButton)单选按钮是一种用户界面组件......
  • ETA6005Q3Q 2.5A带动态路径管理的单节锂电开关型充电器
    2.5A带动态路径管理的单节锂电开关型充电器  ETA6005是一款充电电流达2.5A的单节锂电开关型充电。其集成了动态路径管理功能,内部路径的开关内阻仅50mohm,允许系统在没有电池的情况下,仍然可以在适配器存在是维持系统正常工作。ETA6005有特有的2级充电设定可通过引脚的0,1来设......
  • 25N10-智能调光N通道MOS管--HG024N10L 100V 25A 低Vth 低结电容 开关损耗小
    25N10-智能调光N通道MOS管工作原理主要依赖于栅极电压来控制导电沟道的状况。具体来说:工作原理:当加在MOS管栅极上的电压改变时,PN结之间的沟道内载流子的数量会随之改变,沟道电阻也会发生改变,进而控制漏极电流的大小。N沟道MOS管:N沟道加强型MOS管需在栅极上施加正向偏压,且栅源电压大......
  • 川土微在直流充电桩上的应用,CA-IS3641HVW隔离芯片、CA-IS3417WT隔离开关、CA-IS3980P
    川土微隔离器芯片涵盖:标准数字隔离器、电表专用数字隔离器、集成隔离电源的标准数字隔离器、隔离I2C、隔离CAN、带隔离电源的隔离CAN、隔离RS-485/422、带隔离电源的隔离RS-485/422、低成本隔离RS-485/422、0.5W全集成隔离电源、全差分隔离运放、隔离误差运放等。充电桩控制器整......
  • TS5A3166DBVR模拟开关IC芯片原装现货PDF数据手册引脚图功能框图
    TS5A3166的说明TS5A3166器件是一款单刀单掷(SPST)模拟开关,工作电压范围为1.65V至5.5V。此器件具有较低的导通状态电阻。该器件具有出色的总谐波失真(THD)性能和极低的功耗。这些特性使得这款器件适合于便携式音频应用中对于高效率、高电源密度和稳健性的需求。TS......
  • 高压开关柜中无源无线测温监测系统的作用
    高压开关柜是发电厂、变电站中确保电力系统安全可靠运行的重要设备,而柜内导线连接处的接触特性将直接影响开关柜工作的可靠性。随着使用年限的增加,因制造、安装不良或材料质量等问题都会导致接触不良而使接触电阻变大,进而导致温度升高,如不能及时发现和处理,就会导致严重的事故。......
  • 设备指示灯开关状态识别检测系统
    设备指示灯开关状态识别检测系统是基于yolo网络图像识别系统,无需新增硬件设备指示灯开关状态识别检测系统利用现场已有的监控摄像头代替人工巡检,实现7*24小时自动识别仪表示数或开关状态,通过平台上报管理员提高仪表读数识别的工作效率并降低出错率。随着科技的进步以及工业技术......
  • 学习STM32的震动开关
    学习STM32的震动开关在本文中,我将详细介绍如何使用STM32微控制器来实现一个震动开关。震动开关是一种能够检测物体是否发生震动的传感器,通常用于安防系统、智能家居等领域。我们将使用STM32的GPIO模块和外部中断功能来实现震动开关的功能。前期准备在开始之前,我们需要准备以......