题解——洛谷P2781 传教(线段树)
可以说是数据结构学傻了的典型案例了
昨天跳到这题上
然后思考了一下
噫!好!线段树裸题
然后打完板子,发现\( n \le 10^9 \)
显然线段树直接做不太行
然后这题又只有普及的难度
然后我就打了神奇的动态开点线段树水过
qwq
之后看题解发现正解是\( O(m^2) \)的暴力
因为常数小跑的更快啊qwq
#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
int cnt=,tr[<<],tag[<<],lx[<<],rx[<<],n,m,root=;
void pushup(int o){
tr[o]=tr[lx[o]]+tr[rx[o]];
}
void pushdown(int o,int ln,int rn){
if(!lx[o])
lx[o]=++cnt;
if(!rx[o])
rx[o]=++cnt;
if(tag[o]){
tag[lx[o]]+=tag[o];
tag[rx[o]]+=tag[o];
tr[lx[o]]+=tag[o]*ln;
tr[rx[o]]+=tag[o]*rn;
tag[o]=;
}
}
void update(int L,int R,int l,int r,int& o,int c){
if(!o)
o=++cnt;
if(L<=l&&r<=R){
tr[o]+=c*(r-l+);
tag[o]+=c;
return;
}
int mid=(l+r)>>;
pushdown(o,mid-l+,r-mid);
if(L<=mid){
update(L,R,l,mid,lx[o],c);
}
if(R>mid){
update(L,R,mid+,r,rx[o],c);
}
pushup(o);
}
int query(int L,int R,int l,int r,int &o){
if(!o)
o=++cnt;
if(L<=l&&r<=R){
return tr[o];
}
int ans=,mid=(l+r)>>;
pushdown(o,mid-l+,r-mid);
if(L<=mid){
ans+=query(L,R,l,mid,lx[o]);
}
if(R>mid)
ans+=query(L,R,mid+,r,rx[o]);
return ans;
}
void debug(int l,int r,int o){
if(!o)
return;
printf("o=%d l=%d r=%d tag=%d num=%d lx=%d rx=%d\n",o,l,r,tag[o],tr[o],lx[o],rx[o]);
if(l==r)
return;
int mid=(l+r)>>;
debug(l,mid,lx[o]);
debug(mid+,r,rx[o]);
}
signed main(){
scanf("%lld %lld",&n,&m);
for(int i=;i<=m;i++){
int opt;
scanf("%lld",&opt);
if(opt==){
int l,r,k;
scanf("%lld %lld %lld",&l,&r,&k);
update(l,r,,n,root,k);
// debug(1,n,root);
}
else{
int l,r;
scanf("%lld %lld",&l,&r);
printf("%lld\n",query(l,r,,n,root) );
}
}
return ;
}
题解——洛谷P2781 传教(线段树)的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷——P2781 传教
P2781 传教 题目背景 写完暑假作业后,bx2k去找pear玩.pear表示他要去汉中传教,于是bx2k准备跟着去围观. 题目描述 pear把即将接受传教的人排成一行,每个人从左到右的编号为1-n ...
- 洛谷P5280 [ZJOI2019]线段树
https://www.luogu.org/problemnew/show/P5280 省选的时候后一半时间开这题,想了接近两个小时的各种假做法,之后想的做法已经接近正解了,但是有一些细节问题理不 ...
- 洛谷 P2391 白雪皑皑 线段树+优化
题目描述: 现在有 \(N\) 片雪花排成一列. Pty 要对雪花进行$ M $次染色操作,第 \(i\)次染色操作中,把\((i*p+q)%N+1\) 片雪花和第\((i*q+p)%N+1\)片雪花 ...
- 【洛谷】【线段树】P1471 方差
[题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...
- 【洛谷】【线段树】P1047 校门外的树
[题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...
- 【洛谷】【线段树】P1886 滑动窗口
[题目描述:] 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. [输入格式:] 输入一共 ...
- 【洛谷】【线段树】P3353 在你窗外闪耀的星星
[题目描述:] /* 飞逝的的时光不会模糊我对你的记忆.难以相信从我第一次见到你以来已经过去了3年.我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向后仰,柔和的晚霞照耀 ...
- 洛谷 - P1198 - 最大数 - 线段树
https://www.luogu.org/problemnew/show/P1198 要问区间最大值,肯定是要用线段树的,不能用树状数组.(因为没有逆元?但是题目求的是最后一段,可以改成类似前缀和啊 ...
随机推荐
- [转]sql server 常用脚本(日常查询所需)
1:查看sql server代理中作业的运行状况的脚本 -- descr : a simple sql script to view sql server jobs run status -- las ...
- 【2017-2-21】C#分支语句,分支嵌套,变量的作用域
分支语句 句式:if else(必须是if开头,可以是else if或者else结束,也可以直接结束) if(bool型比较表达式) { 如果上面的条件成立,则执行这里面的代码 } else if(b ...
- ★★★kalinux 常用命令
1.修改密码: sudo passwd root 2.重启:reboot ====================================== arch 显示机器的处理器架构(1) una ...
- highchart应用示例1--2个不同类型变量2个y轴
1.ajax调用接口和处理数据 function getCityData() { var date1 = $('#datetimepicker1').val(); var date2 = $('#da ...
- tomcat 启动时遇到org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs
当发生这样的错误的时候 org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet ...
- 合并两个JsonArray
//合并两个JSONArray public static String joinJSONArray(JSONArray mData, JSONArray array) { StringBuffer ...
- Python Selenium element is not reachable by keyboard
碰到这个问题,没法解决, 最后这么搞的 pcAction.move_by_offset(571, 534).click().perform() #激活输入框 driver.switch_to.acti ...
- shell 中的小技巧
去掉最后一个字符 sed 's/.$//' awk '{sub(/.$/,"")}1' awk '{printf $0"\b \n"}' [root@ ~]# ...
- python的zipfile、tarfile模块
zipfile.tarfile的用法 先占个位置,后续再实际操作和补充 参考 https://www.cnblogs.com/MnCu8261/p/5494807.html
- P3203 [HNOI2010]弹飞绵羊(LCT)
P3203 [HNOI2010]弹飞绵羊 LCT板子 用一个$p[i]$数组维护每个点指向的下个点. 每次修改时cut*1+link*1就解决了 被弹出界时新设一个点,权为0,作为终点表示出界点.其他 ...