关闭

hdu 4027 Can you answer these queries?

标签: ACMhduC++
139人阅读 评论(0) 收藏 举报
分类:

Problemacm.hdu.edu.cn/showproblem.php?pid=4027

题意:给一列值,每次操作要么更新都使得区间 [ left , right ] 内的每一个值都变成原来的平方根(再向下取整);要么询问区间 [ left , right ] 的值的总和。

分析:这种更新不像以前见的成段更新,因为区间内每个值的变化都不一样。

考虑到:1开方之后还是1,所以一个区间如果所有值都小于等于1(没说一定大于0…但按题意应该是吧…)的时侯就不用再往下更新。

题目说总和不超过 2^63,就算 2^64,最多开 7 次方就到 1(所以是不会太耗时的意思吧?)

Source code

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 100000;

long long tree[N+7<<2], hp[N+1];
bool stop[N+7<<2]; // 为true表示不用再往下更新

void pushup(int x)
{
	tree[x] = tree[x<<1] + tree[x<<1|1];
	// 如果两个子结点都不用往下更新,那此结点也不用
	stop[x] = stop[x<<1] && stop[x<<1|1];
}

void build(int l, int r, int id)
{
	if(l == r)
	{
		tree[id] = hp[l];
		// 只要小于等于 1 就不用再往下更新
		stop[id] = hp[l] < 2LL;
		return;
	}
	int m = l + r >> 1;
	build(l, m, id<<1);
	build(m+1, r, id<<1|1);
	pushup(id);
}

void update(int ul, int ur, int l, int r, int id)
{
	if(stop[id]) return;
	if(l == r)
	{
		tree[id] = (long long)sqrt(1.0 * tree[id]);
		// 只要小于等于 1 就不用再往下更新
		stop[id] = tree[id] < 2LL;
		return;
	}
	int m = l + r >> 1;
	if(ul <= m)
		update(ul, ur, l, m, id<<1);
	if(ur > m)
		update(ul, ur, m+1, r, id<<1|1);
	pushup(id);
}

long long query(int ql, int qr, int l, int r, int id)
{
	if(ql <= l &&  r <= qr)
		return tree[id];
	if(r < ql || qr < l)
		return 0LL;
	int m = l + r >> 1;
	return query(ql, qr, l, m, id<<1) +
		query(ql, qr, m+1, r, id<<1|1);
}

int main()
{
	int n, kase = 0;
	while(~scanf("%d", &n))
	{
		for(int i = 1; i <= n; ++i)
			scanf("%I64d", hp + i);
		build(1, n, 1);
		printf("Case #%d:\n", ++kase);
		int m;
		scanf("%d", &m);
		for(int x,y,t; m--; )
		{
			scanf("%d%d%d", &t, &x, &y);
			if(x > y)
				swap(x, y);
			if(t == 1)
				printf("%I64d\n", query(x, y, 1, n, 1));
			else
				update(x, y, 1, n, 1);
		}
		putchar('\n');
	}
	return 0;
}

0
0
查看评论

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

Can you answer these queries?Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 14079 Accept...
  • mrlry
  • mrlry
  • 2016-10-22 17:48
  • 172

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

Can you answer these queries?Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 15043 Accept...
  • Snakeflute
  • Snakeflute
  • 2017-03-15 14:55
  • 124

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

Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 14091 Acce...
  • WYK1823376647
  • WYK1823376647
  • 2016-10-25 11:37
  • 224

HDU 4027 线段树 Can you answer these queries?

这个意思就是给你n个数,然后有两种操作 0 x y 表示从x到y,每个数都开根号 1 x y 表示输出x到y的和这个题的话,是区间更新,如果我们直接更新到点的话,时间复杂度是n^2,然后n可以到10^5,就会超时,用lazy,不更新到点?可是我们查询的时候还是要更新到点的啊,因为我们查的...
  • bllsll
  • bllsll
  • 2017-06-24 19:35
  • 149

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

这题,要判断一下每个区间是否已经被开完平方。否则会TLE #include #include using namespace std; __int64 sgTree[111111<<2]; __int64 s; int cov[100005<<2]; ...
  • u010087314
  • u010087314
  • 2013-04-22 14:18
  • 319

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

题目链接 :点击打开链接 题目要求开根那么再大的一个数不超过十次开根就会变成1,那么此时就不需要再更新了,所以用线段树只需特判这个点就可以了。 题解: #include #include #include #include #define lson l,m,rt<<...
  • a1214034447
  • a1214034447
  • 2017-05-05 18:44
  • 135

spoj 2713 Can you answer these queries IV

题目链接:https://www.spoj.pl/problems/GSS4/ 题目大意:求和+更新,一看到这种组合再看数据(n 思路:看着像区间更新,但是每一点每次减少的值不一定一样,所以lazy标志不怎么适用.其实这题看似区间更新,其实是单点更新,因为序列中最大的值不会超过10^18...
  • gotoac
  • gotoac
  • 2012-06-04 11:04
  • 525

hdu 4027 Can you answer these queries? 线段树

注意到当一个数开方到1后就不再变了,每个数开方次数不会太多,所以进行更新时如果该区间的数字都是1了就直接return #include #include #include #define maxn 100100 __int64 sum[4*maxn]; void build(int l,in...
  • KIDGIN7439
  • KIDGIN7439
  • 2014-04-16 16:44
  • 283

hdu 4027 Can you answer these queries? 线段树

题意:对一个序列有2种操作,
  • u011645923
  • u011645923
  • 2014-06-04 14:33
  • 569

Can you answer these queries?(hdu 4027)

Can you answerthese queries? TimeLimit: 4000/2000 MS (Java/Others)    Memory Limit:65768/65768 K (Java/Others) Total Submission(s)...
  • xiao_k666
  • xiao_k666
  • 2017-11-02 23:53
  • 38
    个人资料
    • 访问:34315次
    • 积分:1745
    • 等级:
    • 排名:千里之外
    • 原创:144篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    男默女泪…
    最新评论