ディレクトリ
CF650Aウォッチメン
3つのマップの問題に一つだけ解決策
1. 手推公式
\(| X2-X1 | + | Y2-Y1 | = \のSQRT {(X2-X1)^ 2 +(Y2-Y1)^ 2} \)
提供| X2-X1 | =、| Y2-Y1 | = B
\(A + B = \ SQRT {A ^ 2 + B ^ 2} \)
\((A + B)^ 2 = A ^ 2 + B ^ 2 \)
\(^ 2 + 2AB + B ^ 2 = A ^ 2 + B ^ 2 \)
\(2AB = 0 \)
\(アブ= 0 \)
\(| X2-X1 | * | Y2-Y1 | = 0 \)
\(| X2-X1 | = 0 \:\:または\:\:| Y2-Y1 | = 0 \)
\(X1 = X2 \:\:または\:\:Y1 = Y2 \)
2.アルゴリズム
式から分かるように、第二選挙水平および垂直座標は同じであり、二つの要件を満たすために
マップ上に直接、座標範囲を大
X- []行に格納されている点が現れ、Yは[]列に格納されているが、点登場P [] []格納された、いくつかの座標点が登場しました
X [X] + Y [Y] -p [X] [Y]は答えであります
3.最適化
既知の、マップの複雑さは、ログレベルであり、unordered_mapはO(1)であります
そうするための2つの添え字は、私たちが代わりにunordered_mapを使用することができますintです
4.補足
make_pair(x、y)はx、yの混乱対<、>型のものを意味します
以下の2つのコードは同等です。
a=make_pair(x,y);
a.first=x;
a.second=y;
(そのためのC ++の高いCF版のヒント。、そうスラッシュ2つの文を取り除くために、しかし、NOIPは、追加したいです)
#include <bits/stdc++.h>
//#include <tr1/unordered_map>
//using namespace std::tr1;
using namespace std;
unordered_map<int,int> X,Y;
map<pair<int,int>,int> p;
long long ans; //答案会爆int
int n;
signed main(){
scanf("%d",&n);
for(int i=1,x,y;i<=n;i++){
scanf("%d%d",&x,&y);
ans+=X[x]+Y[y]-p[make_pair(x,y)];
X[x]++;
Y[y]++;
p[make_pair(x,y)]++;
}
printf("%I64d",ans);
}