19牛客多校第十場G

2022-04-06 10:32:47 字數 4414 閱讀 1560

之前gym做過乙個畫圓的。。。

然後這個也想畫圓。。。

算了算複雜度n^3logn還蠻好。

卡常卡了3個小時投降了。

學藝不精啊。。。

賽後去看了qls的**。學到了神奇的優化技巧。

比如我們要check點到直線的距離是否大於等於二分的半徑r。

我們可以直接用叉積判,而不是算投影。。。

我覺得最大的優化就在這了,理論上省了一半多常數。

之前給學弟講課還說了計算幾何最重要的就是會用叉積結果自己都不會。。

題解的結論其實不是很難想,奈何先入為主地想到了其他理論上很對的做法也就不會去猜什麼結論了。。

哭了。300的資料n^3logn還要精打細算的卡常。。。

扔個畫圓的**。

#include using namespace std;

typedef double db;

const db eps=1e-6;

const db pi=acos(-1);

void prt(db x)

inline int sign(db k)

inline int cmp(db k1,db k2)

int inmid(db k1,db k2,db k3)// k3 在 [k1,k2] 內

struct point;}

point operator - (const point &k1) const;}

point operator * (db k1) const;}

point operator / (db k1) const;}

int operator == (const point &k1) const

// 逆時針旋轉

point turn(db k1);}

point turn90();}

bool operator < (const point k1) const

db abs()

db abs2()

inline db dis(point k1)

point unit();}

void scan()

void print()

db getw()

point getdel()

int getp() const

};int inmid(point k1,point k2,point k3)

inline db cross(point k1,point k2)

db dot(point k1,point k2)

db rad(point k1,point k2)

// -pi -> pi

int compareangle (point k1,point k2)

point proj(point k1,point k2,point q)

point reflect(point k1,point k2,point q)

int clockwise(point k1,point k2,point k3)

int checkll(point k1,point k2,point k3,point k4)

point getll(point k1,point k2,point k3,point k4)

int intersect(db l1,db r1,db l2,db r2)

int checkss(point k1,point k2,point k3,point k4)

db dissp(point k1,point k2,point q)

db disss(point k1,point k2,point k3,point k4)

int ons(point k1,point k2,point q)

struct circle

int inside(point k)

};struct line

point& operator (int k)

int include(point k)

point dir()

line push();

}};point getll(line k1,line k2)

int parallel(line k1,line k2)

int samedir(line k1,line k2)

int operator < (line k1,line k2)

int checkpos(line k1,line k2,line k3)

vectorgethl(vector&l)

while (q.size()>2&&!checkpos(q[q.size()-2],q[q.size()-1],q[0])) q.pop_back();

while (q.size()>2&&!checkpos(q[1],q[0],q[q.size()-1])) q.pop_front();

vectorans; for (int i=0;i&a,int l,int r)

int mid=l+r>>1; db ans=min(closepoint(a,l,mid),closepoint(a,mid+1,r));

vectorb; for (int i=l;i<=r;i++) if (abs(a[i].x-a[mid].x)<=ans) b.push_back(a[i]);

sort(b.begin(),b.end(),(point k1,point k2)

vectorgetcl(circle k1,point k2,point k3);

point del=(k3-k2).unit()*sqrt(max((db)0.0,d)); return ;

}vectorgetcc(circle k1,circle k2);

db a=(k2.o-k1.o).abs2(),cosa=(k1.r*k1.r+a-k2.r*k2.r)/(2*k1.r*sqrt(max(a,(db)0.0)));

db b=k1.r*cosa,c=sqrt(max((db)0.0,k1.r*k1.r-b*b));

point k=(k2.o-k1.o).unit(),m=k1.o+k*b,del=k.turn90()*c;

return ;

}vectortangentcp(circle k1,point k2);

}inline vectortangentoutcc(circle k1,circle k2);

if (pd==1)};}

if (cmp(k1.r,k2.r)==0),(line)};

} else ;

if (pd==3)};}

point p=(k2.o*k1.r+k1.o*k2.r)/(k1.r+k2.r);

vectora=tangentcp(k1,p),b=tangentcp(k2,p);

vectorans; for (int i=0;itangentcc(circle k1,circle k2)

int n;

circle c[305];

vectorv;

bool check(db d)

if(f&&x==y)return true;}}

}return false;

}int main()

db l=0,r=2e6;

for(int i=1;i<=42;i++)else

}printf("%.11f\n",l);

}

扔個題解思路**

#include using namespace std;

typedef double db;

const db eps=1e-6;

const db pi=acos(-1);

inline int sign(db k)

inline int cmp(db k1,db k2)

struct point;}

point operator - (const point &k1) const;}

point operator * (db k1) const;}

point operator / (db k1) const;}

point turn90();}

bool operator < (const point k1) const

db abs()

};db cross(point k1,point k2)

int n;point p[1005];

db ans = 0;db dis[1005];

void slove(point x)

sort(dis+1,dis+1+n);

ans = max(ans,fabs(dis[n/2+1]-dis[n/2])/2);

}int main()

for(int i=1;i}

printf("%.12f\n",ans);

}

2019牛客多校第十場

對於s n s n s n 考慮某個字母是從s n 1 s n 1 s n 1 轉移還是從s n 2 s n 2 s n 2 轉移 include define fo i,a,b for i a i b i define n 10005 using namespace std int t,n,q,p...

2020牛客多校第十場 A

x 是乘法 以任意點為起點,一直以 2 x now p 第一類 做的話 或者3 x now p 第二類 會形成乙個或者多個環。環上有什麼特點。對於 某個數z,它所對應的後一位是y,當 2 x z p 3 x z p 相等的時候,這兩類的環在z後面的數y時一樣的。但是 上式化簡 2 x z n x p...

牛客網暑期多校 (第十場)

題意 給你乙個長度為 n 的序列,初始元素均為 0 有 3 種操作,1 是給序列的某乙個區間加上同乙個元素,2 是將此序列變為它的字首和序列,3 是求序列某乙個區間的和 資料保證 操作3 的次數不多於 500 次 思路分析 這題想了好久才勉強有點思路,挺不錯的一道題目 可以這樣想,當我們在某乙個位置...