ACM-计算几何/思维/构造
文章平均质量分 66
ACM-计算几何/思维/构造
豆沙睡不醒
永远不要停下脚步
展开
-
【训练题解】UPC Card Eater (思维)
Problem DescriptionSnuke has decided to play a game using cards. He has a deck consisting of N cards. On the i-th card from the top, an integer Ai is written.He will perform the operation described ...原创 2020-01-31 22:28:02 · 204 阅读 · 0 评论 -
ECNA2013 C . Playing Fair with Cryptography (模拟)
Encryption is the process of taking plaintext and producing the corresponding ciphertext. One method to do this is the Playfair cipher. This cipher was invented by (who else) Charles Wheatstone in the 1850’s (but got its name from one of its most ardent pr原创 2022-07-07 20:29:40 · 284 阅读 · 0 评论 -
2021辽宁省大学生程序设计竞赛(正式赛)G.字节类型(大数)
2021辽宁省大学生程序设计竞赛(正式赛)G.字节类型(大数)原创 2021-10-25 19:49:23 · 403 阅读 · 0 评论 -
数学一本通——【计算几何】Minimal Circle(最小圆覆盖模板)
DescriptionYou are to write a program to find a circle which covers a set of points and has the minimal area. There will be no more than 100 points in one problem.InputThe input contains several problems. The first line of each problem is a line contain转载 2021-03-07 20:12:16 · 250 阅读 · 2 评论 -
计算几何模板
二维凸包模板题const int maxn=1e5+100;const double eps=1e-8;int sgn(double x){///判断x是否等于0 if(fabs(x)<eps) return 0; if(x<0) return -1; else return 1;}struct point{ double x,y; point(){} point(double x,double y):x(x),y(y){}原创 2021-05-03 18:51:49 · 147 阅读 · 0 评论 -
洛谷P3829 [SHOI2012]信用卡凸包(点的旋转+凸包)
洛谷P3829 [SHOI2012]信用卡凸包(凸包)原题链接思路:模拟一下题意给出的图就会发现:答案等于圆心的长方形周长之和+++圆的周长。简略证明就是圆心角相加正好为360°°°扩展到一般情况:答案为圆心构成的凸包周长+++圆的周长。所以问题就转化成了两个子问题:1.如果根据给出的中心和角度求四个圆心的坐标2.如何求凸包对于问题2我们可以愉快的上凸包的模板了!对于问题1:设当前点为(x,y),将其绕原点逆时针旋转z°z°z°得到的坐标为:(x∗cos(z)−y∗sin(z),y原创 2021-05-04 09:31:18 · 222 阅读 · 0 评论 -
2021年度训练联盟热身训练赛第一场——Weird Flecks, But OK(最小圆覆盖)
原题链接题意:给你一些立方体零件的点的坐标,要求设计一个钻头使得这个钻头只能垂直一个平面进入立方体零件一次,并且覆盖所有的点。求钻头的直径。思路:开始的时候以为枚举每个个平面然后选择距离最远的点当做直径就可以,但是这样不能保证完全覆盖。正解就是最小圆覆盖,直接敲模板就好了。代码:#include<bits/stdc++.h>using namespace std;#define EPS 1e-8const int maxn = 5500;struct point{原创 2021-03-07 20:17:32 · 237 阅读 · 2 评论 -
2020ICPC昆明站——J.Mr. Main and Windmills(计算几何)
原题链接题意:车从(sx,sy)(sx,sy)(sx,sy)开往(ex,ey)(ex,ey)(ex,ey),在车的同一侧有nnn个风车,qqq次询问,每次询问第hhh个点对于其他点的位置变化的第kkk次的点。思路:题意有点抽象,模拟一下样例就很好懂了。第二个样例问的是3号点第二个变化的位置点。从sss向eee走,当车在[s,A][s,A][s,A]区间时,在车的视角看,1,2,41,2,41,2,4都在333的左边。当车在[A,B][A,B][A,B]区间时,444变成了在333的右边,而1原创 2021-04-05 21:48:14 · 689 阅读 · 3 评论 -
数学一本通——Two Circles and a Rectangle(临界条件)
E. Two Circles and a RectangleDescriptionGive you two circles and a rectangle, your task is to judge whether the two circles can be put into the rectangle with no part of circles outside the retangle.InputThere are multiple test cases. In every test ca原创 2021-03-03 22:53:48 · 226 阅读 · 1 评论 -
PTA团体程序设计天梯赛-练习集 L3-009 长城 (计算几何)
#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<ll,ll>PLL;typedef pair<int,int>PII;#define I_int ll#define modl 19260817*19890604-19491001inline ll read(){ ll x=0,f=原创 2021-04-14 21:35:42 · 291 阅读 · 0 评论 -
洛谷P3194 [HNOI2008]水平可见直线(计算几何+单调栈)
原题链接思路:答案是最上面的一些直线,借助于求凸包的思想,单调栈维护答案,即不被其他直线覆盖的点。1.排序:第一关键字斜率,第二关键字截距。斜率从小到大,截距从大到小。因为相同斜率的话,截距小的会被截距大的覆盖。2.单调栈维护:考虑何时弹出栈顶元素。假设栈内有的直线为line1,line2line1,line2line1,line2,新添加的直线为line3line3line3.看line2line2line2在哪种情况下被覆盖。当A在B的左边时,从上向下看,line2line2line2被覆盖原创 2021-04-13 14:54:39 · 162 阅读 · 0 评论 -
2021杭电多校第八场 HDU7063-Square Card(求两圆相交面积)
传送门思路:很细节的题,要好好读题!首先,正方形可以绕中心旋转,由于正方形落到圆的概率不是很好计算,看怎么才能转化一下。找一个边界值,比如下图中的,正方形再向下一点就会出界。所以只要正方形的中心在蓝色圆里就能够保证正方形落到绿色的大圆里。这样就把正方形抽象成一个点了。根据红色的直角三角形可以计算出蓝色圆的半径,对两个原始圆求交集就是分子的答案,原始圆的蓝色圆面积就是分母的答案;还有一个细节就是题目里只说了第一个圆足够大,没说奖励圆足够大,要特判一下正方形不能放到奖励圆的情况。代码:s原创 2021-08-18 19:43:38 · 168 阅读 · 0 评论 -
HDU7018.Banzhuan(计算几何+贪心)
思路:先考虑最大值,首先,都填满肯定是最大的,但是在填的过程中要怎么最大化代价呢。每次都将要填的物品放到第nnn层,这样由于题意可知他会掉落,但是代价依旧是最大的。最大代价如下:n∗∑x=1nx∗∑y=1ny2=n∗n∗(n+1)2∗n∗(n+1)∗(2∗n+1)6n*\sum_{x=1}^{n}{x}*\sum_{y=1}^{n}{y^{2}}=n*\frac{n*(n+1)}{2}*\frac{n*(n+1)*(2*n+1)}{6}n∗x=1∑nx∗y=1∑ny2=n∗2n∗(n+1)∗6n原创 2021-08-06 19:35:15 · 189 阅读 · 0 评论 -
LDUOJ——山(计算几何+二分+精度)
H. 山Description给一座山,如图所示现在要在山上的某个部位装一盏灯,使得这座山的任何一个部位都能够被看到。给出最小的 y 坐标,如图的+号处 就是 y 坐标最小的安装灯的地方。Input第一行一个数 N,表示这座山有 N 个点构成,接下来 N 行从左到右给出了这座山的构造情况,每行两个数 Xi,Yi, 表示一个折点,保证 Xi>Xi−1(1<i≤N)。Output仅输出一行,为最小的 y 坐标,当你的答案与标准答案相差 0.01 时,则被认为是正确的。Samples原创 2021-03-06 21:55:40 · 243 阅读 · 0 评论 -
数学一本通——K. 点与三角形关系(叉积求面积)
Description已知一个平面坐标系中三角形三个点A,B,C的坐标,判断另外一个点D是否在三角形内(点在三角形边上也认为在三角形内)Input输入共四行,每行两个数,前三行表示A,B,C的坐标,第四行为D的坐标。Output输出一个字符串,“in”表示点D在三角形ABC内,“out”表示点D在三角形ABC外。SamplesInput 复制1.0 2.07.0 1.07.0 5.05.0 3.0Outputin思路:运用三角形的面积关系来判断点与三角形的关系。假设点为P,三原创 2021-03-06 16:29:17 · 2979 阅读 · 3 评论 -
POJ1269 Intersecting Lines(两直线关系)
原题链接题意:给出四个点,表示两条直线。判断这两条直线的关系:平行,重合,相交(输出交点)代码:// Problem: Intersecting Lines// Contest: Virtual Judge - POJ// URL: https://vjudge.net/problem/POJ-1269// Memory Limit: 10 MB// Time Limit: 1000 ms// // Powered by CP Editor (https://cpeditor.org)原创 2021-08-24 20:27:29 · 159 阅读 · 0 评论 -
CF1315 C.Restoring Permutation(构造 二分 贪心)
原题链接题意:给出一个长度为nnn的序列aaa,构造一个长度为2n2n2n的序列bbb,使得ai=min(b2i,b2i−1)a_i=min(b_{2i},b_{2i-1})ai=min(b2i,b2i−1)思路:可以发现最小值的部分是没有重合的,将aia_iai直接赋给两者之一即可。比如假设b2i−1=aib_{2i-1}=a_ib2i−1=ai,那么怎么确定b2ib_{2i}b2i呢找出所有没有被用过的数vvv,对于每个数aia_iai,二分查找大于aia_iai的最小的数原创 2021-08-25 20:06:09 · 165 阅读 · 0 评论 -
AcWing 周赛12 3804. 构造字符串(贪心 构造)
原题链接思路:分类讨论,贪心考虑当k>nk>nk>n时,比较简单的一种情况,只需要将sss复制过来后在末尾补字典序最小的字母当k<=nk<=nk<=n时,倒着考虑。如果这一位能够被替换为大的,就替换为比当前位大的,前面的都保持原序列;反之,就在这位放最小的,继续向前找;代码:const int maxn=2e5+100;map<char,int>mp;int get_nex(int x){ for(int i=x+1;i<26;原创 2021-08-15 11:20:44 · 120 阅读 · 0 评论 -
CF1556D. Take a Guess(交互 性质)
原题链接题意:给出数组的长度nnn每次可以询问a and ba\ and\ ba and b和a or ba\ or\ ba or b。(a,ba,ba,b为数组元素下标)问数组中第kkk大。询问次数不超过2n2n2n次思路:可以先询问a1∣aia_1|a_ia1∣ai和a1&aia1\&a_ia1&ai。这样得到a1 xor aia_1\ xor\ a_ia1原创 2021-09-01 10:07:27 · 124 阅读 · 0 评论 -
CF1286B.Numbers on Tree(构造 dfs)
linkkk题意:给出nnn个节点的树,每个节点的属性cic_ici表示子树中权值小于该节点的个数。问能否确定树的每个节点的权值思路:比较特殊的构造就是让权值为[1,n][1,n][1,n],这样可以消除相同数的影响。没有相同数的话,一个节点的权值等于当前未被选择过的权值中第ci+1c_i+1ci+1大的数。由于nnn只有200020002000,所以在这部分可以暴力找。dfsdfsdfs处理就好了。如果说某个节点的子树大小<=<=<=属性值,那么是无解的。代码://原创 2021-11-07 11:35:00 · 184 阅读 · 0 评论 -
codeforces1509 D. Binary Literature (构造+指针)
codeforces1509 D. Binary Literature原题链接题意:给定三个长度为2∗n2*n2∗n字符串,要求构造一个长度小于等于3∗n3*n3∗n的字符串sss使得至少有两个字符串是sss的子序列。思路:本来的思路是枚举两个字符串a,ba,ba,b,bbb中的0/10/10/1一定在aaa里出现过,只需要在aaa后面拼接上bbb剩下的部分就行。思路会忽略掉一些正确的情况。由于给出的字符串只有0,10,10,1,所以一定有两个字符串有长度大于nnn的全0或全1的公共子序列,只需原创 2021-04-17 10:14:09 · 585 阅读 · 3 评论 -
Codeforces Round #755 D. Guess the Permutation(交互 二分)
linkk题意:交互题,ttt组样例。给出序列的长度nnn,将序列选择了三个位置i,j,ki,j,ki,j,k,翻转序列中的[i,j−1],[j,k][i,j-1],[j,k][i,j−1],[j,k]。每次可以询问一段区间里逆序对的个数,在最多404040次询问里求出i,j,ki,j,ki,j,k.思路:区间左端点固定时,移动右端点得到的逆序对个数是非递减的。而且在区间[1,i][1,i][1,i]的逆序对个数为000,后续区间一定不为000,这样就可以二分查找出iii的位置posipos_ipo原创 2021-11-15 18:19:22 · 687 阅读 · 2 评论 -
CF1343E. Weights Distributing(最短路 枚举 思维)
linkk题意:给出nnn点mmm边的图和长度为mmm的权值序列,要求分配mmm条边的权值使得a−>b−>ca->b->ca−>b−>c的最短路权值之和最短。思路:求出每个点分别到a,b,ca,b,ca,b,c的最少边数,即分别以a,b,ca,b,ca,b,c为起点跑最短路。由于权值为111,最短路的本质就是边数。由于是求权值最小化,先将权值从小到大排序并且求前缀和,记作数组valvalval。如果a−>ba->ba−>b和b−>cb-原创 2021-11-11 20:00:21 · 148 阅读 · 0 评论 -
AtCoder Beginner Contest 225 F.String Cards(dp)
linkk题意:给出nnn个字符串,选择kkk个字符串,求字典序最小的串。思路:dp[i][j]dp[i][j]dp[i][j]表示从[i,n][i,n][i,n]选择jjj个代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<ll,ll>PLL;typedef pair<int,int&原创 2021-11-06 10:29:14 · 270 阅读 · 0 评论 -
CF1367 D. Task On The Board(构造)
linkkkk题意:给出字符串sss,给出mmm个数bbb要求从sss选mmm个不重复的位置,使得对于每个i(1<=i<=m)i(1<=i<=m)i(1<=i<=m),满足如果si<sjs_i<s_jsi<sj,那么∑abs(i−j)=b[i]\sum abs(i-j)=b[i]∑abs(i−j)=b[i]∣s∣<=50|s|<=50∣s∣<=50思路:对于bi==0b_i==0bi==0的位置放最大的数。这样就可以原创 2021-11-05 19:54:35 · 119 阅读 · 0 评论 -
2018ICPC青岛站 D . Magic Multiplication(构造 模拟)
linkkk题意:思路:代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<ll,ll>PLL;typedef pair<int,int>PII;typedef pair<double,double>PDD;#define I_int llinline ll read(){l原创 2021-11-02 19:11:02 · 365 阅读 · 0 评论 -
2021年中国大学生程序设计竞赛女生专场C. 连锁商店(状压dp 思维 贪心)
linkkkk题意:给出nnn个景点,每个景点都属于一个公司,给出每个公司的价值。如果是第一次经过这个公司就会获得对应的价值,问从111出发到每个景点能够获得的最大价值。n<=36n<=36n<=36思路:可以看到nnn的范围不大,也就是说可以用二进制来表示有没有经过某个公司,比如100110011001就表示已经经过了1,41,41,4个公司,没有经过2,32,32,3公司。这样,到达每个节点时,就会有对应的数来表示之前经过公司的状态。记录每个点的前驱节点,也就是对于给出的原创 2021-11-01 18:07:05 · 938 阅读 · 2 评论 -
Codeforces Round #751 (Div. 2) D. Frog Traveler(bfs 优化)
linkk题意:长度为nnn米的井,青蛙在井底。对于井而言,每米都有两个属性,ai,bia_i,b_iai,bi。aia_iai表示在第iii米时,可以向上跳[0,ai][0,a_i][0,ai]区间里的任意米。bib_ibi表示跳到iii米要下滑bib_ibi米。问最少跳几次能够跳出井,输出每次跳后到达地方的位置坐标(下滑前)n<=3e5n<=3e5n<=3e5思路:从nnn开始进行bfsbfsbfs,每次将跳到并下滑后的点入队,维护到达这个点的最小步数。优化就原创 2021-10-25 17:24:10 · 721 阅读 · 2 评论 -
AtCoder Beginner Contest 223 D - Restricted Permutation(建图 思维 构造 拓扑排序)
linkkk题意:给出mmm组限制条件,要求构造一个长度为nnn的字典序最小的序列。每组a,ba,ba,b表示在序列里aaa在bbb前面。思路:建图:a−>ba->ba−>b有向边,跑一个拓扑排序,将队列换为优先队列,表示每次将最小的弹出,就能保证字典序最小了。代码:// Problem: D - Restricted Permutation// Contest: AtCoder - AtCoder Beginner Contest 223// URL: https://a原创 2021-10-18 21:04:36 · 224 阅读 · 0 评论 -
Codeforces Round #748 (Div. 3) F - Red-Black Number (记忆化搜索)
linkkk题意给出长度为n(n<=40)n(n<=40)n(n<=40)由数字构成的字符串和a,ba,ba,b,请将该字符串分为两部分A,BA,BA,B,使得AAA变为数字后可以整除aaa,BBB可以整除bbb,并且A,BA,BA,B至少有一位。最小化A,BA,BA,B的位数之差,输出方案。思路看到nnn的范围后想到了搜索,会有很多重复的状态所以做一个标记,如果已经遇到过这个状态就不再继续向下搜了。搜索的时候维护当前Amod aA\mod aAmoda的值mamama,Bmo原创 2021-10-14 21:07:34 · 181 阅读 · 0 评论 -
Codeforces Round #748 (Div. 3) D2. Half of Same(数学 枚举 思维)
linkkkk题意:给出n(n<=40)n(n<=40)n(n<=40)个数,问能否确定一个kkk使得在有限的次数里执行操作使得数组里至少有一半的数是相同的。每次操作指的是选出一些数让其减小kkk。求最大的kkk,如果kkk可以无限大输出−1-1−1.思路:枚举数组内两两元素差值,对这些差值求两两之间的gcdgcdgcd,枚举gcdgcdgcd,看看有没有n/2n/2n/2元素的差值是该gcdgcdgcd的倍数,如果是的话,说明kkk可以等于该gcdgcdgcd。求gcdgcdg原创 2021-10-14 19:48:00 · 419 阅读 · 0 评论 -
Codeforces Round #748 (Div. 3) E. Gardener and Tree(拓扑排序)
linkk题意:给一棵树nnn个节点,每次删掉所有的叶子,操作kkk次,求剩下的节点数思路:拓扑排序,每次将度数<=1<=1<=1的点放入队列,并且维护操作的次数。对于队列中的点,如果操作次数<=k<=k<=k的话,该点一定会被删去;对于相邻的点,如果度数<=1<=1<=1并且没有被操作过,放入队列。代码:#include<bits/stdc++.h>using namespace std;typedef long long原创 2021-10-14 09:08:40 · 295 阅读 · 3 评论 -
Educational Codeforces Round 115 (Rated for Div. 2) D. Training Session(组合数学 思维)
linkkkk题意:给出nnn个人,每个人有a,ba,ba,b两种属性,保证没有两个人的a,ba,ba,b属性都相同。问能够选出三个人满足以下条件之一的方案数:三个人的aaa属性各不相同三个人的bbb属性各不相同思路:逆向思维,合法的方案等于总方案数减去不合法的方案数。总方案数相当于Cn3C_n^3Cn3不合法的方案数如何计算呢。先处理出cntaicnta_icntai表示属性a=ia=ia=i出现的次数,同理,也处理出cntbicntb_icntbi假设有A,B,CA,B,原创 2021-10-12 16:28:54 · 232 阅读 · 5 评论 -
AtCoder Beginner Contest 222 E - Red and Blue Tree(dfs dp)
linkkkkk题意:给出nnn个点的树和长度为mmm的序列aaa。现需要给每条边染成red/bluered/bluered/blue色,要求按照aaa走的路径,经过的边数r−b=kr-b=kr−b=k,问方案数。思路:首先可以通过dfsdfsdfs将序列aaa的路径经过每条边的次数cic_ici统计出来。这样问题就变成了从c1,c2,……cn−1c_1,c_2,……c_{n-1}c1,c2,……cn−1中选择一些数和为rrr,剩余的数和为bbb,满足r−b=kr-b=kr−b=k假设s原创 2021-10-10 10:19:36 · 342 阅读 · 0 评论 -
AtCoder Beginner Contest 222 D - Between Two Arrays(前缀和优化dp)
linkkkkk题意:给出两个长度为nnn的序列a,ba,ba,b,构造一个序列ccc满足ai<=ci<=bia_i<=c_i<=b_iai<=ci<=bi并且ccc非单调递减。求方案数。n<=3000,0<=ai,bi<=3000n<=3000,0<=a_i,b_i<=3000n<=3000,0<=ai,bi<=3000思路:数据范围比较小,考虑dpdpdp记dp[i][j]dp[i][j]dp[原创 2021-10-10 09:23:53 · 422 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1044 Shopping in Mars (前缀和 二分)
PAT (Advanced Level) Practice 1044 Shopping in Mars (前缀和 二分)原创 2021-10-09 18:54:49 · 313 阅读 · 0 评论 -
NWERC2019 Canvas Line(贪心)
linkkk题意:给出nnn个画的左右端点和mmm个钉子的位置,要求每个画上有且只有两个钉子,问最少需要放几个钉子,并输出位置。不可以的话输出impossibleimpossibleimpossible思路:不可能的情况就是一个画含有的钉子数>=3>=3>=3对每个画上的钉子数进行统计,分类讨论:如果大于333的话,一定是impossibleimpossibleimpossible;如果等于222的话,跳过;剩下的情况就要放钉子了,贪心的放,是放在rrr端点上。这样可以跟后面的原创 2021-10-05 17:43:34 · 306 阅读 · 0 评论 -
Codeforces Round #746 (Div. 2) D - Hemose in ICPC ?(交互 二分 欧拉序)
linkkk题意:给出一个树,每条边都有权值。定义两个点之间的距离为两点路径上的边的权值的gcdgcdgcd。每次可以询问一个点集,答案返回该点集中任意两个点之间距离的最大值。求两点使得距离是最大的。思路:第一个性质就是由于距离是边的权值取gcdgcdgcd,所以单条边的距离是最大的,也就是说最后的答案的点是相邻的。首先我们可以询问所有的点,得到一个最大值ansansans,接下来只需要查找ansansans是由哪两个点连接形成的就好了。还能够询问111111次,而n=1000n=1000原创 2021-10-04 20:22:46 · 242 阅读 · 0 评论 -
CF898D. Alarm Clock(贪心 双指针)
linkkkk题意:长度为nnn的数组,要求在长度为mmm的区间里最多包含kkk个数,问最少删除几个数。思路:首先按照元素大小排序,对于一个长度为mmm的区间,如果包含的数大于kkk个,那么优先删除后面的数,双指针维护下就可以了代码:// Problem: D. Alarm Clock// Contest: Codeforces - Codeforces Round #451 (Div. 2)// URL: https://codeforces.com/problemset/problem/原创 2021-10-04 10:49:02 · 146 阅读 · 0 评论 -
Codeforces Round #746 (Div. 2) C - Bakry and Partitioning(dfs 异或技巧 思维)
linkkkCodeforces Round #746 (Div. 2) C - Bakry and Partitioning题意:给出一个带点权的树和kkk,删除[1,k−1][1,k-1][1,k−1]条边,问能否存在某种方案使得删边后的所有子树的异或值相等。思路:参考视频一个关于异或的技巧就是:如果当前答案可以是555个的话,也可以是333个;如果当前答案是444个的话,可以是222个。一般都是取小的值。那么这个题也是类似的技巧,最后尽量是变成333棵子树或222棵子树,也就是说要删原创 2021-10-04 09:20:38 · 207 阅读 · 1 评论