#include<iostream>usingnamespace std;constint N =1e5+10;int n, m;int q[N];voidheap_adjust(int q[],int n,int i){for(int j = i*2+1; j <= n-1; j = j*2+1){if(j < n-1&& q[j]< q[j+1]) j++;if(q[i]> q[j])break;swap(q[i], q[j]);
i = j;}}voidheap_sort(int q[],int n){// 构造堆for(int i = n/2-1; i >=0; i--)heap_adjust(q, n, i);// 排序for(int i = n-1; i >=0; i--){swap(q[0], q[i]);heap_adjust(q, i,0);}}intmain(){int n, m;scanf("%d%d",&n,&m);for(int i =0; i < n; i ++)scanf("%d",&q[i]);heap_sort(q, n);for(int i =0; i < m; i++) cout << q[i]<<' ';putchar('\n');return0;}
二、AcWing-795:前缀和
2.1 问题描述
2.2 问题解决
#include<iostream>usingnamespace std;constint N =1e5+10;int n, m;int a[N], s[N];intmain(){scanf("%d%d",&n,&m);for(int i =1; i <= n; i ++)scanf("%d",&a[i]);for(int i =1; i <= n; i ++) s[i]= s[i-1]+ a[i];while(m --){int l, r;scanf("%d%d",&l,&r);printf("%d\n", s[r]- s[l-1]);}return0;}
三、AcWing-797:差分
3.1 问题描述
3.2 问题解决
#include<iostream>usingnamespace std;constint N =1e5+10;int n, m;int a[N],b[N];voidinsert(int l,int r,int x){
b[l]+= x;
b[r+1]-= x;}intmain(){scanf("%d%d",&n,&m);for(int i =1; i <= n; i ++)scanf("%d",&a[i]);// 构造差分数组b[]for(int i =1; i <= n; i ++)insert(i, i, a[i]);while(m --){int l, r, c;scanf("%d%d%d",&l,&r,&c);insert(l, r, c);}for(int i =1; i <= n; i ++) b[i]+= b[i-1];for(int i =1; i <= n; i ++)printf("%d ", b[i]);putchar('\n');return0;}
四、AcWing-796:子矩阵的和
4.1 问题描述
4.2 问题解决
#include<iostream>usingnamespace std;constint N =1010;int n, m, q;int a[N][N], s[N][N];intmain(){scanf("%d%d%d",&n,&m,&q);for(int i =1; i <= n; i++)for(int j =1; j <= m; j++)scanf("%d",&a[i][j]);// 构造前缀和for(int i =1; i <= n; i ++)for(int j =1; j <= m; j ++)
s[i][j]= s[i-1][j]+ s[i][j-1]- s[i-1][j-1]+ a[i][j];while(q--){int x1, y1, x2, y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);printf("%d\n", s[x2][y2]- s[x1-1][y2]- s[x2][y1-1]+ s[x1-1][y1-1]);}return0;}
五 AcWing-798:差分矩阵
5.1 问题描述
5.2 问题解决
#include<iostream>usingnamespace std;constint N =1010;int n, m, q;int a[N][N], b[N][N];voidmodify(int x1,int y1,int x2,int y2,int c){
b[x1][y1]+= c;
b[x1][y2+1]-= c;
b[x2+1][y1]-= c;
b[x2+1][y2+1]+= c;}intmain(){scanf("%d%d%d",&n,&m,&q);for(int i =1; i <= n ; i++)for(int j =1; j <= m; j++)scanf("%d",&a[i][j]);// 构造差分矩阵for(int i =1; i <= n ; i++)for(int j =1; j <= m; j++)modify(i, j, i, j, a[i][j]);while(q--){int x1, y1, x2, y2, c;scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&c);modify(x1, y1, x2, y2, c);}for(int i =1; i <= n; i++)for(int j =1; j <= m; j++)
b[i][j]+= b[i-1][j]+ b[i][j-1]- b[i-1][j-1];for(int i =1; i <= n; i++){for(int j =1; j <= m; j++)printf("%d ", b[i][j]);putchar('\n');}return0;}