社区讨论

为什么访问负数下标不会re

P9527[JOIST 2022] 洒水器 / Sprinkler参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhji2g2c
此快照首次捕获于
2025/11/04 02:55
4 个月前
此快照最后确认于
2025/11/04 02:55
4 个月前
查看原帖
第一篇题解如果输入
CPP
2 5
1 2
3 4
1
1 2 0 4
,在第43行会访问负数下标,但是为什么没有re
CPP
#include <iostream>
#include <vector>
#define ll long long
#define pb push_back
#define ull unsigned long long
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define rop(i, j, k) for(int i = j; i >= k; i--)
using namespace std;
const int N = 2e5 + 5;
int n, m, l, h[N], fa[N];
ll tag[N][45];
vector<int> g[N];
inline void dfs(int u, int fat)
{
	fa[u] = fat;
	rep(i, 0, g[u].size() - 1){
		int v = g[u][i];
		if(v == fat) continue;
		dfs(v, u);
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> n >> l;
	rep(i, 1, n - 1){
		int u, v;
		cin >> u >> v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	rep(i, 1, n) cin >> h[i];
	rep(i, 1, n) rep(j, 0, 40) tag[i][j] = 1;
	dfs(1, 0);
	cin >> m;
	rep(i, 1, m){
		int t, x, d, w;
		cin >> t >> x;
		if(t == 1){
			cin >> d >> w;
			while(d >= 0 && x){
				if(x > 1) tag[x][d] = tag[x][d] * w % l, tag[x][d - 1] = tag[x][d - 1] * w % l;
				else{
					rep(j, 0, d) tag[x][j] = tag[x][j] * w % l;
					break;
				} 
				d--;
				x = fa[x];
			}
		}
		else{
			ll res = h[x];
			rep(j, 0, 40){
				if(!x) break;
				res *= tag[x][j];
				res %= l;
				x = fa[x];
			}
			cout << res << "\n";
		}
	}
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...