记录编号 |
202476 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[SYOI 2015] Asm_Def的模拟赛 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.440 s |
提交时间 |
2015-11-01 12:04:14 |
内存使用 |
0.69 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int SIZEN=310;
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
class Point{
public:
int x,y;
}P[SIZEN];
bool operator < (const Point &a,const Point &b){
return a.x<b.x;
}
Point operator - (const Point &a,const Point &b){
return (Point){a.x-b.x,a.y-b.y};
}
int cross(const Point &a,const Point &b){
return a.x*b.y-b.x*a.y;
}
int N;
int under[SIZEN][SIZEN]={0};
bool is_under(Point c,Point a){//c是否在a下方
return c.x==a.x&&c.y<a.y;
}
bool is_under(Point c,Point a,Point b){//c是否在ab下方
if(a.x>b.x) swap(a,b);
return a.x<=c.x&&c.x<=b.x&&cross(a-b,c-b)>0;
}
int calc(int i,int j,int k){//从左到右i,j,k
int ans=0;
if(cross(P[i]-P[k],P[j]-P[k])>0){//j在直线ik下方
ans=under[i][k]-(under[i][j]+under[j][k]-under[j][j]);
ans+=2;
}
else{//j在直线ik上方
ans=(under[i][j]+under[j][k]-under[j][j])-under[i][k];
ans+=3;
}
return ans;
}
void work(void){
int ans=0,cnt=0;
for(int i=1;i<=N;i++){
for(int j=i+1;j<=N;j++){
for(int k=j+1;k<=N;k++){
int now=calc(i,j,k);
if(now>ans){
ans=now;
cnt=1;
}
else if(now==ans){
cnt++;
}
}
}
}
printf("%d\n%d\n",ans,cnt);
}
void prepare(void){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(j==i) continue;
if(is_under(P[j],P[i])) under[i][i]++;
}
for(int j=1;j<i;j++){
for(int k=1;k<=N;k++){
if(k==i||k==j) continue;
if(is_under(P[k],P[i],P[j])) under[i][j]++;
}
under[j][i]=under[i][j];
}
}
}
void read(void){
scanf("%d",&N);
for(int i=1;i<=N;i++){
scanf("%d%d",&P[i].x,&P[i].y);
}
sort(P+1,P+1+N);
}
int main(){
freopen("trib.in","r",stdin);
freopen("trib.out","w",stdout);
read();
prepare();
work();
return 0;
}