Delayyy君 Delayyy君
...
关注数: 4 粉丝数: 21 发帖数: 318 关注贴吧数: 10
【网盘】=我是网盘君请轻戳= #include<cstdio>#include#includeusing namespace std;const int SN=200100;const double oo=1e18, pi=acos(-1), eps=1e-10; struct dbl { double x,y; };struct line { dbl P,v; double jj; int od; };int n,m,i,l,r,md,ql,qr;line R[SN],que[SN];dbl p[SN]; dbl operator + (dbl a, dbl b) { return (dbl){a.x+b.x, a.y+b.y}; }dbl operator - (dbl a, dbl b) { return (dbl){a.x-b.x, a.y-b.y}; }dbl operator * (dbl a, double b) { return (dbl){a.x*b, a.y*b}; }dbl operator / (dbl a, double b) { return (dbl){a.x/b, a.y/b}; } int dcmp(double d) { if(d<-eps) return -1; else return d>eps; }double cj(dbl a, dbl b) { return a.x*b.y-a.y*b.x; }double dj(dbl a, dbl b) { return a.x*b.x+a.y*b.y; }double dis(dbl a, dbl b) { return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) ); }double fjj(dbl v) { double rn=atan2(v.y, v.x); rn=(rn<0)?rn+2*pi:rn; return rn; }void rotate(dbl& v, double g) { double C=cos(g),S=sin(g); v=(dbl){C*v.x-S*v.y, S*v.x+C*v.y}; } bool Cmp(line a, line b) { return a.jj+eps1;} int main(){ double x,y1,y2; freopen("oj.in", "r", stdin); freopen("oj.out", "w", stdout); for(i=1,scanf("%d", &n); i<=n; i++) { scanf("%lf%lf%lf", &x, &y1, &y2); y1-=eps*10, y2+=eps*10; AddL(-x, y1/x, 0); AddL(-x, y2/x, 1); } m++, R[m].P=(dbl){-1, -1}, R[m].v=(dbl){1, 0}; m++, R[m].P=(dbl){-1, -1}, R[m].v=(dbl){0, 1}; m++, R[m].P=(dbl){oo, oo}, R[m].v=(dbl){-1, 0}; m++, R[m].P=(dbl){oo, oo}, R[m].v=(dbl){0, -1}; for(i=1; i<=m; i++) R[i].jj=fjj(R[i].v); sort(R+1, R+m+1, Cmp); for(l=1,r=n,md=(l+r+1)/2; l
【信息】线性筛素数 线性筛素数   线性筛素数的基本思想是:每个合数只被筛一次,将被其最大因数筛掉。   假设我们依据flag数组从小到大判断每个数是否是素数,如果当前该数还未被筛掉,那么就是素数,因为在比它小的数中没有发现因数,将素数加入素数表中。对每一个数i(不论素数或合数),用它筛掉flag数组中以它为最大因数的数。因为每个数只去筛以它为最大因数的数,所以每个合数只会被一个数筛,就是它的最大因数,以此达到线性的复杂度。   假设当前的数是i。以i为最大因数的数是哪些呢?这些数必然是i乘上一个比它小的素数(如果该数是i乘上一个比它大的素数,显然i不会是该数的最大因数;如果是i乘上一个合数x = p1*p2*...*pk (pi为素数),显然通过将x的一些素因数与i相乘会得到比i大的因数)。   假设i可以表示为素数乘积:i = p1*p2*...*pn,x是一个比i小的素数(x显然已经被筛出来了,在我们的素数表中),其中i最小的素因数是p1。i只有与当前素数表中p<=p1的素数相乘,得到的数y才以i为最大因数。反证:如果i乘上pm得到y = i*pm,且pm>p1,那么y有因数y/p1 > i = y/pm。   所以对每一个数i,乘上素数表中不大于i的最小素因数p1的素数,将得到的数从flag数组中筛去,我们就可以在线性的时间复杂度下得到一个素数表。
1 下一页