线段树动态开点区间加区间求和

线段树动态开点区间加区间求和


题目来源:

陕西师范大学第七届程序设计竞赛网络同步赛 H. 万恶的柯怡

思想:

保证叶子节点被完整的覆盖,需要开节点,就把左右儿子都开出来,其余和普通线段树一样。

tips:

用结构体内部函数,内存不足,(第一次遇见本地问题不严重)不明嚼栗???

模板:

#include <bits/stdc++.h>
typedef long long ll;
const int N = 4000010;
using namespace std;
struct node{ll sum,tag;int lson,rson;
//    node(){}node(ll c,ll d,int e,int f){ ***memory limit error***
//        sum=c;tag=d;lson=e;rson=f;
//    }
}T[N];
int cnt;
void newnode(int &x,ll sum) {x = ++cnt;T[x].sum = sum;T[x].lson = T[x].rson = -1;T[x].tag = 0;
}
void push_down(int p,ll l,ll r) {ll mid = (l+r) >> 1LL;if(T[p].tag) {if(T[p].lson==-1&&T[p].rson==-1){newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));T[T[p].lson].tag += T[p].tag;T[T[p].rson].tag += T[p].tag;}else {T[T[p].lson].tag += T[p].tag;T[T[p].rson].tag += T[p].tag;T[T[p].lson].sum += T[p].tag*(mid-l+1LL);T[T[p].rson].sum += T[p].tag*(r-mid);}T[p].tag = 0;}
}
ll ask(int p,ll L,ll R,ll l,ll r) {if(L<=l&&r<=R) return T[p].sum;push_down(p,l,r);ll mid = (l+r)>>1LL;if(mid>=R) {if(T[p].lson==-1) newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));if(T[p].rson==-1) newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));return ask(T[p].lson,L,R,l,mid);}else if(mid < L) {if(T[p].lson==-1) newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));if(T[p].rson==-1) newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));return ask(T[p].rson,L,R,mid+1LL,r);}else {if(T[p].lson==-1) newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));if(T[p].rson==-1) newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));return ask(T[p].lson,L,mid,l,mid)+ask(T[p].rson,mid+1LL,R,mid+1LL,r);}
}
void push_up(int p) {T[p].sum = (T[p].lson!=-1)*T[T[p].lson].sum + (T[p].rson!=-1)*T[T[p].rson].sum;
}void add(int p,ll L,ll R,ll l,ll r,ll x) {if(L<=l&&r<=R) {T[p].tag += x;T[p].sum += (r-l+1LL)*x;return;}push_down(p,l,r);ll mid = (l+r)>>1LL;if(mid>=R) {if(T[p].lson==-1) newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));if(T[p].rson==-1) newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));add(T[p].lson,L,R,l,mid,x);}else if(mid < L) {if(T[p].lson==-1) newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));if(T[p].rson==-1) newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));add(T[p].rson,L,R,mid+1LL,r,x);}else {if(T[p].lson==-1) newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));if(T[p].rson==-1) newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));add(T[p].lson,L,mid,l,mid,x),add(T[p].rson,mid+1LL,R,mid+1LL,r,x);}push_up(p);
}int main() {int q;scanf("%d",&q);cnt = 0;int rt = ++cnt;int K=0;ll res = 0;T[rt].sum = 0;T[rt].lson=T[rt].rson = -1;T[rt].tag = 0;while(q--) {int opt;ll L,R,x;scanf("%d",&opt);if(opt) {scanf("%lld%lld",&L,&R);printf("%lld\n",ask(rt,L,R,0,1000000000LL));}else {scanf("%lld%lld%lld",&L,&R,&x);add(rt,L,R,0,1000000000LL,x);}}return 0;
}

H. 万恶的柯怡

