2057 The manager's worry(树状数组)

来源:互联网 发布:软件培训怎么样 编辑:程序博客网 时间:2024/06/05 17:10

@(K ACMer)
题意:
单点更新,区间查寻素数个数.
分析:
构造一个树状数组就可以了,定义sum[i]为[1,i]的素数个数.


#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <stack>#include <vector>#include <string>#include <queue>#include <cstdlib>#include <cmath>#include <algorithm>using namespace std;const int mod = int(1e9) + 7, INF = 0x3fffffff, maxn = 1e6 + 40;int bit[maxn], n, k, m, a[maxn];bool isprime(int x) {    if (x <= 1) return false;    for (int i = 2; i * i <= x; i++) {        if (x % i == 0) return false;    }    return true;}void add(int i, int x) {    while (i <= n) {        bit[i] += x;        i += i & -i;    }}int sum(int i) {    int sum = 0;    while (i > 0) {        sum += bit[i];        i -= i & -i;    }    return sum;}int main(void) {    int T = 1;    while (scanf("%d%d%d", &n, &k, &m), n * n + k * k + m * m) {        printf("CASE #%d:\n", T++);        int t = isprime(m) ? 1 : 0;        memset(bit, 0, sizeof(bit));        for (int i = 1; i <= n; i++) {            a[i] = m;            if (t) add(i, 1);        }        while (k--) {            int x, y, z;            scanf("%d%d%d", &x, &y, &z);            if (!x) {                bool f = isprime(a[y]), s = isprime(a[y] + z);                a[y] += z;                if (f && !s) add(y, -1);                if (!f && s) add(y, 1);            } else {                printf("%d\n", sum(z) - sum(y - 1));            }        }        puts("");    }    return 0;}
0 0
原创粉丝点击