hdu 4027 Can you answer these queries? 线段树

原创 2015年11月19日 13:29:50

题意:有一个长度为n的序列,有两种操作,第一种把在区间[x,y]之内的所有数,变成它的平方根。第二种操作,查询这个区间内的和。

思路:开始想了怎么区间更新,并没有想法,然后一想,卧槽,每个节点最多只会更新8次左右呀,直接更新就好了,于是暴力更新。统计1的个数,区间为1就不更新了。

坑点:x可能会大于y

http://acm.hdu.edu.cn/showproblem.php?pid=4027

#include <cstdio>
#include <cmath>
#include <iostream>

using namespace std;

const int MAXN = 1e5+5;

struct Node {
    int x,y;
    int k; //区间内1的个数;
    long long sum; //区间内总和;
}t[MAXN<<2];

int n,m;

void Push_Up(int rt) {
    t[rt].sum = t[rt<<1].sum + t[rt<<1|1].sum;
    t[rt].k = t[rt<<1].k + t[rt<<1|1].k;
}

void Build(int x,int y,int rt) {
    t[rt].x = x; t[rt].y = y;
    if(t[rt].x == t[rt].y) {
        scanf("%I64d",&t[rt].sum);

        if(t[rt].sum == 1)t[rt].k = 1;
        else t[rt].k = 0;

        return ;
    }
    int mid = (x + y) >> 1;
    Build(x,mid,rt<<1);
    Build(mid+1,y,rt<<1|1);
    Push_Up(rt);
}

void Update(int rt,int left,int right) {
    if((t[rt].y -t[rt].x + 1) == t[rt].k) return ;
    if(t[rt].y == t[rt].x) {
        t[rt].sum = (long long)sqrt(t[rt].sum);
        if(t[rt].sum == 1) {
            t[rt].k = 1;
        }
        return ;
    }
    int mid = (t[rt].x + t[rt].y) >> 1;
    if(mid >= left) {
        Update(rt<<1,left,right);
    }
    if(mid < right) {
        Update(rt<<1|1,left,right);
    }
    Push_Up(rt);
}

long long Query(int rt,int left,int right) {
    if(t[rt].x >= left && t[rt].y <= right) {
        return t[rt].sum;
    }
    long long ans = 0;
    int mid = (t[rt].x + t[rt].y) >> 1;
    if(mid >= left) {
        ans += Query(rt<<1,left,right);
    }
    if(mid < right) {
        ans += Query(rt<<1|1,left,right);
    }
    return ans;
}

void input() {
    Build(1,n,1);
    scanf("%d",&m);
    int ok,left,right;
    for(int i = 1 ; i <= m ; i ++) {
        scanf("%d %d %d",&ok,&left,&right);
        if(left > right) swap(left,right);
        if(ok == 0) {
            Update(1,left,right);
        }
        else {
            printf("%I64d\n",Query(1,left,right));
        }
    }
}

void solve() {

}

int main(void) {
    //freopen("a.in","r",stdin);
    int CASENUM = 1;
    while(~scanf("%d",&n)) {
        printf("Case #%d:\n",CASENUM++);
        input();
        solve();
        puts("");
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 4027Can you answer these queries?(线段树功能:平方减少,区间求和)

hdu 4027Can you answer these queries?(线段树功能:平方减少,区间求和) 杭电ACM2014暑期集训队——名单公示  百度之星编程大赛——您报名了吗? ...
  • u012860063
  • u012860063
  • 2014年05月11日 18:50
  • 1238

Spoj 2916 Can you answer these queries V 线段树 求任意重叠区间的最大子段和

题目链接:点击打开链接 题意: T个测试数据 n个数字 q个询问 每个询问 : [x1, y1] [x2, y2]  问: int ans = -inf; for(int i = x1; i ...
  • qq574857122
  • qq574857122
  • 2014年09月01日 16:20
  • 1191

Spoj 1557 Can you answer these queries II 线段树 任意区间最大子段和 不重复数字

题目链接:点击打开链接 每个点都是最大值,把一整个序列和都压缩在一个点里。 #include #include #include #include #include using na...
  • qq574857122
  • qq574857122
  • 2014年08月31日 13:39
  • 1169

hdu4027Can you answer these queries?【线段树区间更新区间求和】

Problem Description A lot of battleships of evil are arranged in a line before the battle. Our comm...
  • zhou_yujia
  • zhou_yujia
  • 2016年03月07日 21:33
  • 355

HDU 4027 Can you answer these queries? (线段树 - 区间开根取整)

题意: 给你n 个数, 两种操作,一种区间成段开根号取整,另一种求区间和。 思路: 因为一个数开上大约7,8次 就成1 了, 1在开根号不变了。 因此我们在递归子区间时,如果发现这个区间都是1...
  • aozil_yang
  • aozil_yang
  • 2017年06月06日 21:18
  • 311

HDU 4027 Can you answer these queries?(线段树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027 这个题目想明白就是裸线段树,sqrt,每个节点最多更新次数有限,一旦变为1之后就不用更...
  • sunrainchy
  • sunrainchy
  • 2013年08月31日 21:13
  • 529

HDU 4027 Can you answer these queries? 【线段树】

http://acm.hdu.edu.cn/showproblem.php?pid=4027 线段树的应用。 优化:__int64表示范围内的数被开方的次数最多不超过8次,就会变为1或者0,用一个...
  • moorage
  • moorage
  • 2011年09月12日 09:17
  • 691

HDU-4027-Can you answer these queries?(线段树)

Can you answer these queries?Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K (...
  • qq_32680617
  • qq_32680617
  • 2016年05月13日 20:10
  • 174

Can you answer these queries? - HDU 4027 - 线段树

Can you answer these queries? - HDU 4027 - 线段树题目:  A lot of battleships of evil are arranged in a li...
  • xs18952904
  • xs18952904
  • 2017年05月28日 17:13
  • 279

hdu 4027 Can you answer these queries? 求区间N次根的和 线段树

Problem Description A lot of battleships of evil are arranged in a line before the battle. Our comm...
  • kongming_acm
  • kongming_acm
  • 2011年09月13日 16:07
  • 425
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 4027 Can you answer these queries? 线段树
举报原因:
原因补充:

(最多只允许输入30个字)