专栏文章

个人代码基础模板

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min0c76w
此快照首次捕获于
2025/12/01 18:29
3 个月前
此快照最后确认于
2025/12/01 18:29
3 个月前
查看原文
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6;
struct pai{
    long long sum,maxx,tag;
};
int n,m;
struct tree{
	pai t[N];
    int _merge(int a,int b,int op){
        if(op==1){
            return a+b;
        }
        if(op==2){
            return max(a,b);
        }
        return 0;
    }
	pai merge(pai a,pai b){
	    pai ret{_merge(a.sum,b.sum,1),_merge(a.maxx,b.maxx,2),0};
	    return ret;
	}
	// void push_down(int k,int cl,int cr){
	// 	if(t[k].tag==0){
	// 		return;
	// 	}
	//     int lc=k<<1,rc=lc+1;
	// 	int mid=(cl+cr)>>1;
	//     t[lc].tag+=t[k].tag;
	//     t[rc].tag+=t[k].tag;
	//     t[lc].sum+=(mid-cl+1)*t[k].tag;
	//     t[rc].sum+=(cr-mid)*t[k].tag;
	//     t[k].tag=0;
	// }
	void build(int a[],int k,int cl,int cr){
		if(cl==cr){
			t[k].maxx=t[k].sum=a[cl];
			return;
		}
	    int lc=k<<1,rc=lc+1;
		int mid=(cl+cr)>>1;
		build(a,lc,cl,mid);
		build(a,rc,mid+1,cr);
	    t[k]=merge(t[lc],t[rc]);
	}
	void init(int a[]){
	    build(a,1,1,n);
	}
	long long qry(int k,int l,int r,int cl,int cr){
	    if(cl>r||cr<l){
	        return 0;
	    }
		if(cl>=l&&cr<=r){
			return t[k].sum;
		}
	    int lc=k<<1,rc=lc+1;
		int mid=(cl+cr)>>1;
	    // push_down(k,cl,cr);
		return _merge(qry(lc,l,r,cl,mid),qry(rc,l,r,mid+1,cr),1);
	}
	void modify(int k,int l,int r,int cl,int cr){
	    if(cl>r||cr<l){
	        return;
	    }
        // cerr<<l<<" "<<r<<"\n";
		if(cl==cr){
            // cerr<<k<<" "<<t[k].sum<<"\n";
            t[k].maxx=t[k].sum=sqrt(t[k].sum);
	        return;
		}
	    int lc=k<<1,rc=lc+1;
		int mid=(cl+cr)>>1;
	    // push_down(k,cl,cr);
        if(t[lc].maxx>1){
            modify(lc,l,r,cl,mid);
        }
        if(t[rc].maxx>1){
            modify(rc,l,r,mid+1,cr);
        }
	    t[k]=merge(t[lc],t[rc]);
	}
}tr;
int a[N];
signed main(){
    int tttk=0;
    while(~scanf("%lld",&n)){
        printf("Case #%lld:\n",++tttk);
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
        }
        tr.init(a);
        scanf("%lld",&m);
        for(int i=1;i<=m;i++){
            int op;
            scanf("%lld",&op);
            if(op==0){
                int x,y;
                scanf("%lld%lld",&x,&y);
                if(x>y){
                    swap(x,y);
                }
                tr.modify(1,x,y,1,n);
            }else{
                int x,y;
                scanf("%lld%lld",&x,&y);
                if(x>y){
                    swap(x,y);
                }
                printf("%lld\n",tr.qry(1,x,y,1,n));
            }
        }
        printf("\n");
    }
	return 0;
}
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6;
struct pai{
    long long thi,tag;
};
int n,m;
struct tree{
	pai t[N];
    int _merge(int a,int b){
        return a+b;
    }
	pai merge(pai a,pai b){
	    pai ret{_merge(a.thi,b.thi),0};
	    return ret;
	}
	void push_down(int k,int cl,int cr){
		if(t[k].tag==0){
			return;
		}
	    int lc=k<<1,rc=lc+1;
		int mid=(cl+cr)>>1;
	    t[lc].tag+=t[k].tag;
	    t[rc].tag+=t[k].tag;
	    t[lc].thi+=(mid-cl+1)*t[k].tag;
	    t[rc].thi+=(cr-mid)*t[k].tag;
	    t[k].tag=0;
	}
	void build(int a[],int k,int cl,int cr){
		if(cl==cr){
			t[k].thi=a[cl];
			return;
		}
	    int lc=k<<1,rc=lc+1;
		int mid=(cl+cr)>>1;
		build(a,lc,cl,mid);
		build(a,rc,mid+1,cr);
	    t[k]=merge(t[lc],t[rc]);
	}
	void init(int a[]){
	    build(a,1,1,n);
	}
	long long qry(int k,int l,int r,int cl,int cr){
	    if(cl>r||cr<l||l>r){
	        return 0;
	    }
		if(cl>=l&&cr<=r){
			return t[k].thi;
		}
	    int lc=k<<1,rc=lc+1;
		int mid=(cl+cr)>>1;
	    push_down(k,cl,cr);
		return _merge(qry(lc,l,r,cl,mid),qry(rc,l,r,mid+1,cr));
	}
	void modify(int k,int l,int r,int cl,int cr,long long x){
	    if(cl>r||cr<l||l>r){
	        return;
	    }
		if(l<=cl&&r>=cr){
	        t[k].tag+=x;
	        t[k].thi+=x*(cr-cl+1);
	        return;
		}
	    int lc=k<<1,rc=lc+1;
		int mid=(cl+cr)>>1;
	    push_down(k,cl,cr);
	    modify(lc,l,r,cl,mid,x);
	    modify(rc,l,r,mid+1,cr,x);
	    t[k]=merge(t[lc],t[rc]);
	}
}tr;
int a[N];
signed main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++){
    	scanf("%lld",&a[i]);
	}
    tr.init(a);
    for(int i=1;i<=m;i++){
        int k;
        scanf("%lld",&k);
        if(k==1){
            int x,y,z;
            scanf("%lld%lld%lld",&x,&y,&z);
            tr.modify(1,x,y,1,n,z);
        }else{
            int x,y;
            scanf("%lld%lld",&x,&y);
            printf("%lld\n",tr.qry(1,x,y,1,n));
        }
    }
	return 0;
}
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+101;
long long tree[N<<1];
long long a[N];
int n,m;
int lowbit(int x){
    return x&(-x);
}
void add(int x,int y){
    for(int i=x;i<=n;i+=lowbit(i)){
        tree[i]+=y;
    }
}
long long sum(int x){
    long long sum=0;
    for(int i=x;i!=0;i-=lowbit(i)){
        sum+=tree[i];
    }
    return sum;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        add(i,a[i]-a[i-1]);
    }
    for(int i=1;i<=m;i++){
        int k;
        scanf("%d",&k);
        if(k==1){
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            add(x,z);
            add(y+1,-z);
        }else{
            int x;
            scanf("%d",&x);
            printf("%lld\n",sum(x));
        }
    }
    return 0;
}
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[200001];
int loge[200001],st[200001][31];
void init(){
    for(int i=2;i<=n;i++){
        loge[i]=loge[i>>1]+1;
    }
    for(int i=1;i<=n;i++){
        st[i][0]=a[i];
    }
    for(int i=1;(1<<i)<=n;i++){
        for(int j=1;j<=n-(1<<i)+1;j++){
            st[j][i]=min(st[j][i-1],st[j+(1<<(i-1))][i-1]);
        }
    }
}
int find(int x,int y){
    int l=loge[y-x+1];
    return min(st[x][l],st[y-(1<<l)+1][l]);
}
signed main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    init();
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%d ",find(x,y));
    }
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...