专栏文章
个人代码基础模板
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min0c76w
- 此快照首次捕获于
- 2025/12/01 18:29 3 个月前
- 此快照最后确认于
- 2025/12/01 18:29 3 个月前
-
欧拉路径:
#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;
}
-
线段树:
#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;
}
-
树状数组:
#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;
}
-
ST表:
#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 条评论,欢迎与作者交流。
正在加载评论...