极其古怪
查看原帖
极其古怪
837114
idiotgoose楼主2023/11/13 23:07
开头const int maxn=1e6就100分,1e5就0分,不明白为啥啊
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<vector>
#include<string.h>
#define int long long
#define ll (o*2,L,m)
#define rr (o*2+1,m+1,R)
using namespace std;
const int maxn = 1e6 + 5;//这边1e5就全WA
const int INF = 1e9;
int pre[maxn * 2];
struct segment_tree
{
	int addv[8 * maxn]; //different
	int sumv[8 * maxn];
	int n; int y1, y2; int v; int* arr;
	int _sum;

	void dfs(int o, int L, int R)
	{
		if (L == R)
		{
			addv[o] = arr[L];
			sumv[o] = arr[L]*(pre[L]-pre[L-1]);
			return;
		}
		else
		{
			int m = L + (R - L) / 2;
			dfs ll; dfs rr;
			sumv[o] = sumv[o * 2] + sumv[o * 2 + 1];
		}
	}

	void build(int n, int* a)//注意n
	{
		this->n = n; arr = a;
		dfs(1, 1, n);
	}

	void maintain(int o, int L, int R)
	{
		sumv[o] = 0;
		if (R > L)
		{
			sumv[o] = sumv[o * 2] + sumv[o * 2 + 1];
		}
		sumv[o] += addv[o] * (pre[R] - pre[L - 1]);
	}

	void pushdown(int o, int L, int R)
	{
		int m = L + (R - L) / 2;
		addv[o * 2] += addv[o]; addv[o * 2 + 1] += addv[o];
		addv[o] = 0;
	}

	void update(int o, int L, int R)
	{
		if (y1 <= L && R <= y2)
		{
			addv[o] += v;
		}
		else
		{
			int m = L + (R - L) / 2;
			pushdown(o, L, R);
			if (y1 <= m)update ll; else maintain ll;
			if (y2 > m)update rr; else maintain rr;
		}
		maintain(o, L, R);
	}

	void query(int o, int L, int R)
	{
		if (y1 <= L && R <= y2)
		{
			_sum += sumv[o]; return;
		}
		else
		{
			int m = L + (R - L) / 2;
			pushdown(o, L, R);
			maintain ll; maintain rr;
			if (y1 <= m)query ll;
			if (y2 > m)query rr;
		}
	}

	void interval_add(int a, int b, int v)
	{
		y1 = a; y2 = b; this->v = v;
		update(1, 1, n);
	}

	int interval_sum(int a, int b)
	{
		_sum = 0; y1 = a; y2 = b;
		query(1, 1, n);
		return _sum;
	}
}t;
int w[maxn];
vector<int> G[maxn];
int dfs_clock = 0;
int vis[maxn];
int arr[maxn][2];
int drr[maxn * 2];
void dfs(int u)
{
	vis[u] = 1;
	dfs_clock++;
	drr[dfs_clock] = w[u];
	pre[dfs_clock] = pre[dfs_clock - 1] + 1;
	arr[u][0] = dfs_clock;
	for (int i = 0; i < G[u].size(); i++)
	{
		int v = G[u][i];
		if (!vis[v])dfs(v);
	}
	dfs_clock++;
	drr[dfs_clock] = w[u];
	pre[dfs_clock] = pre[dfs_clock - 1] - 1;
	arr[u][1] = dfs_clock;
}
signed main()
{
	int n, m; cin >> n >> m;
	for (int i = 1; i <= n; i++)cin >> w[i];
	for (int i = 0; i < n - 1; i++)
	{
		int u, v; cin >> u >> v;
		G[u].push_back(v); G[v].push_back(u);
	}
	dfs(1);
	t.build(2 * n, drr);
	for (int i = 0; i < m; i++)
	{
		int op, x, a;
		cin >> op >> x;
		if (op == 1)
		{
			cin >> a;
			if (arr[x][0] == 0 || arr[x][1] == 0)
			{
				int k = 1;
			}
			t.interval_add(arr[x][0], arr[x][0], a);
			t.interval_add(arr[x][1], arr[x][1], a);
		}
		else if (op == 2)
		{
			cin >> a;
			t.interval_add(arr[x][0], arr[x][1], a);
		}
		else
		{
			cout << t.interval_sum(1, arr[x][0]) << endl;
		}
	}
	return 0;
}
2023/11/13 23:07
加载中...