Codeforces 题目传送门 & 洛谷题目传送门

中考终于结束了……简单写道题恢复下状态罢。

首先这一类题目肯定没法用一般的方法解决,因此考虑用一些奇淫的乱搞做法解决这道题,不难发现,如果我们固定住了前 \(n-1\) 条边,那么第 \(n\) 条边的长度与前 \(n-1\) 条边的长度冲突的概率是小之又小了——这个用爪子想想即可明白。

因此考虑一个乱搞做法,我们每次随机前 \(n-1\) 条边的长度 \(l_1,l_2,\cdots,l_{n-1}\),然后从原点开始绕一圈每次旋转 \(\dfrac{2\pi}{n}\) 补全这个 \(n\) 边形,如果最后一条边的长度与前 \(n-1\) 条边长度均不同且在 \((0,1000]\) 之内则直接输出。

这样一来倒是避免边长度相同的问题了,但同时还会带来另一个问题,就是如果有可能我们随机出来的图形不是凸图形,比如说下图:

解决方法倒也容易,把每条边随机的范围变小一点即可,我是将第 \(i\) 条边的长度设为 \(600+0.1i\) 然后 random_shuffle,这样就不太可能出现这样的情况了。

思路出来了,剩下就是实现的问题了,旋转 \(\dfrac{2\pi}{n}\) 我拿复数乘法实现的,最后第 \(n\) 个点的位置需解个直线方程。

随机次数最多大概是 \(2\)(别问我怎么知道的 qwq),时间复杂度 \(\mathcal O(\text{能过)}\)

const int MAXN=100;
const double Pi=acos(-1);
const double EPS=1e-6;
int n;
double len[MAXN+5];
struct point{
double x,y;
point(double _x=0,double _y=0):x(_x),y(_y){}
point operator +(const point &rhs) const{return point(x+rhs.x,y+rhs.y);}
point operator -(const point &rhs) const{return point(x-rhs.x,y-rhs.y);}
point operator *(const double &rhs) const{return point(x*rhs,y*rhs);}
point operator /(const double &rhs) const{return point(x/rhs,y/rhs);}
double operator ~() const{return sqrt(x*x+y*y);}
} p[MAXN+5];
int main(){
srand(time(0));scanf("%d",&n);
if(n<=4) return puts("No solution")&0;
double ang=2*Pi/n;
while(1){
for(int i=1;i<n;i++) len[i]=600+i*0.1;
random_shuffle(len+1,len+n);
p[1]=point(0,0);p[2]=point(len[1],0);
for(int i=3;i<=n;i++){
point dif=p[i-1]-p[i-2];
point coe=point(cos(ang),sin(ang));
point nw=point(dif.x*coe.x-dif.y*coe.y,dif.x*coe.y+dif.y*coe.x);
nw=nw*(len[i-1]/len[i-2]);
if(i^n) p[i]=p[i-1]+nw;
else{
double k1=nw.y/nw.x;
double b=p[i-1].y-k1*p[i-1].x;
double k2=tan(Pi/n*(n-2));
p[i].x=b/(k2-k1);p[i].y=k2*p[i].x;
}
} bool flg=(~(p[1]-p[n])<1000+EPS);
for(int i=1;i<n;i++) flg&=(fabs((~(p[1]-p[n]))-len[i])>EPS);
if(flg) break;
}
for(int i=1;i<=n;i++) printf("%.10lf %.10lf\n",p[i].x,p[i].y);
return 0;
}

