説明で
ツリーには、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;
}