#include <bits/stdc++.h>
typedef long long ll;
const int N = 4000010;
using namespace std;
struct node{ll sum,tag;int lson,rson;
}T[N];
int cnt;
void newnode(int &x,ll sum) {x = ++cnt;T[x].sum = sum;T[x].lson = T[x].rson = -1;T[x].tag = 0;
}
void push_down(int p,ll l,ll r) {ll mid = (l+r) >> 1LL;if(T[p].tag) {if(T[p].lson==-1&&T[p].rson==-1){newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));T[T[p].lson].tag += T[p].tag;T[T[p].rson].tag += T[p].tag;}else {T[T[p].lson].tag += T[p].tag;T[T[p].rson].tag += T[p].tag;T[T[p].lson].sum += T[p].tag*(mid-l+1LL);T[T[p].rson].sum += T[p].tag*(r-mid);}T[p].tag = 0;}
}
ll ask(int p,ll L,ll R,ll l,ll r) {if(L<=l&&r<=R) return T[p].sum;push_down(p,l,r);ll mid = (l+r)>>1LL;if(mid>=R) {if(T[p].lson==-1) newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));if(T[p].rson==-1) newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));return ask(T[p].lson,L,R,l,mid);}else if(mid < L) {if(T[p].lson==-1) newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));if(T[p].rson==-1) newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));return ask(T[p].rson,L,R,mid+1LL,r);}else {if(T[p].lson==-1) newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));if(T[p].rson==-1) newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));return ask(T[p].lson,L,mid,l,mid)+ask(T[p].rson,mid+1LL,R,mid+1LL,r);}
}
void push_up(int p) {T[p].sum = (T[p].lson!=-1)*T[T[p].lson].sum + (T[p].rson!=-1)*T[T[p].rson].sum;
}void add(int p,ll L,ll R,ll l,ll r,ll x) {if(L<=l&&r<=R) {T[p].tag += x;T[p].sum += (r-l+1LL)*x;return;}push_down(p,l,r);ll mid = (l+r)>>1LL;if(mid>=R) {if(T[p].lson==-1) newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));if(T[p].rson==-1) newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));add(T[p].lson,L,R,l,mid,x);}else if(mid < L) {if(T[p].lson==-1) newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));if(T[p].rson==-1) newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));add(T[p].rson,L,R,mid+1LL,r,x);}else {if(T[p].lson==-1) newnode(T[p].lson,T[p].sum/(r-l+1LL)*(mid-l+1LL));if(T[p].rson==-1) newnode(T[p].rson,T[p].sum/(r-l+1LL)*(r-mid));add(T[p].lson,L,mid,l,mid,x),add(T[p].rson,mid+1LL,R,mid+1LL,r,x);}push_up(p);
}int main() {int TT;scanf("%d",&TT);while(TT--) {int q;scanf("%d",&q);cnt = 0;int rt = ++cnt;int K=0;ll res = 0;T[rt].sum = 0;T[rt].lson=T[rt].rson = -1;T[rt].tag = 0;while(q--) {ll l,r,keyiL,keyiR,x;scanf("%lld %lld %lld %lld %lld",&l,&r,&x,&keyiL,&keyiR);l=l^res;r=r^res;keyiL=keyiL^res;keyiR=keyiR^res;if(l>r)swap(l,r);if(keyiL>keyiR)swap(keyiL,keyiR);add(rt,l,r,0,1000000000,x);res = ask(rt,keyiL,keyiR,0,1000000000);printf("%lld\n",res);res %= 19980105;}}return 0;
}

转载于:https://www.cnblogs.com/RRRR-wys/p/9324745.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初一模拟赛总结(6.6 my brother高考前一天,加油!(。・`ω´・。))

成绩&#xff1a; 注&#xff1a;rankrankrank是有算其他$dalao的 T1T1T1好像因为精度问题被卡了 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111hkyhkyhky180180180100100100000808080000222whdwhdwhd130130130100100100000202020101010222lyflyflyf13…

P1337-[JSOI2004]平衡点/吊打XXX【模拟退火】

正题 题目链接:https://www.luogu.com.cn/problem/P1337 题目大意 nnn个点有重量wiw_iwi​&#xff0c;求重心。 解题思路 模拟退火随机找一个重心然后不断接近即可。 codecodecode #include<cstdio> #include<cstring> #include<algorithm> #include<…

基于阿里云 DNS API 实现的 DDNS 工具

0.简要介绍0.1 思路说明AliDDNSNet 是基于 .NET Core 开发的动态 DNS 解析工具&#xff0c;借助于阿里云的 DNS API 来实现域名与动态 IP 的绑定功能。工具核心就是调用了阿里云 DNS 的两个 API &#xff0c;一个 API 获取指定域名的所有解析记录&#xff0c;然后通过比对与当前…

【拓扑排序】【DP】奖金(ssl 1325)

奖金 ssl 1325 题目大意&#xff1a; 有n个人&#xff0c;某个人要比另外一个人的工资高&#xff08;工资最低为100&#xff0c;最少多1元&#xff09;&#xff0c;问最少发多少工资 原题&#xff1a; 题目描述 由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出&#x…

网络流24题

网络流24题 说在前边 一直没有完整的刷过这套题&#xff0c;打算最近一点点刷掉通过《最小割模型在信息学竞赛中的应用》及《浅析一类最小割问题》学习常规建图技巧飞行员配对方案问题 二分图最大匹配 #include <bits/stdc.h> typedef long long ll; const int inf 0x3f…

P3959-宝藏【模拟退火】

正题 题目链接:https://www.luogu.com.cn/problem/P3959 题目大意 nnn个点&#xff0c;mmm条边&#xff0c;求一棵有根生成树权值最小。对于一条边(fa,x,w)(fa,x,w)(fa,x,w)会产生权值depfa∗wdep_{fa}*wdepfa​∗w。 解题思路 我们模拟退火每次随机一个序列&#xff0c;然后…

ASP.NET Core Web API 集成测试中使用 Bearer Token

在 ASP.NET Core Web API 集成测试一文中, 我介绍了ASP.NET Core Web API的集成测试. 在那里我使用了测试专用的Startup类, 里面的配置和开发时有一些区别, 例如里面去掉了用户身份验证相关的中间件.但是有些被测试的行为里面需要用到身份/授权信息.所以本文就介绍一下在API集成…

桐桐的雷达

