unordered_mapの使い方を学びましょう。上海のリージョナルゲームの前に初めて見ました。地図の使い方と同じくらい自信があり、使えると感じました。しかし、フィールドで立ち往生しました。今度はロールします。 orzを学ぶために[その後、Gの質問はこのことを使用する必要がないことがわかりました。
ハッシュを学んだ人は離散化を簡単に理解できます。データが大きすぎてこのような大きな配列を開くことができない場合にすぎませんが、実際には中央に多くの無駄なスペースがあるため、別の配列にマップするだけで十分です。アレイ。
以前に一般的に使用されていたC ++離散化は
// a[i] 为初始数组,下标范围为 [1, n]
// len 为离散化后数组的有效长度
std::sort(a + 1, a + 1 + n);
len = std::unique(a + 1, a + n + 1) - a - 1;
// 离散化整个数组的同时求出离散化后本质不同数的个数。
std::lower_bound(a + 1, a + len + 1, x) - a; // 查询 x 离散化后对应的编号
また、unordered_mapは、ハッシュテーブルを内部的に実装するデータ構造です。その検索効率はO(1)です。
それでは、最初に基本的なアプリケーションの例に行きましょう:https://ac.nowcoder.com/acm/contest/5158/H
明らかに、コレクションを確認しますが、1e9は非常に大きく、離散化する必要があります。次に、このunordered_mapを使用して、コレクション内のpre配列を置き換え、問題がないことを確認します。
#include<bits/stdc++.h>
using namespace std;
unordered_map<int ,int > pre;
int find(int a)
{
if(pre[a] == 0)
return a;
else
return pre[a] = find(pre[a]);
}
void Union(int a,int b){
int m = find(a);
int n = find(b);
pre[m] = n;
return ;
}
int main()
{
cin.tie(0),ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--) {
pre.clear();
int flag = 1;
int n,a,b,c;
cin >> n;
for(int i = 0 ;i < n; i++) {
cin>>a>>b>>c;
int m = find(a);
int n = find(b);
if(c == 1 ){
if( m!=n && a !=m &&b != n){
flag = 0;
break;
}
else
Union(a,b);
}
else{
if( m == n){
flag = 0;
break;
}
}
}
if(flag == 0)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
system("pause");
return 0;
}
テストが完了しなかった後も書き込みを続けます