トピックへのリンク:https://vjudge.net/contest/339425#problem/E
アイデア:
今回の質問は互いに素セットのようなものとしなければならなかったが、私は忘れてしまいました。
より多くの形而上学的なアプローチが用意されました
それはABCの三点との間の関係を意味しているので
だから私は(つまり、3回オープンスペースである)の三点にポイント分割を置くポイントを表すABCであります
その後の質問は、シミュレーションになりましたか???
1の#include <math.h>の 2の#include <stdio.hの> 3の#include <STDLIB.H> 4の#include <iostreamの> 5の#include <アルゴリズム> 6の#include < ストリング > 7の#include < 文字列・H> 8の#include <ベクトル> 9の#include <地図> 10の#include <積層> 11の#include < 設定 > 12 // の#include <ランダム> 13 14 の#define LL長い長い 15 の#define 0x3f3f3f3f INF 16 の#define LS NOD << 1 17個 の#define RS(NOD << 1)+1 18 のconst int型 MAXN = 3E5 + 10 。 19の CONST ダブル EPS = 1E- 9 。 20 int型のプレ[MAXN]。 21 22 ボイドのinit(int型N){ 23 のための(int型 I = 0 ; iが<= N; iが++ ){ 24 プレ[I] = I。 25 } 26 } 27 28 int型の検索(int型X){ 29 であれば(予備[X] == x)は 30 リターンX。 31 リターンは、予め[X] = ([X] PRE)を見つけます。 32 } 33 34 空隙マージ(int型のx、int型のY){ 35 INT rootx = =(x)は、ルーティを見つける(y)を見つけます。 36 プレ[ルーティー] = rootx。 37 } 38 INT メイン(){ 39 int型N、K。 40 のscanf(" %D%dの"、&N&K)。 41 INIT(3 *のN)。 42 int型、D、X、Y。 43 INT ANS = 0 。 44 のために(int型 i = 1 ; iが= Kを<; Iは++ ){ 45 のscanf(" %D%D%D "、&D、およびX&Y)。 46 であれば(X> N || Y> N){ 47の ANS ++ 。 48 続け; 49 } 50 であれば(Dの== 1 ){ 51 であれば((X)==検索(Y + n)を見つける||を見つける(X)==検索(Y + 2 *のN)){ 52の ANS ++; 53 続け; 54 } 55 マージ(X、Y) 56 マージ(X + N、Y + N)。 57 マージ(X + 2 ×n個、Y + 2 *のN)。 58 } 59 であれば(Dの== 2 ){ 60 であれば(見つける(X)==検索(Y)||(X)==検索(Y +見つける2 *のN)){ 61の ANSを++ 。 62 続け; 63 } 64 マージ(X、Y +N); 65 マージ(X + N、Y + 2 * N)。 66 マージ(X + 2 *のN、Y)。 67 } 68 } 69 のprintf(" %d個の\ n " 、ANS)。 70 リターン 0 ; 71 }