结构体模板(持续更新)
树状数组:
点击查看代码
//1
struct Tree {
vector<int> tr; //vector 方便每根据需要的大小开
Tree(int n) : n(n), tr(n + 1) {}
// Tree(int n) : tr(n + 1){ //初始化
// iota(tr.begin(), tr.end(), 0);
// }
inline int lowbit(int x) {
return x & -x;
}
inline void add(int x, int v) {
for (; x <= n; x += lowbit(x))
tr[x] += v;
}
inline int ask(int x) {
int res = 0;
for (; x; x -= lowbit(x))
res += tr[x];
return res;
}
void clear() {
tr.clear();
}
}t1(n),t2(n);;
//2
struct Fenwick {
int tr[N];
inline int lowbit(int x) {
return x & -x;
}
inline void add(int x, int v) {
for (; x <= n; x += lowbit(x))
tr[x] += v;
}
inline int ask(int x) {
int res = 0;
for (; x; x -= lowbit(x))
res += tr[x];
return res;
}
void clear() {
memset(tr, 0, sizeof tr);
}
}t1,t2;
并查集:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
using LL = long long;
// DSU with Size
struct DSU{ //并查集板子
vector<int> p, sz; //p 表示集合 , se表示集合个数
DSU(int n) : p(n + 1), sz(n + 1, 1){ //初始化
iota(p.begin(), p.end(), 0);
}
int find(int x){ //寻找根节点
return p[x] == x ? x : p[x] = find(p[x]);
}
bool same(int x, int y) { //判断是否相同,根节点
return find(x) == find(y);
}
bool merge(int x, int y){ //合并集合
x = find(x), y = find(y);
if (x == y) return false;
if (sz[x] < sz[y]) swap(x, y);
sz[x] += sz[y];
p[y] = x;
return true;
}
int size(int x) { //输出集合点数
return sz[find(x)];
}
};
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n,m;
cin>>n>>m;
DSU dsu(n);
char c;
int x,y;
while(m--)
{
cin>>c>>x>>y;
if(c=='Q')
{
if(dsu.same(x,y)) cout<<"Yes\n";
else cout<<"No\n";
}
else
{
dsu.merge(x,y);
}
}
return 0;
}
线段树 :
点击查看代码
ll f[N*4];
ll n,m,p;
struct tt
{
ll sum;
ll add;
ll val;
}e[N*4];
void buildtree(int k,int l,int r)
{
e[k].val=1;
e[k].add=0;
if(l==r)
{
e[k].sum=f[l];
return;
}
int mid=(l+r)>>1;
buildtree(lz);
buildtree(rz);
e[k].sum=e[k<<1].sum+e[k<<1|1].sum;
return ;
}
void pushdown(int k,int o)//o表示 区间len
{
int kl=k<<1,kr=k<<1|1;
e[kl].sum=(e[kl].sum*e[k].val+e[k].add*(o-(o>>1)))%p;
e[kr].sum=(e[kr].sum*e[k].val+e[k].add*(o>>1))%p;
e[kl].val=(e[kl].val*e[k].val)%p;
e[kr].val=(e[kr].val*e[k].val)%p;
e[kl].add=(e[kl].add*e[k].val+e[k].add)%p;
e[kr].add=(e[kr].add*e[k].val+e[k].add)%p;
e[k].val=1;
e[k].add=0;
return;
}
void add(int k,int l,int r,int x,int y,int w)//x~y add w
{
if(x<=l&&y>=r)
{
e[k].add=(e[k].add+w)%p;
e[k].sum=(e[k].sum+(r-l+1)*w)%p;
return ;
}
pushdown(k,r-l+1);
int mid=(l+r)>>1;
if(x<=mid)
add(lz,x,y,w);
if(y>mid)
add(rz,x,y,w);
e[k].sum=(e[k<<1].sum+e[k<<1|1].sum)%p;
return;
}
void mul(int k,int l,int r,int x,int y,int w)
{
if(x<=l&&y>=r)
{
e[k].val=(e[k].val*w)%p;
e[k].add=(e[k].add*w)%p;
e[k].sum=(e[k].sum*w)%p;
return ;
}
pushdown(k,r-l+1);
int mid=(l+r)>>1;
if(x<=mid)
mul(lz,x,y,w);
if(y>mid)
mul(rz,x,y,w);
e[k].sum=(e[k<<1].sum+e[k<<1|1].sum)%p;
return ;
}
ll query(int k,int l,int r,int x,int y)
{
if(x<=l&&y>=r)
{
return e[k].sum%p;
}
int mid=(l+r)>>1;
pushdown(k,r-l+1);
ll temp=0;
if(x<=mid)
temp=(temp+query(lz,x,y));
if(y>mid)
temp=(temp+query(rz,x,y));
e[k].sum=(e[k<<1].sum+e[k<<1|1].sum)%p;
return temp%p;
}