首页 > 其他分享 >震惊!!!核算中心实验小学的大教练突然宣布惊天秘闻……

震惊!!!核算中心实验小学的大教练突然宣布惊天秘闻……

时间:2024-01-17 21:14:21浏览次数:28  
标签:int ed tr st ____ 秘闻 惊天 核算 define

本周日 \(8:00 \sim 12:00\) 比赛?与直升有关?

惊 Σʕ̯•͡˔•̯᷅"ʔ。

所以是复习性质的鲜花。

从头开始吧!:

线段树

这是一个数据结构:区修区查。

是:

\______________________01______________________/
                       ||
\__________02__________/\__________03__________/
           ||                      ||
\____04____/\____05____/\____06____/\____07____/
     ||          ||          ||          ||
\__8__/\____/\____/\____/\____/\____/\____/\____/
 |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
\16/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
23 57 22 88 254 23 4 87 24 89 224 8 22 776 43 8

所以每个节点要有以下值:

  • sum:表示和。
  • lft:表示左边界。
  • rgt:表示右边界。

另外每次更新会大幅度地增加时间,故设置懒标记(标记只对子树有效):tag

这是一个树,所以总共节点右叶子结点 \(\times 2 - 1\),:左移一位。

点击查看代码
struct node {
    int lt, rt, lth, mid;
    ll sum, tag;
} tr[man<<2];

建树:

知道叶子结点个数 \(n\),左孩子是 p<<1,右孩子是 p<<1|1

设置左右边界。

  • 若是单个节点(左右边界相同),则输入值;
  • 否则进行下一层的建。

全部完成之后,更新本节点的值。

点击查看代码
    void build (int st, int ed, int p) {
        tr[p].lt = st, tr[p].rt = ed, 
        tr[p].lth = ed-st+1, tr[p].mid = (st+ed)>>1;
        if (st == ed) scanf("%lld", &tr[p].sum);
        else {
            build(st, (st+ed)>>1, ls);
            build(((st+ed)>>1)+1, ed, rs);
            upd;
        } return ;
    }

区间 \(\{s, e\}\) 增加:

从区间 \(\{1, n\}\) 向下递归:

  • 若本段在 \(\{s, e\}\) 中,则更新标记;
  • 否则查看左右子:
    • 若 \(s \leqslant\) 左子右边界(mid),则对左子递归;
    • 若 \(e \geqslant\) 右子左边界(mid+1),则对右子递归。(左右子可同时递归,并不冲突。)

全部完成之后,更新本节点的值。

点击查看代码
    void add (int st, int ed, int p, ll pls) {
        if (st<=tr[p].lt && tr[p].rt<=ed) 
            tr[p].sum += tr[p].lth*pls, tr[p].tag += pls;
        else {
            pushdown(p);
            if (st <= tr[p].mid) add(st, ed, ls, pls);
            if (tr[p].mid+1 <= ed) add(st, ed, rs, pls);
            upd;
        } return ;
    }

区间 \(\{s, e\}\) 查找:

从区间 \(\{1, n\}\) 开始向下递归:

  • 若本段在 \(\{s, e\}\) 中,则返回本段和;
  • 否则查看左右子:
    • 若 \(s \leqslant\) 左子右边界(mid),则对左子递归、返回和加上左子的和;
    • 若 \(e \geqslant\) 右子左边界(mid+1),则对右子递归、返回和加上右子的和。(左右子可同时递归,并不冲突。)

返回返回和。

点击查看代码
    ll ges (int st, int ed, int p) {
        if (st<=tr[p].lt && tr[p].rt<=ed) return tr[p].sum;
        pushdown(p);
        ll sum = 0;
        if (st <= tr[p].mid) sum += ges(st, ed, ls);
        if (tr[p].mid+1 <= ed) sum += ges(st, ed, rs);
        return sum;
    }

标记下沉:

懒标记并不是永久标记,所以在更新时需要下沉。

上面提到:懒标记只对子节点有效,所以只需更新子节点的值和子节点的懒标记。