桐桐的雷达 题目大意&#xff1a; 有一堆数字&#xff0c;并给出一个范围&#xff0c;判断不在范围内的数字是否多过10%&#xff0c;若不多过&#xff0c;那输出范围内数字的平均值 原题&#xff1a; 题目描述 桐桐在去广州的路上&#xff0c;对高速公路上的测速雷达产生了…

Codeforces Round #497 (Div. 1)

Codeforces Round #497 (Div. 1) A. Reorder the Array 先满足数值较小的位置&#xff0c;每次找恰好大于这个值的一个值即可。 #include <bits/stdc.h> #define rep(i,a,b) for(int ia;i<b;i) #define pb push_back typedef long long ll; const int N 100200; usin…

jzoj6824-[2020.10.17提高组模拟]英雄联盟【期望】

正题 题目大意 开始暴击率为xxx&#xff0c;每次失败后都会增加xxx&#xff0c;成功后重置&#xff0c;然后求攻击1010610^{10^6}10106次后的暴击次数除以1010610^{10^6}10106 解题思路 定义ansansans为期望攻击多少次后暴击&#xff0c;然后答案为1ans\frac{1}{ans}ans1​。…

【模拟】桐桐的游戏

桐桐的游戏 题目大意&#xff1a; 有一个用数组成的环要从1跳到z&#xff08;有些点不能跳&#xff09;&#xff0c;每次跳的步数最少有多少步 原题&#xff1a; 题目描述 桐桐最近在玩一个跳棋游戏&#xff0c;规则是&#xff1a;有个圆圈&#xff0c;分成N等分&#xff…

ASP.NET Core 应用发布与部署指南

一、前言本篇主要包含哪些内容&#xff1f;将项目发布到本地目录将项目传输到服务器并配置启动&开机自动启动将Nginx作为访问入口&#xff0c;配置反向代理本篇环境信息开发环境&#xff1a;用途工具&版本操作系统Windows 10开发工具Visual Studio 2017&#xff08;15.…

jzoj6826-[2020.10.17提高组模拟]隔膜【博弈论】

正题 题目大意 n∗nn*nn∗n的矩形&#xff0c;每一个人操作时如果棋盘上有一个k∗kk*kk∗k的矩形空地就可以选择一个点堵上。如果没有就失败了&#xff0c;求必胜方。 解题思路 如果场地上有一个位置堵上后即可堵上所有k∗kk*kk∗k的矩形那么这个点被堵住后就赢了&#xff0c;…

牛客网暑期ACM多校训练营(第一场)

牛客网暑期ACM多校训练营&#xff08;第一场&#xff09; A. Monotonic Matrix 考虑0和1的分界线&#xff0c;1和2的分界线&#xff0c;发现问题可以转化为两条不互相穿过的路径的方案数&#xff08;可重叠&#xff09;&#xff0c;题解的做法就是把一条路径斜着平移&#xff0…

2014 ACM/ICPC Asia Regional Xi'an Online

2014西安网络赛 A. Post Robot 把每种单词都kmp跑一遍&#xff0c;顺序输出即可 #include <cstdio> #include <iostream> #include <algorithm> #include <map> #include <cstring> #include <cmath> #include <queue> #include <…

MongoDB发布4.0版本,支持ACID事务

MongoDB最近发布了最新的4.0版本。毫无疑问&#xff0c;这一版本的主要特性是支持多文档ACID事务。MongoDB向与关系型数据库产品的融合迈出了一大步&#xff0c;现在支持会话的概念&#xff0c;并可以使用start_transaction()和commit_transaction()方法将多个数据库命令包含在…

P5491-[模板]二次剩余

正题 题目链接:https://www.luogu.com.cn/problem/P5491 题目大意 求解x2N(modP)x^2N(mod\ \ P)x2N(mod P) 解题思路 若aaa在模ppp意义下可以开根那么aaa就是ppp的二次剩余&#xff0c;定义 (ap){1(a是p的二次剩余)−1(a是p的二次非剩余)0(p∣a)\binom{a}{p}\left\{\begin{…

【递归】桐桐的递归函数

桐桐的递归函数 题目大意&#xff1a; 有一个函数&#xff0c;让你照着打 原题&#xff1a; 题目描述 桐桐经常找一些很有趣的数学书来阅读以增长自己的数学知识。一天&#xff0c;他偶然发现一个递归函数w&#xff08;a&#xff0c;b&#xff0c;c&#xff09;有以下性质…

分享我编程工作经历及对软件开发前景的看法

本人一直从事互联网行业&#xff0c;熟练C#、javascript,熟悉C\C,JAVA,php,object-c,熟练的开发工具有Visual Studio,数据库是MS SQL SERVER。这两天实在是无聊&#xff0c;回忆一下本人的工作经历&#xff0c;一路走来很辛苦&#xff0c;很坎坷&#xff0c;现在都快40岁了&…

P4026-[SHOI2008]循环的债务【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4026 题目大意 333个人&#xff0c;有一些面值为100,50,20,10,5,1100,50,20,10,5,1100,50,20,10,5,1的钱&#xff0c;一些人欠一些人钱&#xff0c;求最少交换多少张钞票可以还清。 解题思路 我们设fi,j,kf_{i,j,k}fi,j,k​…