[プログラミングチャレンジ最初の木の美]

制限時間: 4000ms
時間のシングルポイント: 2000ミリ秒
メモリの制限: 256メガバイト

説明で

ツリーには、N個のノードを持っています。ルートである点。

重みの初期点はゼロです。

深さは、その親+1へのノードの深さとして定義されます。具体的には、深さは、ルートノードとして定義されます。

ここで、以下の範囲サポートしなければならない:ノードU、ノードの深さ値との間のLとRの重み(ここで深さがまだ木の全体ルートから計算される)のサブツリーを、数プラスデルタです。

すべての操作が完了した後Q.、各ノードの重みです。


全体の動作が完了した場合に大きな出力を発生させ、オーバーヘッドを低減するために、各ノードの重みは[1..N]答えれます。以下の方法に従って、例えば、(適切なデータ・タイプを選択し、オーバーフロー状態を回避する)ハッシュ値を計算してください。

最後にのみ出力することでハッシュ値を必要とします。


MOD = 1000000007; // 10 ^ 9 + 7

MAGIC = 12347;

ハッシュ= 0;

N行うにはI = 1の場合

   ハッシュ=(ハッシュ* MAGIC +答え[i])とMOD MOD。

ENDFOR


エントリー

最初の行の整数T(1≤T≤5)。これは、データセットの数を表します。

入力データの次のセットは、試験データの間には空行が存在しない、Tです。

次のようなデータ・フォーマットの各セット。

整数N(N≤≤10 1の第1行5は)、ツリー内のノードの総数を表します。

次に、N - 1行、各番号1、(≤のN≤1)は、順序が親ノード2..Nノードの数を示しています。

次に、整数Q(。10≤1≤Q 5)、操作の総数を表します。

4つの整数、U、L、R&LT、デルタの次Qライン(1≤U≤N、R&LTの≤1≤L≤N、-10 9 ≤10≤デルタ9)。単一の操作の代わりに。


輸出

データの各セットは、第一出力ライン「ケースは、X:」、Xは、データの最初のいくつかのセットを示します。その後、このデータのセットとは答えにハッシュ値をとります。


データ範囲


小さなデータ:1≤N、Q≤1000年

ビッグデータ:. 1≤N、Q≤10 。5


例を説明しました

1点サブツリー1,2,3の3つのノード。2と点3点の間の深さである2-3。

2サブツリー点3は、2つのノードを有しています。ノードの深さのいずれもありません。

だから、すべての部門の操作で実行した後。1の2,3追加の2つだけの重みがあります。その答えは011です。

ハッシュ値を再計算をすることができ、対応します。




入力の例
1 
3 
1 
2 
2 
1 2 3 1 
2 1 1 1
出力の例
ケース1:12348
以下のC ++コードは、その試験例の採用が、WRにもかかわらず。問題がどこにあるかを知ることがあり、親切〜それを指摘
#include <iostream>
#include <cstdio>
#include <cstdlib>

int depth_n;
long mode = 1000000000+7;
int magic = 12347;

int find_parent(int n, int *parent, int depth)
{
	if (n == parent[n])
	{
		depth_n = depth;
		return n;
	}
	else return find_parent(parent[n], parent, depth+1);
}

int main()
{
	int T,t;
	scanf("%d", &T);
	for(t = 1; t <= T; t++)
	{
		int N, i;
		scanf("%d", &N);
		int *parent = new int[N+1];
		long long *ans = new long long[N+1];

		for (i = 0; i < N+1; i++)
		{
			ans[i] = 0;
		}
		parent[1] = 1;
		for (i = 2; i <= N; i++)
		{
			scanf("%d", &parent[i]);
		}
		int Q, u, l, r;
		long long delta;

		scanf("%d", &Q);
		for ( i = 0; i < Q; i++)
		{
			scanf("%d %d %d %lld", &u, &l, &r, &delta);
			if (u > N || u < 1)
			{
				continue;
			}
			if (l > r || r > N || l < 1)
			{
				continue;
			}
			int n;
			for ( n = 1; n <= N; n++)
			{
				depth_n = 1;
				if (find_parent(n, parent, depth_n) == u)
				{
					if (r >= depth_n && l <= depth_n)
					{
						ans[n] += delta;
					}
				}
			}
		}
		long long hash_n = 0;
		for ( i = 1; i <= N; i++)
		{
			hash_n = (hash_n*magic + ans[i])%mode;
		}
		printf("Case %d: %lld\n",t, hash_n);
		delete[] ans;
		delete[] parent;
	}
	system("pause");
	return 0;
}


おすすめ

転載: www.cnblogs.com/mqxnongmin/p/10963933.html