Day 16 学习资料(bushi

一、 树状数组

1. lowbit
  • x&-x ,没了
2. 上代码!
void add(int p,int k){
	while(p<=n){
		d[p] += k;
		p += lowbit(p);
	}
}

int query(int x){
	int ans = 0;
	while(x>0){
		ans += d[x];
		x -= lowbit(x);
	}
	return ans;
}
3. 超级树状数组(干爆线段树)

题目:P3372 【模板】线段树 1 - 洛谷 | 计算机科学教育新生态

#include<bits/stdc++.h>
#define int long long
#define lowbit(x) ((x)&-(x))
using namespace std;
int n,m,x,y,d1[500002],d2[500002],o,a[500002],k;

void add(int* d,int p,int k){
	while(p<=n){
		d[p] += k;
		p += lowbit(p);
	}
}

int query(int* d,int x){
	int ans = 0,idx = x;
	while(x>0){
		ans += d[x];
		x -= lowbit(x);
	}
	return ans+a[idx];
}

signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);	cout.tie(0);
	cin >> n >> m;
	for(int i=1;i<=n;i++){
		cin >> x;
		add(d1,i,x-y);
		add(d2,i,(x-y)*(i-1));
		y = x;
	}
	for(int i=1;i<=m;i++){
		cin >> o >> x >> y;
		if(o==1){
			cin >> k;
			add(d1,x,k);	add(d1,y+1,-k);
			add(d2,x,k*(x-1));	add(d2,y+1,-k*y);
		}
		else if(o==2)	cout << (y*query(d1,y)-(x-1)*query(d1,x-1))-(query(d2,y)-query(d2,x-1)) << '\n';
	}

	return 0;
}

二、Trie

1. 普通trie
class trie{
	private:
		int son[50002][3],siz[50002],cnt;
		bool isword[50002];
	public:
		void insert(string s){
			int len = s.size(),pos = 0;
			for(int i=0;i<len;i++){
				int idx = s[i]-'a';	siz[pos]++;
				if(!son[pos][idx])	son[pos][idx] = ++cnt;
				pos = son[pos][idx];
			}
			isword[pos] = 1,siz[pos]++;
		}
		
		bool find(string s){
			int len = s.size(),pos = 0;
			for(int i=0;i<len;i++){
				int idx = s[i]-'a';
				if(!son[pos][idx])	return 0;
				pos = son[pos][idx];
			}
			return isword[pos];
		}
};
2. 01-trie

不会(雾)

小组成员:

李毅皓: 神%%%%%%

孙磊: 神%%%%%%

王浩宇: 神%%%%%%

李灏: 菜鸡
2 个赞