• 备战NOIP——模板复习14


    这里只有模板,并不作讲解,仅为路过的各位做一个参考以及用做自己复习的资料,转载注明出处。

    树状数组(B.I.T)

    单点修改区间查询

    /*Copyright: Copyright (c) 2018
    *Created on 2018-11-02  
    *Author: 十甫
    *Version 1.0 
    *Title: BIT-1
    *Time: 5 mins
    */
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    const int size = 10005;
    
    inline int lowbit(int x) {
    	return x & (-x);
    }
    int n, arr[size];
    inline void add(int a[], int i, int k) {
    	while(i <= n) {
    		a[i] += k;
    		i += lowbit(i);
    	}
    }
    inline int query(int a[], int i) {
    	int res = 0;
    	while(i) {
    		res += a[i];
    		i -= lowbit(i);
    	}
    	return res;
    }
    
    int main() {
    	scanf("%d", &n);
    	for(int i = 1;i <= n;i++) {
    		int k;
    		scanf("%d", &k);
    		add(arr, i, k);
    	}
    	int q;
    	scanf("%d", &q);
    	while(q--) {
    		int man;
    		scanf("%d", &man);
    		if(man) {
    			int i, k;
    			scanf("%d%d", &i, &k);
    			add(arr, i, k);
    		} else {
    			int l, r;
    			scanf("%d%d", &l, &r);
    			printf("%d
    ", query(arr, r) - query(arr, l - 1));
    		}
    	}
    	return 0;
    }

    区间修改单点查询

    /*Copyright: Copyright (c) 2018
    *Created on 2018-11-02  
    *Author: 十甫
    *Version 1.0 
    *Title: BIT-2
    *Time: 4.5 mins
    */
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    const int size = 10005;
    
    inline int lowbit(int x) {
    	return x & (-x);
    }
    int n, arr[size];
    inline void add(int a[], int i, int k) {
    	while(i <= n) {
    		a[i] += k;
    		i += lowbit(i);
    	}
    }
    inline int query(int a[], int i) {
    	int res = 0;
    	while(i) {
    		res += a[i];
    		i -= lowbit(i);
    	}
    	return res;
    }
    
    int main() {
    	scanf("%d", &n);
    	int last = 0;
    	for(int i = 1;i <= n;i++) {
    		int k;
    		scanf("%d", &k);
    		add(arr, i, k - last);
    		last = k;
    	}
    	int q;
    	scanf("%d", &q);
    	while(q--) {
    		int man;
    		scanf("%d", &man);
    		if(man) {
    			int l, r, k;
    			scanf("%d%d%d", &l, &r, &k);
    			add(arr, l, k), add(arr, r + 1, -k);
    		} else {
    			int i;
    			scanf("%d", &i);
    			printf("%d
    ", query(arr, i));
    		}
    	}
    	return 0;
    }

    区间修改区间查询

    /*Copyright: Copyright (c) 2018
    *Created on 2018-11-02  
    *Author: 十甫
    *Version 1.0 
    *Title: BIT-3
    *Time: 7 mins
    */
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    const int size = 10005;
    
    inline int lowbit(int x) {
    	return x & (-x);
    }
    int n, num[size], d1[size], d2[size];
    inline void add(int a[], int i, int k) {
    	while(i <= n) {
    		a[i] += k;
    		i += lowbit(i);
    	}
    }
    inline int query(int a[], int i) {
    	int res = 0;
    	while(i) {
    		res += a[i];
    		i -= lowbit(i);
    	}
    	return res;
    }
    inline void modify(int l, int r, int k) {
    	add(d1, l, k), add(d1, r + 1, -k);
    	add(d2, l, l * k), add(d2, r + 1, -k * (r + 1));
    }
    inline int enquiry(int l, int r) {
    	int res = 0;
    	res += query(num, r) - query(num, l - 1);
    	res += (r + 1) * query(d1, r) - l * query(d1, l - 1);
    	res -= query(d2, r) - query(d2, l - 1);
    	return res;
    }
    int main() {
    	scanf("%d", &n);
    	for(int i = 1;i <= n;i++) {
    		int k;
    		scanf("%d", &k);
    		add(num, i, k);
    	}
    	int q;
    	scanf("%d", &q);
    	while(q--) {
    		int man;
    		scanf("%d", &man);
    		if(man) {
    			int l, r, k;
    			scanf("%d%d%d", &l, &r, &k);
    			modify(l, r, k);
    		} else {
    			int l, r;
    			scanf("%d%d", &l, &r);
    			printf("%d
    ", enquiry(l, r));
    		}
    	}
    	return 0;
    }
    NOIP 2018 RP++
  • 相关阅读:
    Vue入门教程 第一篇 (概念及初始化)
    安装配置MongoDB
    Windows搭建SVN服务器
    MySql + Workbench使用教程
    Node.js入门教程 第六篇 (连接使用MySql)
    Node.js入门教程 第五篇 (Express框架)
    Node.js入门教程 第四篇 (流及文件操作)
    Node.js入门教程 第三篇 (模块、路由)
    Node.js入门教程 第二篇 (HelloWorld及事件分发)
    Node.js入门教程 第一篇 (概念原理及环境配置)
  • 原文地址:https://www.cnblogs.com/Black-S/p/9930710.html
Copyright © 2020-2023  润新知