首页 > 编程语言 >求助!!![TJOI2009] 开关样例过不了,如何解决?(语言-c++)

求助!!![TJOI2009] 开关样例过不了,如何解决?(语言-c++)

时间:2024-07-14 21:19:18浏览次数:22  
标签:return int tr sum 样例 c++ down ans TJOI2009

题目链接:https://www.luogu.com.cn/problem/P9869

我的输出:1  12

 
#include<bits/stdc++.h>
using namespace std;
const int N=100300;
int n,m,c,a,b;
struct node
{
    int f=0;
    int sum,l,r;
    //sum为开灯总数
}tr[N<<2];
void up(int k)
{
    tr[k].sum+=tr[k*2].sum+tr[k*2+1].sum;
    return;
}
void build(int k,int l,int r)
{
    tr[k].l=l;
    tr[k].r=r;//!
    if(l==r)
    {
        tr[k].sum=0;
        return;
    }
    int mid=(l+r)>>1;
    build(k<<1,l,mid);
    build(k*2+1,mid+1,r);
}
void down(int k)
{
   // cout<<"aa "<<k<<" "<<tr[k].l<<" "<<tr[k].r<<endl;
    tr[k*2].sum=tr[k*2].r-tr[k*2].l+1-tr[k*2].sum;
    tr[k*2+1].sum=tr[k*2+1].r-tr[k*2+1].l+1-tr[k*2+1].sum;
    //因为整个k区间相反操作 就等于块长减去原来总数
    if(tr[k<<1].f)
        tr[k<<1].f=0;
    else
        tr[k<<1].f=1;
    if(tr[k*2+1].f)
        tr[k*2+1].f=0;
    else
        tr[k*2+1].f=1;
    tr[k].f=0;
    return;//!
}
void change(int k,int l,int r)
{
    int x=tr[k].l,y=tr[k].r;
    //printf("%d %d %d\n",k,x,y);
    if(y<=r && x>=l)
    {
        tr[k].sum=y-x+1-tr[k].sum;
        if(tr[k].f)
            tr[k].f=0;
        else
            tr[k].f=1;
        return;
    }
    if(tr[k].f)
        down(k);
    int mid=(x+y)>>1;
    if(a<=mid)
        change(k<<1,l,r);//!
    if(b>mid)
        change(k*2+1,l,r);
    up(k);
}
int find(int k,int l,int r)
{
    int x=tr[k].l,y=tr[k].r;
    if(y<=r && x>=l)
        return tr[k].sum;
    if(tr[k].f)
        down(k);
    int ans=0;//在外面赋0
    int mid=(x+y)>>1;
    if(a<=mid)
        ans+=find(k<<1,l,r);//!
    if(b>mid)
        ans+=find(k*2+1,l,r);
    return ans;
}
int main()
{
    cin>>n>>m;
    build(1,1,n);
    while(m--)
    {
        cin>>c>>a>>b;
        if(c==0)
            change(1,a,b);
        else
            cout<<find(1,a,b)<<"\n";
    }
    return 0;
}

 

标签:return,int,tr,sum,样例,c++,down,ans,TJOI2009
From: https://www.cnblogs.com/suill/p/18302032

相关文章

  • C++使用gnuplot-cpp库绘制图像
    最近想要对一些时变的变量进行可视化,搜索来搜索去选择了使用gnuplot这个工具。sudoapt-getinstallgnuplotsudoapt-getinstallgnuplot-x11#使其支持linux终端这样就安装完gnuplot了。接着可以在命令行中键入gnuplot命令打开gnuplot的交互式环境。由于这里着目于使用c++......
  • C++ static关键字
    在C++中,static关键字有多种用途,主要用于控制变量和函数的存储期和链接性。下面详细介绍static关键字在不同上下文中的用法,并提供相应的代码示例。1.静态局部变量静态局部变量在函数中定义,但它们的生命周期贯穿程序的整个运行周期,而不仅仅是函数的执行周期。静态局部变量......
  • C++字符串String和字符串字面量String Literals
    在C++中,字符串(String)是一种用于表示和处理文本数据的基本类型。C++提供了两种主要的字符串类型:C风格字符串(C-StyleString):使用字符数组表示。标准库字符串(std::string):使用标准库中的std::string类表示。1.C风格字符串C风格字符串是一个以空字符(\0)结尾的字符数组。以下是......
  • C++惯用法:do...while(0)的妙用
    目录1.引言2.do...while(0)消除goto语句3.用do...while(0)包裹复杂的宏4.防止意外错误5.避免变量作用域问题1.引言        在C++中,do...while(0) 通常是用来做循环用的,然而我们做循环操作可能用for和while要多一些。经常看到一些开源代码会出现do...while(0)......
  • [C++]哈希
    一、概念在顺序结构以及平衡树中,元素关键码(key)与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码(key)的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(log2N),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一......
  • 封装C++项目为dll
    这是头文件,定义了一个接口类IMyInterface。#pragmaonce#ifndefMY_INTERFACE_H#defineMY_INTERFACE_H#define_CRT_SECURE_NO_WARNINGS#defineMY_DLL_API__declspec(dllexport)//定义导出到DLL中的宏//接口类,用于导出到DLLclassMY_DLL_APIIMyInterface{pub......
  • C++嵌入式压缩库bundle基础操作:内存压缩与zip文件操作
    bundle是一个轻量级的C++压缩库,集成在一对简洁的文件中(bundle.h和bundle.cpp),支持内存数据的压缩与解压缩,以及zip格式文件的操作,方便嵌入到C++程序中执行压缩、解压缩操作。本文将详细介绍如何使用bundle库进行高效的数据压缩处理。简介bundle库支持多种压缩算法,使用std::string......
  • 高质量C/C++编程指南总结(四)—— 表达式和基本语句
    1.运算符优先级如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。 2.复合表达式不要编写太复杂的复合表达式。不要有多用途的复合表达式。不要把程序中的复合表达式与“真正的数学表达式”混淆。 3.if语句不可将布尔变量直接与 ......
  • 高质量C/C++编程指南总结(三)—— 命名规则
    标识符应当直观,可望文知义。标识符的长度应当符合“min-length&& max-information”原则。命名规则尽量与所采用的操作系统或开发工具的风格保持一致。程序中不要仅靠大小写区分相似的标识符。程序中不要出现标识符完全相同的局部变量和全局变量。变量的名字应当使用“......
  • C++ PImpl模式、指向实现的指针、PImpl Idiom、隐藏实现细节
    C++PImpl模式、指向实现的指针、PImplIdiom、隐藏实现细节flyfishPImpl全称是“PointertoImplementation”,在中文中通常翻译为“指向实现的指针”或者“指向实现”。PImpl是一种编程技巧,通常用于C++中,通过这种技术,可以隐藏类的实现细节,达到信息隐藏和二进制兼容......