在更新完后把本节点懒标记清零。

点击查看代码
    void pushdown (int p) {
        int *tg = &tr[p].tag;
        if (tg) {
            tr[ls].sum += *tg*tr[ls].lth;
            tr[rs].sum += *tg*tr[rs].lth;
            tr[ls].tag += *tg;
            tr[rs].tag += *tg;
            *tg = 0;
        } return ;
    }

例题

点击查看代码
/*
compiling in 
standard 
ide 
g++ test.cpp -o test && ./test
*/
#include <bits/stdc++.h>
#include <bits/extc++.h>
namespace {
#define filein(x) freopen(x".in", "r", stdin)
#define fileout(x) freopen(x".out", "w", stdout)
#define file(x) filein(x), fileout(x)
using namespace std;
using namespace __gnu_pbds;
#define ll long long
#define db double
#define un unsigned
#define ui un int
#define ull un ll
#define udb un db
template <typename T>
using pr = pair<T, T>;
#define pii pr<int>
#define pll pr<ll>
#define pdb pr<db>
#define fir first
#define sec second
#define mp(x, y) make_pair(x, y)
const int man = 2e6+10, mam = 1e5+10;
class SMT {
public:
struct node {
    int lt, rt, lth, mid;
    ll sum, tag;
} tr[man<<2];
#define ls (p<<1)
#define rs (p<<1|1)
#define upd tr[p].sum = tr[ls].sum+tr[rs].sum
    void build (int st, int ed, int p) {
        tr[p].lt = st, tr[p].rt = ed, 
        tr[p].lth = ed-st+1, tr[p].mid = (st+ed)>>1;
        if (st == ed) scanf("%lld", &tr[p].sum);
        else {
            build(st, (st+ed)>>1, ls);
            build(((st+ed)>>1)+1, ed, rs);
            upd;
        } return ;
    }
    void pushdown (int p) {
        ll tg = tr[p].tag;
        if (tg) {
            tr[ls].sum += tg*tr[ls].lth;
            tr[rs].sum += tg*tr[rs].lth;
            tr[ls].tag += tg;
            tr[rs].tag += tg;
            tr[p].tag = 0;
        } return ;
    }
    void add (int st, int ed, int p, ll pls) {
        if (st<=tr[p].lt && tr[p].rt<=ed) 
            tr[p].sum += tr[p].lth*pls, tr[p].tag += pls;
        else {
            pushdown(p);
            if (st <= tr[p].mid) add(st, ed, ls, pls);
            if (tr[p].mid+1 <= ed) add(st, ed, rs, pls);
            upd;
        } return ;
    }
    ll ges (int st, int ed, int p) {
        if (st<=tr[p].lt && tr[p].rt<=ed) return tr[p].sum;
        pushdown(p);
        ll sum = 0;
        if (st <= tr[p].mid) sum += ges(st, ed, ls);
        if (tr[p].mid+1 <= ed) sum += ges(st, ed, rs);
        return sum;
    }
#undef ls
#undef rs
#undef upd
} S;
}

int n, m;
void pres ();
int main () {
    pres();
    scanf("%d", &n);
    S.build(1, n, 1);
    
    scanf("%d", &m);
    for (int st, ed, i = 1; i <= m; ++ i) {
        string c;
        cin >> c;
        scanf("%d%d", &st, &ed);
        if (c == "ADD") {
            ll pls;
            scanf("%lld", &pls);
            S.add(st, ed, 1, pls);
        } else printf("%lld\n", S.ges(st, ed, 1));
    } return 0;
}

// --- 

void pres () {
#ifndef ONLINE_JUDGE
    file("test");
#endif
    return ;
}

标签:int,ed,tr,st,____,秘闻,惊天,核算,define
From: https://www.cnblogs.com/stamorlin/p/17968624

