プレフィックスとサイドバンド権互いに素セット

トレーニング4 - F問題

TTとFFは...友人。bはええと...非常に非常に良い友達-________-
FFは不良少年で、彼はいつも彼と一緒に、次のゲームをプレイするためにTTを求愛されます。これは非常に平凡なゲームです。まず、TTは、整数のシーケンス-_- !!(退屈)を書き留めておく必要があります。
次に、FFは(例えば包括第整数第3のサブシーケンス)、それからの連続シーケンスを選択することができます。その後、FFは、彼が選んだのサブシーケンスの合計は何であるかTTを聞いてきます。次回、TTはFFの質問にお答えします。その後、FFは、このプロセスをやり直すことができます。最後に、FFは、整数のシーケンス全体をうまくしなければなりません。
BoringBoringaは非常に非常にゲームを退屈します!TTは、すべてのFFでプレイしたくありません。FFを罰するために、彼女は多くの場合、FFにわざと間違った答えを伝えます。
不良少年は馬鹿男ではありません。FFはいくつかの答えは互換性がありませんを検出します。もちろん、これらの矛盾は、それが困難なシーケンスを計算するために作ります。
しかし、TTは素晴らしく、素敵な女の子です。彼女は心がFFにハードである必要はありません。時間を節約するために、彼女は何の論理的なミスが実際に存在しない場合の答えは、すべての権利であることを保証します。
次の答えを判断する際にFFは答えが間違っていることを発見した場合、多くはである何、彼はそれを無視します。
しかし、貧しいFFは、現在の答えが瞬時に正しいか間違っているかどうかを確認することができないので、多くの質問があるでしょう。そこで彼は、この問題で彼を助けるためにプログラムを書くことにしました。プログラムは、FFがTTから受け取った答えと一緒にFFからの一連の質問を受けます。このプログラムの目的は、間違っているどのように多くの回答を見つけることです。整数のみの全配列アウトすることができFF作業間違った答えを無視することもできます。悪いFFはこの仕事をするための時間がありません。そして今、彼は(なぜ彼自身のためのトラブル~~不良少年を尋ねる)〜あなたの助けを求めています

入力

1行目:2つの整数NとM(1 <= N <= 200000、1 <= M <= 40000)。手段TTは、N個の整数を書き、FFは彼女のMの質問をしました。
2行目... M + 1:愛、バイおよびSi:行I + 1が3つの整数が含まれています。手段TTバイへの愛からの和がSiであることをFFに答え。0 <愛<=バイ<= N.ことを保証しています
あなたはサブシーケンスのいずれかの合計が32ビット整数でフィット感であると仮定することができます。

出力

整数と一行は、多くの答えが間違っているか示しています。

入力

5 10
1 10 100
7 10 28
1 3 32
4 41 6
6 6 1

出力

1

#pragma warning (disable:4996)
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define inf 0X3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 2e6 + 5;

int fa[maxn];
int d[maxn];

int get(int x)
{
	if (x == fa[x])
		return x;
	int root = get(fa[x]);
	d[x] += d[fa[x]];
	return fa[x] = root;
}

int main()
{
	int n, m;
	while (scanf("%d%d", &n, &m) != EOF)
	{
		for (int i = 1; i <= n; i++)
		{
			fa[i] = i;
			d[i] = 0;
		}
		int ans = 0;
		for (int i = 1; i <= m; i++)
		{
			int a, b, sum;
			scanf("%d%d%d", &a, &b, &sum);
			int x = get(a - 1);
			int y = get(b);
			if (x == y)
			{
				if (d[b] - d[a - 1] != sum)
					ans++;
			}
			else
			{
				fa[y] = x;
				d[y] = d[a - 1] - d[b] + sum;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

思考:
番号のプレフィックスとアレイ合計と[i]は、X、Y、及びその和[Y] -sum [X- 1]。メンテナンスとチェック収集、ルート・パス値への権利の同じセット上の関係を知られている2つの数字は、プレフィックスとのルートです。
ベクターは、理解するために使用することができます。
ここに画像を挿入説明

公開された28元の記事 ウォンの賞賛0 ビュー320

おすすめ

転載: blog.csdn.net/xukeke12138/article/details/104824640