各种板子题目

CF438D The Child and Sequence

https://www.luogu.com.cn/problem/CF438D

题目描述

有一个长度为 \(n\) 的数列 \(\{a_n\}\)\(m\) 次操作,操作内容如下:

  1. 格式为 1 l r,表示求 \(\sum \limits _{i=l}^{r} a_i\) 的值并输出。
  2. 格式为 2 l r x,表示对区间 \([l,r]\) 内每个数取模,模数为 \(x\)
  3. 格式为 3 k x,表示将 \(a_k\) 修改为 \(x\)

势能线段树板子,记录区间最大值跳出就行。最多模 \(O(\log n)\) 次。

#include<bits/stdc++.h>
#define wk(x) write(x),putchar(' ')
#define wh(x) write(x),putchar('\n')
#define int long long
#define L (p<<1)
#define R (L|1)
#define MID ((l+r)>>1)
#define N 200005

using namespace std;
int n,m,k,jk,ans,sum,num,cnt,tot;
int dis[N],kis[N];

void read(int &x){
	x=0;int ff=1;char ty=getchar();
	while(!(ty>='0'&&ty<='9')){if(ty=='-')ff=-1;ty=getchar();}
	while(ty>='0'&&ty<='9')x=(x<<3)+(x<<1)+ty-'0',ty=getchar();
	x*=ff;
}

void write(int x){
	if(x==0){putchar('0');return;}
	if(x<0){x=-x;putchar('-');}
	char asd[201];int ip=0;
	while(x)asd[++ip]=x%10+'0',x/=10;
	for(int i=ip;i>=1;i--)putchar(asd[i]);
}

struct WBLT{
	struct P{
		int l,r,max,ans;
	}T[N<<2];
	
	void push_down(int p){
		T[p].ans=T[L].ans+T[R].ans;
		T[p].max=max(T[L].max,T[R].max);
	}
	
	void build(int p,int l,int r){
		T[p].l=l;T[p].r=r;
		if(l==r){
			T[p].max=T[p].ans=dis[l];
			return;
		}build(L,l,MID);build(R,MID+1,r);
		push_down(p);
	}
	
	int query(int p,int l,int r,int x,int y){
//		wk(l),wk(r),wk(x),wh(y);
		if(l>=x&&r<=y) return T[p].ans;int z=0;
		if(MID>=x) z+=query(L,l,MID,x,y);
		if(MID<y) z+=query(R,MID+1,r,x,y);
		return z;
	}
	
	void change(int p,int l,int r,int x,int z){
		if(l==r){
			T[p].ans=T[p].max=z;
			return; 
		}
		if(MID>=x) change(L,l,MID,x,z);
		else change(R,MID+1,r,x,z);
		push_down(p);
	}
	
	void change1(int p,int l,int r,int x,int y,int z){
		if(T[p].max<z) return;
		if(l==r){
			T[p].ans%=z; 
			T[p].max%=z;
			return;
		}
		if(MID>=x) change1(L,l,MID,x,y,z);
		if(MID<y) change1(R,MID+1,r,x,y,z);
		push_down(p);
	}
}T;

signed main(){
	read(n),read(m);
	for(int i=1;i<=n;i++) read(dis[i]);
	T.build(1,1,n);
	while(m--){
		int op,l,r,x;
		read(op),read(l),read(r);
		if(op==1){
			wh(T.query(1,1,n,l,r));
		}else if(op==2){read(x);
			T.change1(1,1,n,l,r,x);
		}else{
			T.change(1,1,n,l,r);
		}
	} 
	return 0;
}

CF786B Legacy

https://www.luogu.com.cn/problem/CF786B

题目描述

三种方案可供购买:

  • 开启一扇从星球 \(v\) 到星球 \(u\) 的传送门;
  • 开启一扇从星球 \(v\) 到标号在 \([l,r]\) 区间范围内任何一个星球的传送门。(即这扇传送门可以从一个星球出发通往多个星球);
  • 开启一扇从标号在 \([l,r]\) 区间范围内任何一个星球到星球 \(v\) 的传送门。(即这扇传送门可以从多个星球出发到达同一个星球);
    v l r w 表示第三种方案,其中 \(v,l,r\) 意思同上,\(w\) 表示此方案价格。

