各种板子题目
CF438D The Child and Sequence
https://www.luogu.com.cn/problem/CF438D
题目描述
有一个长度为 \(n\) 的数列 \(\{a_n\}\) 和 \(m\) 次操作,操作内容如下:
- 格式为
1 l r,表示求 \(\sum \limits _{i=l}^{r} a_i\) 的值并输出。 - 格式为
2 l r x,表示对区间 \([l,r]\) 内每个数取模,模数为 \(x\)。 - 格式为
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;
}
本文来自博客园,作者:Red_river_hzh,转载请注明原文链接:https://www.cnblogs.com/Red-river-hzh/p/19436598

浙公网安备 33010602011771号