最后一题是Splay...还没有学会。。蒟蒻!!!
A
1 /************************************************************************* 2 > File Name: A.cpp 3 > Author: Stomach_ache 4 > Mail: sudaweitong@gmail.com 5 > Created Time: 2014年09月28日 星期日 13时33分32秒 6 > Propose: 7 ************************************************************************/ 8 9 #include <cmath> 10 #include <string> 11 #include <cstdio> 12 #include <fstream> 13 #include <cstring> 14 #include <iostream> 15 #include <algorithm> 16 using namespace std; 17 /*Let's fight!!!*/ 18 19 int n, A[100005]; 20 21 int main(void) { 22 ios::sync_with_stdio(false); 23 int t; 24 cin >> t; 25 while (t--) { 26 cin >> n; 27 for (int i = 0; i < n; i++) cin >> A[i]; 28 sort(A, A + n); 29 long long res = 0; 30 for (int i = n - 1; i >= 0; i -= 2) res += A[i]; 31 cout << res << endl; 32 } 33 return 0; 34 }
B
处理出每个素数在所有数中出现的次数最多的个数。
1 /************************************************************************* 2 > File Name: B.cpp 3 > Author: Stomach_ache 4 > Mail: sudaweitong@gmail.com 5 > Created Time: 2014年09月28日 星期日 13时36分46秒 6 > Propose: 7 ************************************************************************/ 8 #include <map> 9 #include <cmath> 10 #include <string> 11 #include <cstdio> 12 #include <vector> 13 #include <fstream> 14 #include <cstring> 15 #include <iostream> 16 #include <algorithm> 17 using namespace std; 18 /*Let's fight!!!*/ 19 20 typedef pair<int, int> pii; 21 const int MAX_N = 100005; 22 const int MAX_M = 1000005; 23 bool vis[MAX_M]; 24 int prime[MAX_N], A[MAX_N], cnt; 25 26 void init() { 27 cnt = 0; 28 memset(vis, false, sizeof(vis)); 29 for (int i = 2; i < MAX_M; i++) { 30 if (!vis[i]) { 31 prime[++cnt] = i; 32 for (int j = 2*i; j < MAX_M; j += i) vis[j] = true; 33 } 34 } 35 } 36 37 #define rep(i, n) for (int i = (1); i <= (n); i++) 38 39 vector<pii> factor(MAX_M); 40 vector<pii>::iterator it; 41 42 void work(int x, int y) { 43 if (factor[x].second == 0) { 44 factor[x].second = y; } 45 else { 46 factor[x].second = max(y, factor[x].second); 47 } 48 } 49 50 int main(void) { 51 init(); 52 ios::sync_with_stdio(false); 53 int t, n; 54 cin >> t; 55 while (t--) { 56 rep (i, MAX_M) factor[i-1].second = 0; 57 cin >> n; 58 rep (i, n) cin >> A[i]; 59 rep (i, n) { 60 int x = A[i]; 61 if (x == 1) continue; 62 rep (j, cnt) { 63 if (prime[j]*prime[j] > A[i]) break; 64 if (x % prime[j] == 0) { 65 int tmp = 0; 66 while (x % prime[j] == 0) tmp++, x /= prime[j]; 67 work(prime[j], tmp); 68 } 69 } 70 if (x > 1) work(x, 1); 71 } 72 int res = 0; 73 for (it = factor.begin(); it != factor.end(); ++it) { 74 res += it->second; 75 } 76 cout << res << endl; 77 } 78 79 return 0; 80 }
C
线段树。
对于第一种修改,就是区间减1
对于第二种修改,就是单点更新
最后,查询每个点2,3,5因子的个数。
1 /************************************************************************* 2 > File Name: C.cpp 3 > Author: Stomach_ache 4 > Mail: sudaweitong@gmail.com 5 > Created Time: 2014年09月28日 星期日 14时06分24秒 6 > Propose: 7 ************************************************************************/ 8 #include <cmath> 9 #include <string> 10 #include <cstdio> 11 #include <fstream> 12 #include <cstring> 13 #include <iostream> 14 #include <algorithm> 15 using namespace std; 16 /*Let's fight!!!*/ 17 18 const int MAX_N = 100050; 19 int factor[3][MAX_N], A[MAX_N], id[MAX_N]; 20 #define rep(i, n) for (int i = (1); i <= (n); i++) 21 #define lson(x) ((x<<1)) 22 #define rson(x) ((x<<1) | 1) 23 24 struct node { 25 int l, r, Min[3]; 26 }Tr[MAX_N<<2]; 27 28 void build(int rt, int l, int r) { 29 Tr[rt].l = l, Tr[rt].r = r; 30 rep(i, 3) Tr[rt].Min[i-1] = 0; 31 if (l == r) { 32 rep (i, 3) Tr[rt].Min[i-1] = factor[i-1][l]; 33 id[l] = rt; 34 return ; 35 } 36 int mid = (l + r) / 2; 37 build(lson(rt), l, mid); 38 build(rson(rt), mid + 1, r); 39 } 40 41 void pushdown(int rt, int p) { 42 if (Tr[rt].Min[p] != 0) { 43 Tr[lson(rt)].Min[p] += Tr[rt].Min[p]; 44 Tr[rson(rt)].Min[p] += Tr[rt].Min[p]; 45 Tr[rt].Min[p] = 0; 46 } 47 } 48 49 void update1(int rt, int l, int r, int p) { 50 if (Tr[rt].l >= l && Tr[rt].r <= r) { 51 Tr[rt].Min[p]--; 52 return ; 53 } 54 pushdown(rt, p); 55 int mid = Tr[lson(rt)].r; 56 if (l <= mid) update1(lson(rt), l, r, p); 57 if (r > mid) update1(rson(rt), l, r, p); 58 } 59 60 void update2(int rt, int l, int p, int d) { 61 if (Tr[rt].l == Tr[rt].r && Tr[rt].l == l) { 62 Tr[rt].Min[p] = d; 63 return ; 64 } 65 pushdown(rt, p); 66 int mid = Tr[lson(rt)].r; 67 if (l <= mid) update2(lson(rt), l, p, d); 68 else update2(rson(rt), l, p, d); 69 } 70 71 int query(int rt, int l, int p) { 72 if (Tr[rt].l == Tr[rt].r && Tr[rt].l == l) { 73 return max(Tr[rt].Min[p], 0); 74 } 75 pushdown(rt, p); 76 int mid = Tr[lson(rt)].r; 77 if (l <= mid) query(lson(rt), l, p); 78 else query(rson(rt), l, p); 79 } 80 81 void read(int &res) { 82 res = 0; 83 char c = ' '; 84 while (c < '0' || c > '9') c = getchar(); 85 while (c >= '0' && c <= '9') res = res*10+c-'0', c = getchar(); 86 } 87 88 int POW(int a, int b) { 89 int res = 1; 90 while (b) { 91 if (b & 1) res *= a; 92 a *= a; 93 b >>= 1; 94 } 95 return res; 96 } 97 98 int main(void) { 99 int N, M, a[4] = {0, 2, 3, 5}; 100 read(N); 101 rep (i, N) { 102 read(A[i]); 103 int x = A[i]; 104 factor[0][i] = factor[1][i] = factor[2][i] = 0; 105 rep (j, 3) { 106 int tmp = 0, p = a[j]; 107 while (x % p == 0) tmp++, x /= p; 108 factor[j-1][i] = tmp; 109 } 110 A[i] = x; 111 } 112 build(1, 1, N); 113 read(M); 114 int t, l, r, p, d, tmp; 115 while (M--) { 116 read(t); 117 if (t == 1) { 118 read(l), read(r), read(p); 119 update1(1, l, r, (p+1)/2-1); 120 } else { 121 read(l), read(d); 122 rep (i, 3) { 123 tmp = 0, p = a[i]; 124 while (d % p == 0) tmp++, d /= p; 125 update2(1, l, i-1, tmp); 126 } 127 A[l] = d; 128 } 129 } 130 rep (i, N) { 131 rep (j, 3) { 132 tmp = query(1, i, j-1); 133 A[i] *= POW(a[j], tmp); 134 } 135 printf("%d%c", A[i], i == N ? ' ' : ' '); 136 } 137 138 return 0; 139 }
D