DS

 

树状模板:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstdlib>

using namespace std;
typedef long long ll;
const int N=2e5+10;
int n,a[N],great[N],low[N];
int tr[N];
//树状数组 :好调,好写 
//差分,公式 
//1)快速求前缀和logn
//2)修改某一个数logn

int lowbit(int x){  
	return x&-x;
} 
void add(int x,int c){
	for(int i=x;i<=n;i+=lowbit(i))tr[i]+=c;
} 
int sum(int x){
	int res=0;
	for(int i=x;i;i-=lowbit(i))res+=tr[i];
	return res;
}

 

线段树:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstdlib>

using namespace std;
typedef long long ll;
const int N=2e5+10;
int n;

struct Node{
	int l,r;
	int v;
}tr[N*4];
void pushup(int u){
	tr[u].v=max(tr[u<<1].v,tr[u<<1|1].v);
}
void build(int u,int l,int r){
	tr[u]={l,r};
	if(l==r)return;
	int mid=l+r>>1;
	build(u<<1,l,mid),build(u<<1|1,mid+1,r);
}
int query(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r)return tr[u].v;
	int mid=tr[u].l+tr[u].r>>1;
	int v=0;
	if(l<=mid)v=query(u<<1,l,r);
	if(r>mid)v=max(v,query(u<<1|1,l,r));
	return v;
}
void modify(int u,int x,int v){
	if(tr[u].l==x&&tr[u].r==x)tr[u].v=v;
	else{
		int mid=tr[u].l+tr[u].r>>1;
		if(x<=mid)modify(u<<1,x,v);
		else modify(u<<1|1,x,v);
		pushup(u);
	}
}

  

posted @ 2021-08-15 15:20  reene444  阅读(65)  评论(0)    收藏  举报