hdu 4027 Can you answer these queries?

本文提供了一道来自HDU在线评测系统的编程题(PID 4027)的解决方案。该题涉及数值数组的操作,包括求区间内元素的平方根并向下取整的更新操作及求区间内元素之和的查询操作。文章通过分段构建树状数据结构,实现了高效的区间更新和查询。

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;
}

要解决被HDU WAF(Web应用防火墙)拒绝的问题并调整代码,可从以下几个方面着手: ### 网络访问规范 - **IP限制**:HDU WAF可能因IP存在异常访问行为而拒绝访问。检查IP是否被列入黑名单,若因频繁请求被临时封禁,可等待封禁时间结束或联系HDU相关技术支持人员说明情况,请求解封。 - **请求频率**:过度频繁的请求会触发WAF的防护机制。调整代码中的请求频率,添加适当的延迟。以下是Python中使用`time.sleep()`函数添加延迟的示例: ```python import time import requests for i in range(10): response = requests.get('http://acm.hdu.edu.cn') print(response.text) time.sleep(1) # 每次请求间隔1秒 ``` ### 代码合规性 - **请求头设置**:确保代码中的请求头信息符合正常浏览器的请求头格式。部分WAF会根据请求头信息判断请求是否正常。以下是Python中设置请求头的示例: ```python import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get('http://acm.hdu.edu.cn', headers=headers) print(response.text) ``` - **请求参数**:检查代码中发送的请求参数是否包含恶意字符或异常内容。确保参数符合题目要求和网站规定。 ### 代码逻辑与题目要求 - **理解题目意思**:仔细阅读题目描述,确保代码逻辑符合题目要求。如VJ的题有很多格式要求,多打一个空格、没换行系统就会评测为presentation error,所以要在代码中严格遵循题目要求的输出格式[^2]。 - **优化算法复杂度**:若代码运行时间过长或占用资源过多,可能会被WAF视为异常请求。对代码中的算法进行优化,降低时间和空间复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值