• 神奇的快排…
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std ;
vector<int>a ;
int n ;
int read() {
    int x = 0 , f = 1 ; char s = getchar () ;
    while(s > '9' || s < '0') {if (s == '-') f = -1 ; s = getchar () ;}
    while(s <='9' && s >='0') {x = x * 10 + (s-'0') ; s = getchar () ;}
    return x * f ; 
}
int main () {
    n = read() ;
    for(int i = 1 ; i <= n ; i ++) {
        int x = read() ;
        a.push_back(x) ;
    }
    sort(a.begin() , a.end() ) ;
    for(int i = 0 ; i < a.size() ; i ++) {
        cout << a[i] << " " ;
    }
    return 0 ;
}
  • 树状数组1
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxn 500010
using namespace std ;
int n , m , opt ;
int read() {
    int x = 0 , f = 1 ; char s = getchar () ;
    while(s > '9' || s < '0') {if (s == '-') f = -1 ; s = getchar () ;}
    while(s <='9' && s >='0') {x = x * 10 + (s-'0') ; s = getchar () ;}
    return x * f ;
}
struct Tree {
    int c[maxn] ;
    int lowbit(int x) {
        return x&(-x) ;
    }
    void update(int x ,int k) {
        for(int i = x ; i <= n ; i += lowbit(i) ) {
            c[i] += k ;
        }
    } 
    int query(int x) {
        int ans = 0 ;
        for(int i = x ; i ; i -= lowbit(i)) {
            ans += c[i] ;
        }
        return ans ;
    }
}tree ;
int main () { 
    n = read() , m = read() ;
    for(int i = 1 ; i <= n ; i ++) {
        int x = read() ;
        tree.update(i,x) ;
    }
    for(int i = 1 ; i <= m ; i ++) {
        opt = read() ;
        if(opt == 1) {
            int x , k ;
            x = read() , k = read() ;
            tree.update(x,k) ;
        }else {
            int x , y ;
            x = read() , y = read() ;
            cout << tree.query(y) - tree.query(x-1) <<endl ;
        }
    }
    return 0 ;
}
  • 树状数组2
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxn 500010
using namespace std ;
int n , m , opt ;
int read() {
    int x = 0 , f = 1 ; char s = getchar () ;
    while(s > '9' || s < '0') {if (s == '-') f = -1 ; s = getchar () ;}
    while(s <='9' && s >='0') {x = x * 10 + (s-'0') ; s = getchar () ;}
    return x * f ;
}
struct Tree {
    int c[maxn] ;
    int lowbit(int x) {
        return x&(-x) ;
    }
    void update(int x ,int k) {
        for(int i = x ; i <= n ; i += lowbit(i) ) {
            c[i] += k ;
        }
    } 
    int query(int x) {
        int ans = 0 ;
        for(int i = x ; i ; i -= lowbit(i)) {
            ans += c[i] ;
        }
        return ans ;
    }
}tree ;
int a[maxn] ;
int main () { 
    n = read() , m = read() ;
    for(int i = 1 ; i <= n ; i ++) {
        a[i] = read() ;
        int hh = a[i] - a[i-1] ;
        tree.update(i,hh) ;
    }
    for(int i = 1 ; i <= m ; i ++) {
        opt = read() ;
        if(opt == 1) {
            int x , k , y ;
            x = read() , y = read() ,k = read() ;
            tree.update(x,k) ;
            tree.update(y+1,-k) ;
        }else {
            int x , y ;
            x = read() ; //, y = read() ;
            cout << tree.query(x) <<endl ;
        }
    }
    return 0 ;
}

线段树1qwq

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxn 444444
#define int long long 
using namespace std ;
struct dy{
	int lc , rc , sum , tag ;
}tree[maxn] ;
int n , m , opt ,x , y ,z , a[maxn] ;
void pushup (int u ) {
	tree[u].sum = tree[tree[u].lc].sum + tree[tree[u].rc].sum ;
	return ;
} 
void pushdown(int u , int l , int r) {
	int mid = (l+r) >> 1 ;
	tree[tree[u].lc].sum += tree[u].tag * (mid-l+1) ;
	tree[tree[u].lc].tag += tree[u].tag ;
	tree[tree[u].rc].sum += tree[u].tag * (r-mid) ;
	tree[tree[u].rc].tag += tree[u].tag ;
	tree[u].tag = 0 ;
}
int t = 1 ;
void build (int u , int l ,int r) {
	if(l == r) {
		tree[u].sum = a[l] ;
		return ;
	}
	int mid = (l+r) >> 1 ;
	tree[u].lc = ++t ;
	build(tree[u].lc,l,mid) ;
	tree[u].rc = ++t ;
	build(tree[u].rc,mid+1,r) ;
	pushup(u) ;
}
void update(int u ,int l ,int r,int ll ,int rr ,int w) {
	if(l == ll && r == rr) {
		tree[u].sum += (r-l+1)*w ;
		tree[u].tag += w ;
		return ;
	}
	int mid = (l+r) >> 1 ;
	pushdown(u,l,r) ;
	if(rr <= mid) update(tree[u].lc , l,mid,ll,rr,w) ;
	else if(ll > mid) update(tree[u].rc,mid+1,r,ll,rr,w) ;
	else {
		update(tree[u].lc,l,mid,ll,mid,w) ;
		update(tree[u].rc,mid+1,r,mid+1,rr,w) ;
	}
	pushup(u) ;
}int ans = 0 ;
void query(int u ,int l ,int r,int ll ,int rr) {
	if(l == ll && r == rr) {
		ans += tree[u].sum ;
		return ;
	}
	int mid = (l+r) >> 1 ;
	pushdown(u,l,r) ;
	if(rr <= mid) query(tree[u].lc,l,mid,ll,rr) ;
	else if(ll > mid) query(tree[u].rc,mid+1,r,ll,rr) ;
	else {
		query(tree[u].lc,l,mid,ll,mid) ;
		query(tree[u].rc,mid+1,r,mid+1,rr) ;
	}
	pushup(u) ;
}
int read(){
	int x = 0 , f = 1 ; char s = getchar () ;
	while(s > '9' || s < '0') {if (s == '-') f = -1 ; s = getchar () ;}
	while(s <='9' && s >='0') {x = x * 10 + (s-'0') ; s = getchar () ;}
	return x*f ;
}
signed main () {
	n = read() , m = read() ;
	for(int i = 1 ; i <= n ; i ++) {
		a[i] = read() ;
	}
	build(1,1,n) ;
	for(int i = 1 ; i <= m ; i ++) {
		opt = read() , x = read() , y = read() ;
		if(opt == 1) {
			z = read() ;
			update(1,1,n,x,y,z) ;
		}else {
			ans = 0 ;
			query(1,1,n,x,y) ;
			cout << ans << endl ;
		}
	}
	return 0 ;
}