CF837G - Functions On The Segments
我们考虑 \(\sum_{i=l}^r{f_i(x)}\) 是个什么东西。首先这个奇怪的东西很好离线做,所以尽管题目要求强制在线,我们还是离线下来试试。
我们发现,我们可以 \(x\) 坐标从 \(1\) 到 \(200000\) 扫过去,对于每个 \(f_i\),在 \(x_{i,1}+1\) 和 \(x_{i,2}+1\) 两个位置打标记进行更改。这样整个扫描过程就是 \(O(k+n)\) 的。然后考虑维护答案,我们发现,\(y=y_1\) 和 \(y=y_2\) 其实可以写成 \(y=0x+y_1,y=0x+y_2\) 的形式。那么,我们的 \(f_i(x)\) 就可以统一写成 \(ax+b\) 的形式。则 \(\sum_{i=l}^r{f_i(x)}=(\sum_{i=l}^r{a_i})x+\sum_{i=l}^r{b_i}\)。
这样,我们就只需要维护 \(a\) 和 \(b\) 的区间和。我们分别开两个线段树维护 \(a\) 和 \(b\) 的区间和。每次更改,就单点修改位置 \(i\) 上面的 \(a_i\) 和 \(b_i\)。然后我们提前把所有的询问挂在自己的 \(x_i\) 上,处理完当前 \(x\) 上的所有操作之后,对所有的 \([l,r]\) 询问进行查询得到 \(\sum_{i=l}^r{a_i}\) 和 \(\sum_{i=l}^r{b_i}\)。
但是现在强制在线,怎么做呢?
我们发现,只要我们存储下每个 \(x\) 所对应的 \(a\) 和 \(b\) 序列,就可以每次快速得到答案。但是存储 \(a\) 和 \(b\) 显然不现实,我们就考虑可持久化线段树。我们找到原先的所有操作:单点修改、区间查询,这恰好是可以使用主席树完成的工作。又因为是静态的,我们完全可以把主席树处理出来之后,带到询问里去计算。
还有一个小小的问题,询问时的 \(x\) 是可能达到 \(10^9\) 的,如何做呢?我们发现 \(2\cdot 10^5\) 之后的 \(x\) 都已经到了第三阶段,也就是 \(y=y_2\),可以直接处理其前缀和,然后 \(O(1)\) 计算答案。
注意我们同一个 \(x\) 上可能有很多的操作,也可能没有操作,不能把 \(x\) 作为主席树的时间轴,而应当对每个 \(x\) 上的所有操作执行完之后,记录当前主席树的最新版本。
如果我们记 \(k\) 为 更改 操作中出现的最大 \(x\),那么时间复杂度就是 \(O(k+(n+m)\log n)\),空间复杂度 \(O(n\log n)\)。
#define rd(i,n) for(ll i=0;i<n;i++)
#define rp(i,n) for(ll i=1;i<=n;i++)
#define rep(i,a,b) for(ll i=a;i<=b;i++)
typedef long long ll;
class pst{
private:
ll sum[10000005];
int ls[10000005],rs[10000005],cnt,Len;
int root[400005],Ti;
inline void Init(int &i,int l,int r,int* a){
i=++cnt;
if(l==r){
sum[i]=a[l];
return;
}
int mid=l+r>>1;
Init(ls[i],l,mid,a);
Init(rs[i],mid+1,r,a);
sum[i]=sum[ls[i]]+sum[rs[i]];
}
inline void Modify(int &i,int his,int x,int v,int l,int r){
i=++cnt;
if(l==r){
sum[i]=v;
return;
}
int mid=l+r>>1;
if(x<=mid){
rs[i]=rs[his];
Modify(ls[i],ls[his],x,v,l,mid);
}else{
ls[i]=ls[his];
Modify(rs[i],rs[his],x,v,mid+1,r);
}
sum[i]=sum[ls[i]]+sum[rs[i]];
}
inline ll Query(int i,int L,int R,int l,int r){
if(!i)return 0;
if(L<=l&&r<=R)return sum[i];
int mid=l+r>>1;
ll res=0;
if(ls[i]&&L<=mid)res+=Query(ls[i],L,R,l,mid);
if(rs[i]&&R>mid)res+=Query(rs[i],L,R,mid+1,r);
return res;
}
public:
inline void init(int len,int* a){
Len=len;
Init(root[0],1,len,a);
}
inline void modify(int x,int v){
int cnt=++Ti;
Modify(root[cnt],root[cnt-1],x,v,1,Len);
}
inline ll query(int ti,int l,int r){
return Query(root[ti],l,r,1,Len);
}
inline int curver(){
return Ti;
}
}ta,tb;
const int N=75005;
const int M=200000;
const int P=1000000000;
int n,m,q,l,r,x,xl[N],xr[N],yl[N],yr[N],a[N],b[N],Empty[N];
ll sum[N];
int vera[M+5],verb[M+5];
vt<int>v1[M+5],v2[M+5];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
n=in();
rp(i,n)xl[i]=in(),xr[i]=in(),yl[i]=in(),a[i]=in(),b[i]=in(),yr[i]=in();
rp(i,n)v1[xl[i]+1].pb(i),v2[xr[i]+1].pb(i);
ta.init(n,Empty);tb.init(n,yl);
rep(ti,1,M){
for(auto j:v1[ti]){
ta.modify(j,a[j]);
tb.modify(j,b[j]);
}
for(auto j:v2[ti]){
ta.modify(j,0);
tb.modify(j,yr[j]);
}
vera[ti]=ta.curver();
verb[ti]=tb.curver();
}
rp(i,n)sum[i]=sum[i-1]+yr[i];
q=in();
ll ans=0;
rd(_,q){
l=in(),r=in(),x=in();
x=(x+ans)%P;
if(x<=M){
ans=ta.query(vera[x],l,r)*x+tb.query(verb[x],l,r);
}else{
ans=sum[r]-sum[l-1];
}
out(ans)('\n');
}
return 0;
}
//Crayan_r
CF837G - Functions On The Segments的更多相关文章
- CF数据结构练习(二)
1. 833D Red-Black Cobweb 大意: 给定树, 边为黑色或白色, 求所有黑白边比例在$[\frac{1}{2},2]$内的路径边权乘积的乘积. 考虑点分治, 记黑边数为$a$, 白 ...
- R Customizing graphics
Customizing graphics GraphicsLaTeXLattice (Treillis) plots In this chapter (it tends to be overly co ...
- (转) Functions
Functions Functions allow to structure programs in segments of code to perform individual tasks. In ...
- IDA .edata .rdata .idata .text segments
.rdata is for const data. It is the read only version of the .data segment. .idata holds the import ...
- [LeetCode] Number of Segments in a String 字符串中的分段数量
Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...
- Greenplum记录(一):主体结构、master、segments节点、interconnect、performance monitor
结构:Client--master host--interconnect--segment host 每个节点都是单独的PG数据库,要获得最佳的性能需要对每个节点进行独立优化. master上不包含任 ...
- Application package 'AndroidManifest.xml' must have a minimum of 2 segments.
看了源码就是packagename里面必须包含一个. 源码在: ./sdk/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/id ...
- asp.net MVC helper 和自定义函数@functions小结
asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的切换,大大提升了我们的开发效率.但是Razor语法还是有一些棉花糖值得我们了解一下,可以更加强劲的提升我们 ...
- segments&cache
Segments 执行效果 命令 在 sense 里边执行 GET /abcd/_segments 前边的是索引名称,后边是请求 段信息 说明 索引是面向分片的,是由于索引是由一个或多个分片( ...
- 【跟着子迟品 underscore】Array Functions 相关源码拾遗 & 小结
Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...
随机推荐
- Java9-17新特性一览,了解少于3个你可能脱节了
前言 Java8出来这么多年后,已经成为企业最成熟稳定的版本,相信绝大部分公司用的还是这个版本,但是一眨眼今年Java19都出来了,相信很多Java工程师忙于学习工作对新特性没什么了解,有的话也仅限于 ...
- 【离线数仓】Day04-即席查询(Ad Hoc):Presto链接不同数据源查询、Druid建多维表、Kylin使用cube快速查询
一.Presto 1.简介 概念:大数据量.秒级.分布式SQL查询engine[解析SQL但不是数据库] 架构 不同worker对应不同的数据源(各数据源有对应的connector连接适配器) 优缺点 ...
- 项目完成小结 - Django-React-Docker-Swag部署配置
前言 最近有个项目到一段落,做个小结记录. 内容可能会多次补充,在博客上实时更新哈~ 如果是在公众号阅读这篇文章,可以点击「查看原文」访问最新版本~ 这个项目是前后端分离,后端为了快,依然用我的Dja ...
- 配置php-fpm识别php文件访问
以前是装的集成环境,没有想到装完Nginx + PHP + MySQL 启动nginx 服务,出现页面: 如果访问120.25.216.6/index.php 就会变成下载 之所以会这样是因为2个原因 ...
- Jmeter之随机变量元件与用户自定义变量元件区别及使用
用随机变量(random variable)与用户自定义变量(User defined variables)的区别: 随机变量:在同个线程或者不同线程时,每个次循环执行时值都会重新生成 用户自定义变量 ...
- MasaFramework -- i18n (国际化)
概念 作为一个普通开发者, 我们负责的项目的使用群体大多数是本国的人民, 但不可避免的也有一些做外贸的业务或者给外企做的项目, 这个时候就要求我们的项目有服务全球客户的能力, 而一个支持国际化能力的框 ...
- python之路38 SQL注入问题 索引触发器 事务 存储过程 函数 流程控制
SQL注入问题 怪像1:输对用户名就可以登录成功 怪像2:不需要对的用户名和密码也可以登录成功 SQL注入:利用特殊符号的组合产生特殊的含义 从而避开正常的业务逻辑 select * from use ...
- react,vue中的key有什么作用?(key的内部原理)
1.虚拟DOM中的key的作用: key是虚拟dom对象的标识,当状态中的数据发生变化时,vue会根据新数据生成新的虚拟dom,随后vue进行新的虚拟dom与旧的虚拟dom的差异比较. 2.比较规则 ...
- nodejs 升级后, vue+webpack 项目 node-sass 报错的解决方法
1.npm i node-sass -D 在错误提示里有给出了方案,重新构建 node-sass,命令如下: npm rebuild node-sass --force 如果执行完成后不报错,就可以了 ...
- springcloud与微服务
springcloud 与 微服务 父工程(按需导入依赖) <!--打包--> <packaging>pom</packaging> <properties& ...