1369 - Answering Queries
long long f( int A[], int n ) { // n = size of AThe problem you need to solve here is pretty simple. You are give a function f(A, n), where A is an array of integers and n is the number of elements in the array. f(A, n) is defined as follows:
long long sum = 0;
for( int i = 0; i < n; i++ )
for( int j = i + 1; j < n; j++ )
sum += A[i] - A[j];
return sum;
}
Given the array A and an integer n, and some queries of the form:
1) 0 x v (0 ≤ x < n, 0 ≤ v ≤ 106), meaning that you have to change the value of A[x] to v.
2) 1, meaning that you have to find f as described above.
Input
Input starts with an integer T (≤ 5), denoting the number of test cases.
Each case starts with a line containing two integers: n and q (1 ≤ n, q ≤ 105). The next line contains n space separated integers between 0 and 106 denoting the array A as described above.
Each of the next q lines contains one query as described above.
Output
For each case, print the case number in a single line first. Then for each query-type "1" print one single line containing the value of f(A, n).
Sample Input |
Output for Sample Input |
13 51 2 310 0 310 2 1
1 |
Case 1:-404 |
Note
Dataset is huge, use faster I/O methods.
题目类型:简单数学
算法分析:首先将sum求出来,然后更新时只更新a[x]的值所引起的变化,查询时直接输出结果,注意两个int型变量相乘的中间结果也是int的,可能会溢出!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
#include <set> #include <bitset> #include <list> #include <map> #include <stack> #include <queue> #include <deque> #include <string> #include <vector> #include <ios> #include <iostream> #include <fstream> #include <sstream> #include <iomanip> #include <algorithm> #include <utility> #include <complex> #include <numeric> #include <functional> #include <cmath> #include <ctime> #include <climits> #include <cstdarg> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <cassert> using namespace std; #define lson rt << 1, l, m #define rson rt << 1 | 1, m + 1, r const int INF = 0x7FFFFFFF; const double EPS = 1e-10; const int mod = 1000000000 + 7; const int maxn = 100000 + 66; long long a[maxn]; int main() { // ifstream cin ("aaa.txt"); // freopen ("aaa.txt", "r", stdin); int t, flag = 1; scanf ("%d", &t); while (t--) { printf ("Case %d:\n", flag++); int n, q; scanf ("%d%d", &n, &q); long long res = 0; for (int i = 1;i <= n; i++) scanf ("%d", &a[i]); if (n == 1) res = 0; else if (n == 2) res = a[1] - a[2]; else { for (int i = 1; i <= n - 1; i++) res += (n - i) * a[i]; long long temp = 0, tempsum = 0; for (int i = n; i >= 2; i--) { temp += a[i]; tempsum += temp; } res -= tempsum; } int vv, x, y; for (int i = 1; i <= q; i++) { scanf ("%d", &vv); if (vv == 0) { scanf ("%d%d", &x, &y); x++; if (n == 1) continue ; else if (n == 2) { if (x == 1) res += (y - a[x]); else if (x == 2) res -= (y - a[x]); a[x] = y; } else { if (x <= n - 1) res += (n - x) * (y - a[x]); if (x >= 2) res -= (x - 1) * (y - a[x]); a[x] = y; } } else printf ("%lld\n", res); } } return 0; } |
- « 上一篇:lightoj1337
- lightoj1427:下一篇 »