题解——洛谷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 要问区间最大值,肯定是要用线段树的,不能用树状数组.(因为没有逆元?但是题目求的是最后一段,可以改成类似前缀和啊 ...
随机推荐
- html5-边框属性
width: 500px; height: 300px; background: rgb(122,30,60); border: 10px solid black; /*bor ...
- hdu3037 lucas
题意 : 给了n课不同的树,要求将 0,1,2,3,4,5,...m个松果,分别放在n棵树上的方案数有多少, 我们这样考虑, 如果将m个相同的松果 放入n棵树中 , 转化一下,我们让每个点至少放1个 ...
- MVC 翻頁的那些坑
思绪良久,最后还是决定记录一下遇到的坑,毕竟被 ‘折磨’ 了三天,关于分页,这个话题,我一开始时拒绝的,因为真正接触项目的时候,才发现每个框架都会封装一套自己的分页,毕竟相同风格的项目是不常见的,而在 ...
- Linux基础命令---间歇执行命令watch
watch watch指令可以间歇性的执行程序,将输出结果以全屏的方式显示,默认是2s执行一次.watch将一直运行,直到被中断. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS ...
- android使用inject需要注意的地方
android使用inject需要注意的地方1.viewmodel里面添加注解@Inject FavoritesDBManager mFavoritesDBManager; 2.Component里面 ...
- CentOS7 zabbix服务 简单安装文档
1. 简介 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快 ...
- Autel MaxiSys Elite Diagnostic Tool Common problem solving methods
1. updating MaxiFlash Elite to firmware 3.21? My maxisys communicate with the MaxiFlash J2534 but Ma ...
- sass中的循环判断条件语句
@if $lte7:true !default;//是否兼容ie6,7 //inline-block //ie6-7 *display: inline;*zoom:1; @mixin inline-b ...
- MyEclipse 10.7(版本:eclipse 3.7.x-Indigo系列)安装PyDev 4.5.4插件
解压安装路径结构如截图所示: 安装后重启:
- pyqt5界面切换
#主要的思路就是创建两个frame(如果有两个以上同理)使用setVisible()函数显示或者隐藏frame 参数是bool值import sys from PyQt5.QtWidgets impo ...