• 模板大全


    持续咕咕咕。

    数据结构

    线段树。

    #include<bits/stdc++.h>
    const int maxn = 1001000;
    typedef long long ll;
    int n,q,a[maxn];
    ll tree[maxn << 2],tg[maxn << 2];
    inline void put(int cur,ll v,int len){ tree[cur] += v * len,tg[cur] += v; }
    inline void down(int cur,int len){
    	if(tg[cur])
    		put(cur << 1,tg[cur],len + 1 >> 1),put(cur << 1 | 1,tg[cur],len >> 1),tg[cur] = 0;
    }
    inline void up(int cur){ tree[cur] = tree[cur << 1] + tree[cur << 1 | 1]; }
    inline void modify(int cur,int ql,int qr,int v,int l=1,int r=n){
    	if(ql <= l && r <= qr) return put(cur,v,r-l+1);
    	int mid = l + r >> 1; down(cur,r-l+1);
    	if(ql <= mid) modify(cur << 1,ql,qr,v,l,mid);
    	if(mid < qr) modify(cur << 1 | 1,ql,qr,v,mid+1,r);
    	up(cur);
    }
    inline ll query(int cur,int ql,int qr,int l=1,int r=n){
    	if(ql <= l && r <= qr) return tree[cur];
    	int mid = l + r >> 1; ll ans = 0; down(cur,r-l+1);
    	if(ql <= mid) ans += query(cur << 1,ql,qr,l,mid);
    	if(mid < qr) ans += query(cur << 1 | 1,ql,qr,mid+1,r);
    	return ans;
    }
    inline void build(int cur,int l,int r){
    	if(l == r) return void(tree[cur] = a[l]);
    	int mid = l + r >> 1;
    	build(cur << 1,l,mid),build(cur << 1 | 1,mid + 1,r),up(cur);
    }
    int main(){
    	std::ios::sync_with_stdio(false),std::cin.tie(0);
    	std::cin >> n >> q;
    	for(int i=1;i<=n;++i) std::cin >> a[i];
    	build(1,1,n);
    	for(int i=1,op,l,r,x;i<=q;++i){
    		std::cin >> op >> l >> r;
    		if(op == 1)
    			std::cin >> x,modify(1,l,r,x);
    		else
    			std::cout << query(1,l,r) << '
    ';
    	}
    }
    
    

    树状数组

    #include<bits/stdc++.h>
    const int maxn = 1001000;
    typedef long long ll;
    int n,q,a[maxn];
    ll a1[maxn],a2[maxn];
    inline void add(ll * x,int p,ll v){ for(;p < maxn;p += p & -p) x[p] += v; }
    inline ll query(ll * x,int p,ll ans=0){ for(;p;p&=p-1) ans += x[p]; return ans; }
    int main(){
    	std::ios::sync_with_stdio(false),std::cin.tie(0);
    	std::cin >> n >> q;
    	for(int i=1;i<=n;++i) std::cin >> a[i];
    	for(int i=n;i>=1;--i) a[i] -= a[i-1], add(a1,i,a[i]), add(a2,i,a[i] * ll(i));
    	for(int i=1,op,l,r,x;i<=q;++i){
    		std::cin >> op >> l >> r;
    		if(op == 1) std::cin >> x, add(a1,l,x), add(a2,l,x * ll(l)), add(a1,r + 1,-x), add(a2,r + 1,-x * ll(r + 1));
    		else std::cout << query(a1,r) * (r + 1) - query(a2,r) - query(a1,l - 1) * l + query(a2,l - 1) << '
    ';
    	}
    }
    
    

    网络流

    最大流

    #include<bits/stdc++.h>
    const int maxn = 200100;
    struct T {
    	int to, nxt, v;
    } way[maxn << 4];
    int h[maxn], head[maxn], num = 1;
    inline void adde(int x,int y,int v) {
    	way[++num] = {y, h[x], v}, h[x] = num;
    	way[++num] = {x, h[y], 0}, h[y] = num;
    }
    int dis[maxn];
    inline bool bfs(int s,int t) {
    	std::queue<int> q;
    	for(int i = s;i <= t;++i) dis[i] = - 1, head[i] = h[i];
    	for(q.push(s), dis[s] = 0;!q.empty();) {
    		int t = q.front(); q.pop();
    		for(int i = h[t];i;i = way[i].nxt) if(way[i].v && dis[way[i].to] < 0) 
    			dis[way[i].to] = dis[t] + 1, q.push(way[i].to);
    	}
    	return dis[t] >= 0;
    }
    inline int dfs(int s,int t,int lim) {
    	if(s == t || !lim) return lim;
    	int ans = 0, mn;
    	for(int & i = head[s];i;i = way[i].nxt)
    		if(dis[way[i].to] == dis[s] + 1 && (mn = dfs(way[i].to, t, std::min(lim, way[i].v)))) {
    			way[i].v -= mn;
    			way[i ^ 1].v += mn;
    			ans += mn; lim -= mn;
    			if(!lim) break;
    		}
    	return ans;
    }
    inline int dinic(int s,int t) {
    	int ans = 0;
    	for(;bfs(s,t);) ans += dfs(s,t,1e9);
    	return ans;
    }
    
    int main() {}
    

    费用流

    #include<bits/stdc++.h>
    #include<bits/extc++.h>
    
    typedef long long ll;
    const int maxn = 100100;
    
    const int dijkstra_tag = 114514;
    const int bellmanford_tag = 1919810;
    template <const int Tag = dijkstra_tag, const int node_cnt = 100000, const int edge_cnt = 1000000>
    struct Graph {
    	static const int maxn = node_cnt + 10;
    	struct edge {
    		int to, nxt, v, f;
    	} way[(edge_cnt + 100) << 1];
    	int h[node_cnt], H[node_cnt], num, minidx, maxidx;
    	inline Graph() {
    		num = 1;
    		minidx = 1e9;
    		maxidx = 0;
    	}
    	inline void update(int x) {
    		if(x < minidx) minidx = x;
    		if(x > maxidx) maxidx = x;
    	}
    	inline void link(int x, int y, int v, int f) {
    		update(x), update(y);
    		way[++num] = {y, h[x], v, f}, h[x] = num;
    		way[++num] = {x, h[y], 0, -f}, h[y] = num;
    	}
    	typedef long long ll;
    	static const ll inf = 1e18;
    	ll dis[maxn], d[maxn];
    	int vis[maxn];
    	inline ll calc(int x) {
    		return Tag == dijkstra_tag ? way[x].f + d[way[x ^ 1].to] - d[way[x].to] : way[x].f; 
    	}
    	inline bool bellmanford(ll * dis, int s, int t) {
    		std::queue<int> q;
    		static int inq[maxn];
    		for(int i = minidx;i <= maxidx;++i) dis[i] = inf;
    		dis[s] = 0, q.push(s);
    		for(;q.size();) {
    			int x = q.front(); q.pop();
    			inq[x] = 0;
    			for(int i = h[x];i;i = way[i].nxt) if(way[i].v) {
    				if(dis[way[i].to] > dis[x] + way[i].f) {
    					dis[way[i].to] = dis[x] + way[i].f;
    					if(!inq[way[i].to]) {
    						q.push(way[i].to);
    						inq[way[i].to] = 0;
    					}
    				}
    			}
    		}
    		return dis[t] < inf;
    	}
    	inline bool dijkstra(int s, int t) {
    		typedef std::pair<ll, int> pr;
    		static int vis[maxn];
    
    		__gnu_pbds::priority_queue<pr, std::greater<pr>> q;
    		static __gnu_pbds::priority_queue<pr, std::greater<pr>>::point_iterator iter[maxn];
    		for(int i = minidx;i <= maxidx;++i) iter[i] = q.push(pr(dis[i] = inf, i)), vis[i] = 0;
    		q.modify(iter[s], pr(dis[s] = 0, s));
    		for(;q.size();) {
    			int x = q.top().second; q.pop();
    			if(vis[x]) continue;
    			vis[x] = 1;
    			for(int i = h[x];i;i = way[i].nxt) if(way[i].v) {
    				if(dis[way[i].to] > dis[x] + calc(i)) {
    					q.modify(iter[way[i].to], pr(dis[way[i].to] = dis[x] + calc(i), way[i].to));
    				}
    			}
    		}
    		return dis[t] < inf;
    	}
    	inline int dfs(int x, int t, int lim) {
    		if(x == t || !lim) return lim;
    		int ans = 0, mn;
    		vis[x] = 1;
    		for(int &i = H[x];i;i = way[i].nxt) {
    			if(!vis[way[i].to] && dis[way[i].to] == dis[x] + calc(i) && (mn = dfs(way[i].to, t, std::min(lim, way[i].v)))) {
    				ans += mn, lim -= mn;
    				way[i].v -= mn, way[i ^ 1].v += mn;
    				if(!lim) break;
    			}
    		}
    		vis[x] = 0;
    		return ans;
    	}
    	inline std::pair<ll, ll> flow(int s, int t) {
    		ll cost = 0, sum = 0;
    		if(dijkstra_tag == Tag) {
    			bellmanford(d, s, t);
    			for(;dijkstra(s, t);) {
    				for(int i = minidx;i <= maxidx;++i) H[i] = h[i];
    				int c = dfs(s, t, 1e9);
    				for(int i = minidx;i <= maxidx;++i) d[i] += dis[i];
    				sum += c, cost += c * d[t];
    			}
    		} else {
    			for(;bellmanford(dis, s, t);) {
    				for(int i = minidx;i <= maxidx;++i) H[i] = h[i];
    				int c = dfs(s, t, 1e9);
    				sum += c;
    				cost += c * dis[t];
    			}
    		}
    		return {sum, cost};
    	}
    };
    Graph<> G;
    int n, m, s, t;
    int main() {
    	using std::cin;
    	using std::cout;
    	std::ios::sync_with_stdio(false), cin.tie(0);
    	cin >> n >> m >> s >> t;
    	for(int i = 1, u, v, w, f;i <= m;++i) {
    		cin >> u >> v >> w >> f;
    		G.link(u, v, w, f);
    	}
    	auto res = G.flow(s, t);
    	cout << res.first << ' ' << res.second << '
    ';
    }
    
    

    图论

    最近公共祖先

    #define _[1<<21]
    #define Q scanf("%d%d"
    #define M(x,y)D[x]<D[y]?x:y
    i,x,j,D _,d _,s[20]_,T,h _,O _,N _,I;S(x,f,i){for(d[x]=++T,D[x]=D[f]+1,i=h[x];i;i=N[i])O[i]==f?:S(O[i],T[*s]=x);}A(x,j){N[++I]=h[x],O[h[x]=I]=j;}main(q){for(Q,d,&q);--*d;A(j,x))Q,&x,&j),A(x,j);for(S(1,0);x=i<19;++i)for(;s[i+1][x]=M(s[i][x],s[i][x+(1<<i)]);++x);for(;q--;printf("%d ",x^i?M(s[I][x],s[I][i-(1<<I)]):j))Q,&x,&j),x=d[x],i=d[j],x>i?x^=i^=x^=i:0,I=log2(i-x);}
    
  • 相关阅读:
    MySQL · 引擎特性 · InnoDB 事务锁简介
    锁大全与 GDB调试
    docker(4):coreos+docker+rancher真厉害
    TIDB ---NEW SQL
    Linux的内存回收和交换
    TLS握手优化详解
    北风网JAVA 大数据培训
    MySQL 5.7 深度解析: JSON数据类型使用
    MySQL 5.7 深度解析: 临时表空间
    在Linux最大打开文件数限制下 MySQL 对参数的调整
  • 原文地址:https://www.cnblogs.com/skip1978/p/11425257.html
Copyright © 2020-2023  润新知