Description

与当地鞋匠协会发生冲突的瓦维尔城堡的龙决定将它的狩猎场移出克拉科夫以减少敌对的邻居数量。现在他正在给和平而宁静的Bytes王国带来灾难与恐怖。

在Bytes王国有n条河流,每一条河流都是一条直线(你可以认为Bytes王国就像是欧几里得平面上被一些直线划分的一些区域),不存在三条河流共用同一个点,河流们将王国划分成了一些区域。

幸运的是,现在王国里有m个勇士。每个勇士都发誓要保护其所在的区域。王国也许就因此受到了长远持久的保护?

我们所知道的只有龙不会攻击存在至少一个勇士的区域。勇士们因为他们的勇气被人所熟知,然而他们的智力却低的可怕,他们不会离开自己所在的区域,只会保护所在的区域。

给出一个王国的地图,和勇士的坐标,请你计算是否所有的区域都被保护到了。

Input

第一行一个正整数T,表示有T组数据。

每组数据第一行两个正整数n和m,表示有n条河流,m个勇士,\(1\leqslant n\leqslant 100,1\leqslant m\leqslant50000\)。

接下来n行,第j行三个整数\(A_j, B_j, C_j\),表示第j个河流的直线方程是\(A_j * x + B_j * y + C_j = 0\),三个数字的绝对值都不超过10000。

接下来m行,第i行两个整数\(X_i, Y_i\),表示第i个勇士的坐标是\((X_i, Y_i)\),\(-10^9\leqslant X_i, Y_i\leqslant10^9\)。

你可以认为没有一个勇士站在河流上(如果他这么做他的铠甲会很快生锈呢)。两个勇士的坐标可能相同。不存在两条河流是重合的直线,不存在三条河流共用同一个点。

Output

对于每组数据输出一行,如果每个区域都可以被保护,输出"PROTECTED",否则输出"VULNERABLE"。(不含引号)

Sample Input

2

3 7

0 1 0

1 0 0

1 1 -3

1 1

5 -1

3 2

2 -2

-2 6

-1 -2

-8 4

1 1

0 1 0

0 1

Sample Output

PROTECTED

VULNERABLE


乱搞……

首先求出直线将平面分成多少个区域,对于一条直线,若它和之前\(x\)条直线相交,则平面会多划分出\(x+1\)个区域(注意初始区域数目为1)

然后我们只需要求出骑士们所在的区域个数是否等于分出的区域个数即可

如何判?

考虑将骑士与\((0,0)\)连线,不同的区域所交的直线编号必定不同,hash判重即可

如果有直线经过\((0,0)\)怎么办?我们在平面中随机找一个不被任何直线经过的点,与所有骑士连线即可

注意存在\(0x+0y=0\)的直线,不用特判,直接做即可(应该不论如何都会输出"VULNERABLE")

然后还要记得,直线判交是判断斜率是否相等,判断斜率使用交叉相乘,不要用\(A_1\)\(A_2\)&&\(B_1\)\(B_2\),x+y=0和2x=2y=1斜率相同……

/*program from Wolfycz*/
#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define Fi first
#define Se second
#define MK make_pair
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned int ui;
typedef unsigned long long ull;
typedef pair<long double,long double> pdd;
inline char gc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int frd(){
int x=0,f=1; char ch=gc();
for (;ch<'0'||ch>'9';ch=gc()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=gc()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline int read(){
int x=0,f=1; char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline void print(int x){
if (x<0) putchar('-'),x=-x;
if (x>9) print(x/10);
putchar(x%10+'0');
}
const int N=1e2,M=5e4,V=1e9;
const ld eps=1e-8;
const int limit=254753,Mod=379541;
struct S1{
ll A,B,C;
S1(){A=B=C=0;}
S1(ll _A,ll _B,ll _C){A=_A,B=_B,C=_C;}
void rd(){A=read(),B=read(),C=read();}
bool ck(int x,int y){return 1ll*A*x+1ll*B*y+C==0;}
}Line[N+10];
ui g[N+10],f[N+10];
struct S2{
int pre[M+10],now[Mod+10];
int stack[Mod+10],top,tot;
ui child[M+10];
void insert(int x,ui y){pre[++tot]=now[x],now[x]=tot,child[tot]=y;}
void insert(ui x){insert(stack[++top]=x%Mod,x);}
bool find(ui x){
int Now=x%Mod;
for (int p=now[Now];p;p=pre[p])
if (child[p]==x) return 1;
return 0;
}
void clear(){
for (int i=1;i<=top;i++) now[stack[i]]=0;
top=0;
}
}Hash;
bool ck(const S1 &x,const S1 &y){return 1ll*x.A*y.B==1ll*x.B*y.A;}
bool G(int l,int r,ld x){
if (l>r) swap(l,r);
if ((l<x||fabs(x-l)<=eps)&&(x<r||fabs(x-r)<=eps)) return 1;
return 0;
}
pdd get(const S1 &a,const S1 &b){
ld x=(1.0*a.B*b.C-1.0*b.B*a.C)/(1.0*b.B*a.A-1.0*a.B*b.A);
ld y=(1.0*a.A*b.C-1.0*b.A*a.C)/(1.0*b.A*a.B-1.0*a.A*b.B);
return MK(x,y);
}
int main(){
srand(time(0)); g[0]=1;
for (int i=1;i<=N;i++) g[i]=g[i-1]*limit;
for (int T=read();T;T--){
Hash.clear();
int n=read(),m=read(),cnt=1,num=0;
for (int i=1;i<=n;i++){
Line[i].rd(),cnt++;
for (int j=1;j<i;j++) if (!ck(Line[i],Line[j])) cnt++;
}
int Zx,Zy;
while (true){
Zx=1ll*rand()*rand()%V;
Zy=1ll*rand()*rand()%V;
bool flag=1;
for (int i=1;i<=n;i++){
if (Line[i].ck(Zx,Zy)){
flag=0;
break;
}
}
if (flag) break;
}
for (int i=1;i<=m;i++){
int x=read(),y=read(); ui z=0;
S1 tmp(y-Zy,Zx-x,1ll*x*Zy-1ll*Zx*y);
for (int j=1;j<=n;j++){
pdd res=get(tmp,Line[j]);
if (G(x,Zx,res.Fi)&&G(y,Zy,res.Se)) z+=g[j];
}
if (Hash.find(z)) continue;
num++,Hash.insert(z);
}
printf(cnt==num?"PROTECTED\n":"VULNERABLE\n");
}
return 0;
}

[BZOJ4064/Cerc2012]The Dragon and the knights的更多相关文章

  1. UVALive 6263 The Dragon and the knights --统计,直线分平面

    题意:给n条直线,将一个平面分成很多个部分,再给m个骑士的坐标,在一个部分内只要有一个骑士即可保护该部分,问给出的m个骑士是不是保护了所有部分. 解法:计算每个骑士与每条直线的位置关系(上面还是下面) ...

  2. Central Europe Regional Contest 2012 Problem I: The Dragon and the Knights

    一个简单的题: 感觉像计算几何,其实并用不到什么计算几何的知识: 方法: 首先对每条边判断一下,看他们能够把平面分成多少份: 然后用边来对点划分集合,首先初始化为一个集合: 最后如果点的集合等于平面的 ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. 要back的题目 先立一个flag

    要back的题目 目标是全绿!back一题删一题! acmm7 1003 1004 acmm8 1003 1004 sysu20181013 Stat Origin Title Solved A Gy ...

  5. Uva11292--------------(The Dragon of Loowater)勇者斗恶龙 (排序后贪心)

    ---恢复内容开始--- 题目: Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major ...

  6. [ACM_水题] UVA 11292 Dragon of Loowater [勇士斗恶龙 双数组排序 贪心]

    Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major problem. The shor ...

  7. The Dragon of Loowater

      The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into ...

  8. uva-----11292 The Dragon of Loowater

    Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...

  9. uva 11292 Dragon of Loowater (勇者斗恶龙)

    Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...

随机推荐

  1. 《从零開始学Swift》学习笔记(Day 61)——Core Foundation框架之内存管理

    原创文章,欢迎转载. 转载请注明:关东升的博客 在Swift原生数据类型.Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,尽管是大部分是能够零开销桥接,零开 ...

  2. 第一讲:使用html5——canvas绘制奥运五环

    <html> <head> <title>初识canvas</title> </head> <body> <canvas ...

  3. js appendChild 自带remove和append两个功能

    一提到appendChild ,我们就知道是在父节点上增加子节点. 经常使用到它就是动态增加一个元素,将其加入到指定的父节点下. 其实appendChild除了这个功能之外,他还有一个功能:如果子节点 ...

  4. 对 block 内存管理的一些看法

    首先交代一下retain cycle ,和 产生retain cycle后我们应该怎么处理. 1.retain cycle在block中是极易产生,block就是一段可以灵活使用的代码,你可以把它当做 ...

  5. Hive 特性及原理

    特点:Hive是构建在hadoop之上的数据仓库.数据存储在hdfs上,数据计算用的mapreduce框架.用户无需掌握MR的编写,通过类SQL语句即可自动生成查询计划. 主要内容:     接入入口 ...

  6. Android 5.x SEAndroid/SElinux内核节点的读写权限【学习笔记】

    本文转载自:http://blog.csdn.net/tung214/article/details/44461985 Android 5.0下,因为采取了SEAndroid/SElinux的安全机制 ...

  7. Redis持久化(RDB和AOF)

    什么是Redis持久化 什么是Redis持久化,就是将内存数据保存到硬盘. Redis 持久化存储 (AOF 与 RDB 两种模式) RDB持久化 RDB 是以二进制文件,是在某个时间 点将数据写入一 ...

  8. oracle:rman恢复----通过增量备份来恢复

    试验计划:先rman进行一个0级备份,插入表相关数据,再进行level 1级增量备份,进行rman恢复 实验环境:归档模式下,oracle10.2.0.1 开始试验: 1. rman level 0级 ...

  9. hdu 3336 Count the string(next数组)

    题意:统计前缀在串中出现的次数 思路:next数组,递推 #include<iostream> #include<stdio.h> #include<string.h&g ...

  10. 我自己比较习惯的Watir自动化测试代码管理方式