【codevs 2492】上帝造题的七分钟2

来源:互联网 发布:linux能用ghost 编辑:程序博客网 时间:2024/04/20 03:38

QAQ这题不是线段树?
参见切水果

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>using namespace std;typedef long long ll;const int MAXN = 100000 + 5;ll num[MAXN];int zero[MAXN];int fa[MAXN];int n;void init(){    for(int i = 0;i < MAXN;i ++)        fa[i] = i;    return;}int find(int x){    return fa[x] == x ? x : fa[x] = find(fa[x]);}bool same(int x,int y){    return find(x) == find(y);}void merge(int x,int y){    x = find(x);    y = find(y);    fa[x] = y;    return;}void change(int l,int r){    for(int i = l;i <= r;i ++)    {        i = find(i);        if(i > r)            break;        num[i] = sqrt(num[i]);        if(num[i] == 1)            merge(i,i + 1);    }    return;}ll ask(int l,int r){    ll ans = 0;    for(int i = l;i <= r;i ++)    {        int x = find(i);        ans += min(x,r + 1) - i;        i = x;        if(i <= r)            ans += num[i];    }    ans -= zero[r] - zero[l - 1];    return ans;}int Q;int q,l,r;int main(){    scanf("%d",&n);    init();    for(int i = 1;i <= n;i ++)    {        scanf("%lld",&num[i]);        if(!num[i])            zero[i] ++;        zero[i] += zero[i - 1];    }    scanf("%d",&Q);    while(Q --)    {        scanf("%d %d %d",&q,&l,&r);        if(l > r)            swap(l,r);        switch(q)        {            case 0:                change(l,r);                break;            case 1:                printf("%lld\n",ask(l,r));                break;        }    }    return 0;}
0 0
原创粉丝点击