Codeforces 306D - Polygon(随机化+乱搞)的更多相关文章

  1. BZOJ1278: 向量vector(计算几何 随机化乱搞)

    题意 题目链接 Sol 讲一下我的乱搞做法.... 首先我们可以按极角排序.然后对\(y\)轴上方/下方的加起来分别求模长取个最大值.. 这样一次是\(O(n)\)的. 我们可以对所有向量每次随机化旋 ...

  2. Codeforces 732e [贪心][stl乱搞]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...

  3. Codeforces 1077E (二分乱搞或者dp)

    题意:给你一个数组,可以从中选区若干种元素,但每种元素选区的个数前一种必须是后一种的2倍,选区的任意2种元素不能相同,问可以选取最多的元素个数是多少? 思路1(乱搞):记录一下每种元素的个数,然后暴力 ...

  4. codeforces 664B B. Rebus(乱搞题)

    题目链接: B. Rebus time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  5. Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)(A.暴力,B.优先队列,C.dp乱搞)

    A. Carrot Cakes time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  6. Codeforces 1182D Complete Mirror 树的重心乱搞 / 树的直径 / 拓扑排序

    题意:给你一颗树,问这颗树是否存在一个根,使得对于任意两点,如果它们到根的距离相同,那么它们的度必须相等. 思路1:树的重心乱搞 根据样例发现,树的重心可能是答案,所以我们可以先判断一下树的重心可不可 ...

  7. Codeforces 538G - Berserk Robot(乱搞)

    Codeforces 题目传送门 & 洛谷题目传送门 一道很神的乱搞题 %%% 首先注意到如果直接去做,横纵坐标有关联,不好搞.这里有一个非常套路的技巧--坐标轴旋转,我们不妨将整个坐标系旋转 ...

  8. codeforces 653C C. Bear and Up-Down(乱搞题)

    题目链接: C. Bear and Up-Down time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  9. codeforces 665C C. Simple Strings(乱搞)

    题目链接: C. Simple Strings time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

随机推荐

  1. 什么,你还使用 webpack?别人都在用 vite 搭建项目了

    一.vite 到底是干嘛的? vite 实际上就是一个面向现代浏览器,基于 ES module 实现了一个更轻快的项目构建打包工具. vite 是法语中轻快的意思. vite 的特点: 1.轻快的冷服 ...

  2. 【UE4 C++ 基础知识】<13> 多线程——TaskGraph

    概述 TaskGraph 系统是UE4一套抽象的异步任务处理系统 TaskGraph 可以看作一种"基于任务的并行编程"设计思想下的实现 通过TaskGraph ,可以创建任意多线 ...

  3. CanalAdmin搭建Canal Server集群

    CanalAdmin搭建Canal Server集群 一.背景 二.机器情况 三.实现步骤 1.下载canal admin 2.配置canalAdmin 3.初始化canal admin数据库 4.启 ...

  4. 2021.9.18考试总结[NOIP模拟56]

    T1 爆零 贪心地想,肯定要先走完整个子树再走下一个,且要尽量晚地走深度大的叶子.所以对每个点的儿子以子树树高为关键字排序$DFS$即可. 也可$DP$. $code:$ T1 #include< ...

  5. [调试笔记] 晚测5 T1 容易题

    众所周知,sbwzx在考试一结束就嚷嚷T1是个sb题.那他为什么调了2小时才调出来呢?快和小编一起看看吧. Sb题:指除了sbwzx别人都能做出来的题 1.CE:震惊!sbwzx竟然连map都不会用, ...

  6. MIPI归纳---为什么阻抗为100欧姆

    根据LVDS(Low Voltage Differential Signaling)电平定义的. LVDS差分信号PN两线最大幅度是350mV,内部一个恒流源电流是3.5mA.于是终端匹配电阻是100 ...

  7. 洛谷 P5658 [CSP-S2019] 括号树

    链接: P5658 分析: 显然我们应该在dfs树的同时维护每个点的答案. 注意到第 \(u\) 个点的答案可以分成两部分,不包含 \(u\) 点时的答案,和加入 \(u\) 点后新增的答案,前者可以 ...

  8. 利用Microsoft Graph开发微软的Exchange Calendar会议、Team

    Microsoft Graph是什么? Microsoft Graph 是 Microsoft 365 中通往数据和智能的网关. 它提供统一的可编程模型,可用于访问 Microsoft 365.Win ...

  9. 用C++实现的数独解题程序 SudokuSolver 2.6 的新功能及相关分析

    SudokuSolver 2.6 的新功能及相关分析 SudokuSolver 2.6 的命令清单如下: H:\Read\num\Release>sudoku.exe Order please: ...

  10. distinct-subsequences leetcode C++

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...