线段树优化建图板子。

#include<bits/stdc++.h>
#define wk(x) write(x),putchar(' ')
#define wh(x) write(x),putchar('\n')
#define int long long
#define L (p<<1)
#define R (L|1)
#define MID ((l+r)>>1)
#define N 200005

using namespace std;
int n,m,k,jk,ans,sum,num,cnt,tot,rt1,rt2;
int dis[N<<3],kis[N<<3];
vector<pair<int,int> > g[N<<3];

void read(int &x){
	x=0;int ff=1;char ty=getchar();
	while(!(ty>='0'&&ty<='9')){if(ty=='-')ff=-1;ty=getchar();}
	while(ty>='0'&&ty<='9')x=(x<<3)+(x<<1)+ty-'0',ty=getchar();
	x*=ff;
}

void write(int x){
	if(x==0){putchar('0');return;}
	if(x<0){x=-x;putchar('-');}
	char asd[201];int ip=0;
	while(x)asd[++ip]=x%10+'0',x/=10;
	for(int i=ip;i>=1;i--)putchar(asd[i]);
}

struct SEG{
	int kis[N];
	 
	struct P{
		int l,r,max,ans,id;
	}T[N<<3];
	
	int build(int l,int r){
		int u=++cnt;if(l==r) return kis[l]=u;
		T[u].l=build(l,MID);T[u].r=build(MID+1,r);
		init(u);return u;
	}
	
	void modify(int p,int l,int r,int x,int y,int w,int v){
		if(x<=l&&y>=r) return Get(p,v,w);
		if(MID>=x) modify(T[p].l,l,MID,x,y,w,v);
		if(MID<y) modify(T[p].r,MID+1,r,x,y,w,v);
		return;
	}
	
	virtual void init(int u);
	virtual void Get(int x,int y,int z);
};

struct SGT1: SEG{
	void init(int u){
		g[u].push_back({T[u].l,0});
		g[u].push_back({T[u].r,0});
		return;
	}
	
	void Get(int x,int y,int z){
		g[y].push_back({x,z});
	}
}T1;

struct SGT2: SEG{
	void init(int u){
		g[T[u].l].push_back({u,0});
		g[T[u].r].push_back({u,0});
		return;
	}
	
	void Get(int x,int y,int z){
		g[x].push_back({y,z});
	}
}T2;

priority_queue<pair<int,int> >q; 

void dijkastra(int x){
	for(int i=1;i<=cnt;i++) kis[i]=1e16;
	kis[x]=0;q.push({0,x}); 
	while(!q.empty()){
		int x=q.top().second;q.pop();
		if(dis[x]) continue;dis[x]=1;
		for(auto v:g[x]){
			if(kis[x]+v.second<kis[v.first]){
//				wh(kis[x]+v.second);
				kis[v.first]=kis[x]+v.second;
				q.push({-kis[v.first],v.first});
			}
		}
	}return;
}

signed main(){
	read(n),read(m),read(k); 
	rt1=T1.build(1,n);rt2=T2.build(1,n);
	for(int i=1;i<=n;i++){
		g[T1.kis[i]].push_back({T2.kis[i],0});
		g[T2.kis[i]].push_back({T1.kis[i],0});
	}
	while(m--){
		int op,l,r,v,w;
		read(op);
		if(op==1){
			read(v),read(w),read(r);
			g[T1.kis[v]].push_back({T1.kis[w],r});
		}else if(op==2){
			read(v),read(l),read(r),read(w);
			T1.modify(rt1,1,n,l,r,w,T2.kis[v]);
		}else{
			read(v),read(l),read(r),read(w);
			T2.modify(rt2,1,n,l,r,w,T1.kis[v]);
		}
	}
	dijkastra(T1.kis[k]);
	for(int i=1;i<=n;i++) wk(kis[T1.kis[i]]==1e16?-1:kis[T1.kis[i]]);
	return 0;
}
posted @ 2026-01-04 11:11  Red_river_hzh  阅读(4)  评论(0)    收藏  举报