mxqz 编译器为啥这么智能
查看原帖
mxqz 编译器为啥这么智能
487027
rsg26楼主2022/1/25 17:50
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

const int NR = 1e5 + 5;
 
long long a[NR], sum[NR << 2];
bool judge[NR << 2];
int cases, n, m;

void pushup(int now)
{
	sum[now] = sum[(now << 1)] + sum[(now << 1) + 1];
	judge[now] = judge[(now << 1)] && judge[(now << 1) + 1];
	return;
}

void build(int now, int l, int r)
{
	if (l == r)
	{
		sum[now] = a[l];
		judge[now] = (sum[now] == 0) || (sum[now] == 1);
		return;
	} 
	int mid = l + ((r - l) >> 1);
	build((now << 1), l, mid);
	build((now << 1) + 1, mid + 1, r);
	pushup(now);
	return;
}

void modify(int now, int l, int r, int a, int b)
{
	if(l == r)
	{
		sum[now] = sqrt(sum[now]);
		if(sum[now] == 0 || now[sum] == 1) judge[now] = 1;
		return;
	}
	int mid = l + ((r - l) >> 1);
	if(a <= mid && judge[now << 1] == false) modify((now << 1), l, mid, a, b);
	if(b > mid && judge[now << 1 | 1] == false) modify((now << 1) + 1, mid + 1, r, a, b);
	pushup(now);
}

long long query(int now, int l, int r, int a, int b)
{
	if(l > b || r < a) return 0;
	if(l >= a && r <= b) return sum[now];
	int mid = l + ((r - l) >> 1);
	return query(now << 1, l, mid, a, b) + query(now << 1 | 1, mid + 1, r, a, b);
}

int main()
{
	scanf("%d", &n);
	for(int i = 1; i <= n; i++)
		scanf("%lld", &a[i]);
	build(1, 1, n);
	scanf("%d", &m);
	for(int i = 1; i <= m; i++)
	{
		int op, l, r;
		scanf("%d %d %d", &op, &l, &r);
		if(l > r) swap(l, r);
		if(op == 0) modify(1, 1, n, l, r);
		else printf("%lld\n", query(1, 1, n, l, r));
	}
	return 0;
}

很明显,我在 modify 中写了一个 now[sum] == 1 ,但是并未定义一个 now 数组(理论上应该写 sum[now] = 1)结果没有编译错误还过了???!!!

https://www.luogu.com.cn/record/67913890

求问为什么

2022/1/25 17:50
加载中...