NP问题
(n<=100)
我觉得出题人并不是为了考验心理而出,而是因为大家的想法中n必须是这个范围
——————————————————————————————————————————————
一条直线左边的点数和右边的点数不会变 (直线上的点根据需要去定义在左边或右边)
这个很好证,每次直线的移动会使一个点更换位置,而直线上的点可以根据需要定义,因为最后统计答案的直线上的数和在直线上的先后无关
所以直接统计出直线x=A经过的点是第k个点,然后答案就只可能是y轴上的第k(下端有k-1点)个点或n-k+1(上端有k-1个点)个点,然后排一下序就做完了
——————————————————————————————————————————————
P.S 比赛的时候想了一个做法,但知道现在都没调出来
我们发现每次旋转后,其实就会到达第一个大于原来斜率的斜率(最大斜率除外),开个桶维护一下就好了
错误做法的代码
#include<bits/stdc++.h>
using namespace std;
const int N=110;
const int AA=1000010;
int x[N],y[N],n,A,cot[N];
struct mess{
int kx,ky,num,y;
}q[N][N];
bool ans[AA];
bool MAX(int xx1,int yy1,int xx2,int yy2){
if(yy1==0) return 0;
if(yy2==0) return 1;
if((xx1<0&&xx2>0)||(xx1>0&&xx2<0)){
return 1ll*yy2*xx1<1ll*yy1*xx2;
}
return 1ll*xx1*yy2>1ll*xx2*yy1;
}
bool cmp(mess x,mess y){
if(x.kx==0||y.kx==0){
return abs(x.kx)>abs(y.kx);
}
if((x.kx<0&&y.kx>0)||(x.kx>0&&y.kx<0)) return x.ky*y.kx>x.kx*y.ky;
return x