6398. 【NOIP2018模拟10.30】Generator(树状数组区间修改)
题目描述
Description
Input
Output
输出 q 行,第 i 行表示数据 Di 的答案。
Sample Input
4 3 2
1 1 2 4
2 1 2
1 1 3 5
2 2 3
Sample Output
0
4
14
22
Data Constraint
题解
显然cdq+线段树,计算加上每个操作的贡献
修改取决于之后的询问,询问取决于之前的修改
然而线段树会T,所以用树状数组差分一下
开两个树状数组,询问1~t表示成s1+s2*t,修改t就在t处的s1减(t-1)*s,在s2加s
code
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define low(x) (x&-(x))
using namespace std;
struct type{
int type,l,r,s,t,id;
} a[200001];
long long ans[200001];
long long tr[200001];
long long Tr[200001]; //*t
bool bz[200001];
int d[200001];
int n,Q,i,j,k,l,t,len;
bool cmp(type a,type b)
{
return a.t<b.t;
}
bool Cmp(type a,type b)
{
return a.id<b.id;
}
void Change(int t,int s)
{
long long S=(long long)(t-1)*s;
while (t<=n)
{
tr[t]-=S;
Tr[t]+=s;
if (!bz[t])
bz[t]=1,d[++len]=t;
t+=low(t);
}
}
void change(int l,int r,int s)
{
Change(l,s);
Change(r+1,-s);
}
long long Find(int t)
{
long long T=t,ans=0,s=0;
while (t)
{
ans+=tr[t];
s+=Tr[t];
t-=low(t);
}
return ans+s*T;
}
long long find(int l,int r)
{
return Find(r)-Find(l-1);
}
void clear()
{
int i;
fo(i,1,len)
tr[d[i]]=0,Tr[d[i]]=0,bz[d[i]]=0;
len=0;
}
void work(int L,int R)
{
int i,Mid=(L+R)/2;
if (L==R) return;
work(L,Mid);
work(Mid+1,R);
sort(a+L,a+R+1,Cmp);
fo(i,L,R)
if (a[i].t<=Mid && a[i].type==1)
change(a[i].l,a[i].r,a[i].s);
else
if (a[i].t>Mid && a[i].type==2)
ans[a[i].t]+=find(a[i].l,a[i].r);
clear();
fd(i,R,L)
if (a[i].t<=Mid && a[i].type==2)
change(a[i].l,a[i].r,1);
else
if (a[i].t>Mid && a[i].type==1)
ans[a[i].t]+=find(a[i].l,a[i].r)*a[i].s;
clear();
}
int main()
{
freopen("generator.in","r",stdin);
freopen("generator.out","w",stdout);
scanf("%d%d",&n,&Q);
fo(i,1,Q-1)
{
scanf("%d",&j);
a[j].t=i;
}
fo(i,1,Q)
{
scanf("%d",&a[i].type);
if (a[i].type==1)
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].s);
else
scanf("%d%d",&a[i].l,&a[i].r);
a[i].id=i;
++a[i].t;
}
sort(a+1,a+Q+1,cmp);
work(1,Q);
fo(i,1,Q)
{
ans[i]+=ans[i-1];
printf("%lld\n",ans[i]);
}
fclose(stdin);
fclose(stdout);
return 0;
}
6398. 【NOIP2018模拟10.30】Generator(树状数组区间修改)的更多相关文章
- 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询
题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询
题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...
- 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询
题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- 【POJ3468】【树状数组区间修改】A Simple Problem with Integers
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- 1082 线段树练习 3 && 树状数组区间修改区间查询
1082 线段树练习 3 题意: 给定序列初值, 要求支持区间修改, 区间查询 Solution 用树状数组, 代码量小, 空间占用小 巧用增量数组, 修改时在 \(l\) 处 $ + val$ , ...
- POJ2155 Matrix(二维树状数组||区间修改单点查询)
Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row an ...
- 【树状数组区间修改单点查询】HDU 4031 Attack
http://acm.hdu.edu.cn/showproblem.php?pid=4031 [题意] 有一个长为n的长城,进行q次操作,d为防护罩的冷却时间,Attack表示区间a-b的墙将在1秒后 ...
随机推荐
- 6.824 Lab 3: Fault-tolerant Key/Value Service 3A
6.824 Lab 3: Fault-tolerant Key/Value Service Due Part A: Mar 13 23:59 Due Part B: Apr 10 23:59 Intr ...
- 刘铁猛-深入浅出WPF-系列资源汇总
首先奉上原作者刘铁猛博客地址:http://www.cnblogs.com/prism/ 作者讲的很不错,没有之一,另外作者出了一本书,希望大家支持. 送上全套高清晰视频教程(我注册了3个51cto的 ...
- [转帖]是时候深入了解Linux的系统结构
是时候深入了解Linux的系统结构 http://os.51cto.com/art/201905/596011.htm linux的体系结果 其实自己也知道 linus 做了一个 kernel 大 ...
- RocketMQ事务性消息及持久化
TransactionProducer(事务消息): 在分布式系统中,我们时常会遇到分布式事务的问题,除了常规的解决方案之外,我们还可以利用RocketMQ的事务性消息来解决分布式事务的问题.Rock ...
- 使用CyclicBarrier+线程池,按总页数分批次开多线程执行逻辑
通过CyclicBarrier+线程池的方式,同步的方式分页分批次并发高效处理逻辑,将总页数分成多个批次并发执行每页逻辑,每个批次处理DO_MAX_SIZE个页,每个批次等待DO_MAX_SIZE个页 ...
- tensorflow学习笔记七----------RNN
和神经网络不同的是,RNN中的数据批次之间是有相互联系的.输入的数据需要是要求序列化的. 1.将数据处理成序列化: 2.将一号数据传入到隐藏层进行处理,在传入到RNN中进行处理,RNN产生两个结果,一 ...
- [LeetCode] 109. 有序链表转换二叉搜索树
题目链接 : https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/ 题目描述: 给定一个单链表,其中的 ...
- Markdown在线编辑及预览
推荐一款不错的Markdown语法手册,最可贵的是支持在线编辑预览: Cmd Markdown简介 Cmd Markdown语法手册及在线编辑 补充一些使用技巧: MarkDown实现段首缩进:「Ma ...
- 纯手写实现ajax分页功能
前言 最近用到了这个功能,百度大半天,网上的不是有各种问题就是需要引入其他的插件,无奈,只能自己写,大致功能已经完成.前端页面用bootstrap做样式,分页功能用ajax实现,没用其他插件哦,只引入 ...
- ELK报错及解决方案
ELK报错及解决方案 1.jdk版本问题 报错如下: future versions of Elasticsearch will require Java 11; your Java version ...