トピックリンク:http://codeforces.com/contest/1293/problem/C
質問の意味:、q個のクエリと2 * n個のグリッドが与えられ、N、Qを、与えられました。
各Rクエリを与え&LT IとC Iを、R&LT Iは 1又は2であり、C I nを1との間、即ち、(R&LT所与I、C I)、クエリの状態遷移(から出発点それは通過することができる/経過していません)。
1,2 2、点(1,2)は、1を指定して、この時間を渡すことができないでクエリとして与えられ、点(1,2)であれば後であってもよいです。
(1,1)からQ.缶は、与えられたクエリは、開始と終了を通過しないことを保証する(2、n)に来ます。
アイデア:
Nおよびqは最大1E5なので、それが直接のn * qは暴力ではありません。
それを行うには3000人に起因して、その水の問題がある:)
あまり考えてはいけない:)
セグメントツリーが行われる必要があります
行うことができる必要があります各通過点を列挙することができませんが、トラブルで
近くのポイントは3点のみの最大の影響を与えているので
これは、対応する時点を加え、それを削除することができる時点を穿刺貢献と共に、直接O(Q)とすることができます。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 1E5 + 10 。 INT C [ 2 ] [MAXN]。 int型のmain() { int型 N、Q、NUM = 0 。 scanf関数(" %D%D "、&N、&Q)。 用(INT iは= 0 ; I <Q I ++ ) { int型のX、Y。 scanf関数(" %D%D "、およびX&Y)。 X - ; もし(C [X] [Y]) { C [X] [Y] = 0 ; もし(C [X ^ 1 ] [Y])num-- 。 もし(C [X ^ 1 ] [Y + 1 ])num-- 。 もし(C [X ^ 1 ] [Y- 1 ])num-- 。 } 他 { C [X] [Y] = 1 。 もし(C [X ^ 1 ] [Y])NUM ++ 。 もし(C [X ^ 1 ] [Y + 1 ])NUM ++ 。 もし(C [X ^1 ] [Y-1 ])NUM ++ 。 } であれば(NUM == 0)のprintf(" はい\ n " ); 他のprintf(" ノー\ N " ); } 戻り 0 。 }