LTIME16小结(CodeChef)

题目链接

最后一题是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 ? '\n' : ' ');
136     }
137 
138     return 0;
139 }

 

D

转载于:https://www.cnblogs.com/Stomach-ache/p/3998897.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值