首页 > 其他分享 >P9494 「SFCOI-3」进行一个走的行 思考--zhengjun

P9494 「SFCOI-3」进行一个走的行 思考--zhengjun

时间:2023-08-05 20:13:27浏览次数:32  
标签:rt rs -- P9494 zhengjun int tag ls laz

平衡树好题。

考虑整体直接模拟操作。

  • l -1 x

    • \(x\in[1,l]\):不用动;
    • \(x\in(l,2l]\):整体减去 \(l\) 之后暴力插回去;
    • \(x\in(2l,+\infty)\):整体减 \(l\) 与第一段合并。
  • l r x:区间加即可

复杂度显然是 2log 的,考虑重新插入一次的时候值会减半。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e5+10;
int n,m,a[N],b[N],c[N];
vector<pair<int,int> >o[N];
vector<int>q[N];
mt19937 rnd(time(0));
struct node{
	int fa,ls,rs,rnd,val,laz;
	ll ans,tag;
}t[N];
int root;
void pushup(int rt){
	if(t[rt].ls)t[t[rt].ls].fa=rt;
	if(t[rt].rs)t[t[rt].rs].fa=rt;
	t[rt].fa=0;
}
void pushadd(int rt,int x){
	if(rt)t[rt].val+=x,t[rt].laz+=x;
}
void pushans(int rt,ll x){
	if(rt)t[rt].ans+=x,t[rt].tag+=x;
}
void pushdown(int rt){
	if(t[rt].laz){
		pushadd(t[rt].ls,t[rt].laz);
		pushadd(t[rt].rs,t[rt].laz);
		t[rt].laz=0;
	}
	if(t[rt].tag){
		pushans(t[rt].ls,t[rt].tag);
		pushans(t[rt].rs,t[rt].tag);
		t[rt].tag=0;
	}
}
void split(int rt,int val,int &x,int &y){
	if(!rt){
		x=y=0;return;
	}
	pushdown(rt);
	if(val<t[rt].val)y=rt,split(t[rt].ls,val,x,t[rt].ls);
	else x=rt,split(t[rt].rs,val,t[rt].rs,y);
	pushup(rt);
}
int merge(int x,int y){
	if(!x||!y)return x|y;
	if(t[x].rnd<t[y].rnd){
		pushdown(x);
		t[x].rs=merge(t[x].rs,y);
		return pushup(x),x;
	}else{
		pushdown(y);
		t[y].ls=merge(x,t[y].ls);
		return pushup(y),y;
	}
}
void insert(int x,int &y){
	if(!x)return;
	pushdown(x);
	insert(t[x].ls,y);
	insert(t[x].rs,y);
	int r1,r2;
	split(y,t[x].val,r1,r2);
	t[x].fa=t[x].ls=t[x].rs=0;
	y=merge(merge(r1,x),r2);
}
ll ans[N];
void update(int rt){
	if(t[rt].fa)update(t[rt].fa);
	pushdown(rt);
}
ll query(int x){
	update(x);
	return t[x].ans;
}
int main(){
	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d%d%d",&a[i],&b[i],&c[i]);
	for(int i=1,l,r,x;i<=m;i++){
		scanf("%d%d%d",&l,&r,&x);
		o[l].push_back({x,i});
		q[r].push_back(i);
	}
	for(int i=1;i<=n;i++){
		for(auto p:o[i]){
			int x,id,r1,r2;
			tie(x,id)=p;
			t[id]={0,0,0,(int)rnd(),x,0,0,0};
			split(root,x,r1,r2);
			root=merge(merge(r1,id),r2);
		}
		if(~b[i]){
			if(a[i]<=b[i]){
				int r1,r2,r3;
				split(root,b[i],r2,r3);
				split(r2,a[i]-1,r1,r2);
				pushans(r2,c[i]);
				root=merge(merge(r1,r2),r3);
			}
		}else{
			int r1,r2,r3;
			split(root,a[i],r1,r2);
			pushans(r2,c[i]);
			pushadd(r2,-a[i]);
			split(r2,a[i],r2,r3);
			insert(r2,r1);
			root=merge(r1,r3);
		}
		for(int x:q[i])ans[x]=query(x);
	}
	for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);
	return 0;
}

标签:rt,rs,--,P9494,zhengjun,int,tag,ls,laz
From: https://www.cnblogs.com/A-zjzj/p/17608515.html

相关文章

  • MySQL学习--索引
    索引的创建有利有弊,创建索引可以提高查询速度,但是过多的索引则会占据许多磁盘空间。因此,在创建索引之前,需要权衡利弊创建索引方式分为手动和自动索引自动索引:设置表中某个字段为主键或者唯一约束时,系统会自动创建关联该字段的唯一索引手动索引:手动在表上创建索引MySQL支持6种......
  • MySQL学习--普通索引
    在创建表时创建索引,已有表创建索引,altertable创建索引1.在创建表时创建索引createtableemp(enamevarchar(20),deptnoint(10)primarykeyauto_increment,indexindex_niu(deptno));explainselect*fromempwheredeptno=22; 2.已有表创建索引createtable......
  • MySQL学习--唯一索引
    唯一索引:就是创建索引时,限制索引的值必须唯一 1.在创建表时创建索引createtableemp(enamevarchar(20),deptnoint(10)primarykeyauto_increment,uniqueindexindex_niu(deptno));explainselect*fromempwheredeptno=22; 2.已有表创建索引createtable......
  • Spark2.2快速入门
    快速入门通过Spark的交互式shell简单介绍一下(Python或Scala)API,然后展示如何使用Java、Scala以及Python编写一个Spark应用程序。Spark2.0版本之前,Spark的核心编程接口是弹性分布式数据集(RDD)。Spark2.0版本之后,RDD被Dataset所取代,Dataset跟RDD......
  • 20230805 Datawhale第一次直播笔记
    机器学习上分技巧内容解析subtask是并列的,并且取最优,那么只需要针对最优进行优化转化为回归问题是否会更加准确数据分析和特征工程是非常关键的部分数据探索性分析(EDA):数据集大小,字段类型缺失值情况特征是否冗余是否存在时间信息标签的分布训练集测试集的分布单变量/......
  • Week6 day7
    importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;publicclassMainimplementsActionListener{JFrameframe;publicstaticvoidmain(String[]args){Maingui=newMain();gui.go......
  • bevy 0.11 camera2d zoom and pan with touchpad on macos
    usebevy::prelude::*;usebevy::{input::mouse::MouseWheel,render::camera::ScalingMode};usebevy::input::touchpad::TouchpadMagnify;usebevy::window::PrimaryWindow;constGRID_SIZE:usize=200;pubstructSimpleCameraPlugin;implPluginforSimpleCam......
  • 【数据结构】散列表
    这种查找结构与线性表和树形结构都不同,前两者的共同特点是关键字与记录位置之间没有确定关系,需要从一个起点不断进行比较查找位置。可以知道散列表(哈希表)是一种完全不同机制的查找结构,不采用基于比较选择的查找机制,而是直接在关键字与位置之间建立映射。所以在讨论它时也和上面......
  • MySQL学习-完整性约束
    notnull约束字段不能为空default设置字段的默认值unique约束字段值唯一primarykey唯一且不为空auto_increment自动增加foreignkey多表之间 ......
  • file input in bootstrap css file 中修改背景颜色和风格
    usethismayhelpyou<divclass="form-group"><divclass="fileUploadbtnbtn-primary"><span>Fileinput</span><inputtype="file"id="exampleInputFile"class="......