您的位置:首页 > 其它

【BZOJ3211】【并查集+树状数组】花神游历各国

2015-03-08 19:29 337 查看

Description

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <utility>
#include <iomanip>
#include <string>
#include <cmath>
#include <queue>
#include <map>

const int MAXN = 100000 + 10;
const int MAX = 30000 + 10;
using namespace std;
typedef long long ll;
int n;
ll C[MAXN];
int data[MAXN], parent[MAXN];

int SQRT(int x){return (int)floor(sqrt((double)x * 1.0));}
int lowbit(int x){return x & -x;}
void add(int x, int val){
while (x <= n){
C[x] += val;
x += lowbit(x);
}
return;
}
ll sum(int x){
ll cnt = 0;
while (x > 0){
cnt += C[x];
x -= lowbit(x);
}
return cnt;
}
int find(int x) {return parent[x] == x? x : parent[x] = find(parent[x]);}
void init(){
memset(C, 0, sizeof(C));
scanf("%d", &n);
for (int i = 1; i <= n; i++){
scanf("%d", &data[i]);
add(i, data[i]);
parent[i] = i;
if (data[i] == 1 || data[i] == 0) parent[i] = i + 1;
}
parent[n + 1] = n + 1;
}
void work(){
int q;
scanf("%d", &q);
for (int i = 1; i <= q; i++){
int t, x, y;
scanf("%d%d%d", &t, &x, &y);
if (t == 1) printf("%lld\n", sum(y) - sum(x - 1));
else{
for (int i = x; i <= y; i = find(i + 1)){
int tmp = data[i];
data[i] = SQRT(data[i]);
add(i, data[i] - tmp);
if (data[i] <= 1) parent[i] = find(i + 1);
}
}
}
}

int main(){
int T;
#ifdef LOCAL
freopen("data.txt",  "r",  stdin);
freopen("out.txt",  "w",  stdout);
#endif
init();
work();
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: