题目描述
背景
...
里斯本的绿荫的街道上每天都有熙熙攘攘的人群...这座座落在半岛西岸的城市..每天都充满着安静的气息...
人们不必为了食物而整日的发愁...每个人都可以在这里...在一片属于自己的角落...分享着午后的温暖de阳光...
...
描述
这一天下午...在学校的课堂里..一些训练生在一起讨论一道困难的平面几何题...
可是因为这题的条件众多..想从纷繁复杂的条件里推出最后的结果...并不是一件容易的事情...
于是...如果可以根据现在的条件...把所有可以得到的结果都推出来...也许会很有帮助?
Task1: 统计平行线段总数...
Task2: 回答询问...
'Parallel.'(平行)..
'Vertical.' (垂直) ..还有
'No idea.' (不知道)
格式
输入格式
第一行依次是直线数n,条件数m...询问数...q..
紧接着是m个条件..p表示平行.v表示垂直.
直线用字母l加一个数字什么的..表示..
输出格式
Task1就不解释了...Task2会询问两条直线间的关系...
两条直线的关系会是下面三种情况之一..
`Parallel.' (平行)..
`Vertical.' (垂直) ..
`No idea.' (不知道)..
样例1
样例输入1
6 5 2
l1 p l2
l2 v l4
l2 p l3
l4 p l5
l4 v l6
l1 l3
l2 l6
样例输出1
7
Parallel.
Parallel.
样例2
样例输入2
2 2 0
l1 v l2
l1 p l2
样例输出2
There must be something wrong...
限制
出题人不透露
提示
告诉你们..最大的数据是n=200...
所有数据均可以在longint范围内得到解决.。
如果有矛盾的情形...那么在预处理阶段就应该结束...请参考Sample2...
输入的数据不要离散化...是按1到n的顺序顺序给出的..(...汗..)
不会询问 l1 和 l1 的关系...(...再说这个是重合...也不算平行...#)
不会询问不在输入里的直线....(..再说这个也啥用啊...)..
条件不会有重复的情况...例如(先告诉你l1和l2平行..又告诉你l1和l2平行....)
(但是会有先告诉你l1和l2平行..l2和l3平行...再告诉你..l1和l3平行...这个没关系..)
哎呀...测试数据都是很善意的...我们没有刻意要害大家...也没有刻意要卡时间的数据呀...
题目分析
首先输入一定要正确
这里我用了一个字符l通过l不断一个一个的取字符
来得到我们想要的数字
用的邻接矩阵
数据200^2 不会超时
然后 弗洛伊德来求出没两个点之间的距离
平行线的长度用双重循环来判断
因为做的是无向图 所以有的会判断两次
因此输出的时候要除以2
然后就输入判断
同样要输入正确
判断他们两个之间的关系是1 还是 -1
从而判断着输出答案
源代码
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 int n,m,q,w[202][202],ans=0; 7 char l,c; 8 int main() 9 { 10 //freopen("1697.txt","r",stdin); 11 memset(w,0x3f,sizeof(w)); 12 scanf("%d%d%d",&n,&m,&q); 13 for(int i=1;i<=m;i++) 14 { 15 l=getchar(); 16 int r1,r2; 17 l=getchar(); 18 scanf("%d",&r1); 19 l=getchar(); 20 scanf("%c",&c); 21 l=getchar(); 22 l=getchar(); 23 scanf("%d",&r2); 24 if(w[r1][r2]>10000) 25 { 26 if(c=='p') 27 w[r1][r2]=1; 28 if(c=='v') 29 w[r1][r2]=-1; 30 w[r2][r1]=w[r1][r2]; 31 } 32 else 33 { 34 printf("There must be something wrong..."); 35 return 0; 36 } 37 } 38 for(int k=1;k<=n;k++) 39 for(int i=1;i<=n;i++) 40 for(int j=1;j<=n;j++) 41 if(w[i][j]>10000&&(w[i][k]*w[k][j]==1||w[i][k]*w[k][j]==-1)) 42 w[i][j]=w[i][k]*w[k][j]; 43 for(int i=1;i<=n;i++) 44 for(int j=1;j<=n;j++) 45 if(w[i][j]==1&&i!=j) 46 ans++; 47 printf("%d\n",ans/2); 48 for(int i=1;i<=q;i++) 49 { 50 int r3,r4; 51 l=getchar(); 52 l=getchar(); 53 scanf("%d",&r3); 54 l=getchar(); 55 l=getchar(); 56 scanf("%d",&r4); 57 if(w[r3][r4]==1) 58 printf("Parallel.\n"); 59 if(w[r3][r4]==-1) 60 printf("Vertical.\n"); 61 if(w[r3][r4]>10000) 62 printf("No idea.\n"); 63 } 64 return 0; 65 }