CF650Aウォッチメン(STL +マップ)


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);
}

おすすめ

転載: www.cnblogs.com/think-twice/p/11256383.html