相关文章

  • 基于java语言开发的医院绩效核算系统源码
    医院绩效考核系统全套源码,医院绩效核算系统源码,java语言开发    医院绩效考核系统可根据工作绩效考核管理规定,配置相应的绩效考核模型,从工作量统计、核算维度、核算权重三方面计算工作绩效,利用数据处理和数据分析的支撑作用,实现对工作量统计和绩效考核结果的统计分析展示,为......
  • 第13期 | 用友BIP项目云,助力科研类项目管理实现精智核算
    近日,用友正式发布主题为“项管融通精智核算”的《大型企业项目数智化转型白皮书》。用友在国内首创从“泛项目管理落实到项目核算管理”的实践方法论,同时针对项目管理中多种类型的项目群及其项目核算进行了深入思考,将相关管理模型在用友BIP中实现落地应用,并已在众多客户中落地实践......
  • 数据入表 | 详解数据资产会计核算与企业应对
    从2015年《促进大数据发展行动纲要》到2022年《数据20条》到2023年8月份出台了《企业数据资源相关会计处理暂行规定》,可见国家层面对数据的重视和探索如何进一步挖掘数据价值,发挥数据的应用潜力。一石激起千层浪,面对如此重要的规定,企业又该如何应对呢?且听小亿一一道来。一、出台背......
  • CPU核算控制器 【ChatGPT】
    原文:https://www.kernel.org/doc/html/v6.6/admin-guide/cgroup-v1/cpuacct.htmlCPU核算控制器CPU核算控制器用于使用cgroups对任务进行分组,并核算这些任务组的CPU使用情况。CPU核算控制器支持多层级分组。一个核算组累积其所有子组和直接存在于其组中的任务的CPU使用情况。可......
  • 医院绩效管理系统,一套以工作量(RBRVS,相对价值比率)为核算基础,以工作岗位、技术含量、风
    医院绩效定义:“医院工作量绩效方案”是一套以工作量(RBRVS,相对价值比率)为核算基础,以工作岗位、技术含量、风险程度、服务数量等业绩为主要依据,以工作效率和效益、工作质量、患者满意度等指标为综合考核体系,综合计量和评价的绩效分配体系。医院绩效管理系统主要用于对科室和岗位的工......
  • 惊天大发现
    WhenwritinginEnglish,ifindthatijustcouldNOTpretendortomaskmymind.justbecauseihavetofindtherightwordtoexpressmyinnerfeeling. soit'simpossibletofakethetruthormyfeeling.zatthesametime,itcouldbedeemedas......
  • U8关于赠品处理方式及核算说明
    方法一:1.在订购单表体项选择赠品,采购做采购订单时就确定好是否赠品2.这样在收货时就可以直接带出赠品,同时在存货核算时可以零单价处理 方法二:做其他入库单,以零单价进行处理。 ......
  • 成本核算需要明确的问题
    一、成本核算的目的1、计算成本的补偿问题,计算临床服务类科室成本、项目成本、病种成本和Drg成本,需要按照病人科室归集收入和成本,例如项目成本也要按照病人科室开展的项目进行归集。2、计算科室业绩。按照执行科室进行归集,计算科室盈余,科学评价科室业绩。二、项目成本核算步骤......
  • 实现python自动化进行薪资核算——数据读取、数据计算、数据输出
    前言上一篇文章我们完成了相关准备工作——pandas库的安装以及相关库问题的解决,这篇文章实现简单的薪资核算工作。功能要求当前表格中,考勤扣除金额、个税扣除、实发工资目前是空缺的,最终生成的数据需要将上述三列的数据分别根据以下规则填充。1、迟到次数核算方法:3次以内不扣除3次......
  • 实现python自动化进行薪资核算——关于pip和pandas库的版本问题
    实现python自动化薪资核算的问题并不难,我们需要一个含有员工职位、姓名、基本工资、奖金、扣款等基本信息的xlsx表,然后通过编写一个含有读取信息函数,薪资计算函数、输出薪资函数的python程序,即可解放双手,实现沉浸式核算薪资。 那么在进行正式编写程序之前,我们需要先认识下一个库—......