摘要:
题意: 给n个点,问最多有多少个相似三角形(三个角对应相等)。解法: O(n^3)枚举点,形成三角形,然后记录三个角,最后按三个角度依次排个序,算一下最多有多少个连续相等的三元组就可以了。注意:在同一个坐标的两点只算一次,所以要判一下。代码:#include #include #include #i... 阅读全文
摘要:
题意: 给一个正方形,从左边界的中点走到右边界的中点,中间有一些墙,问最短的距离是多少。解法: 将起点,终点和所有墙的接触到空地的点存下来,然后两两之间如果没有线段(墙)阻隔,就建边,最后跑一个最短路SPFA,即可得出答案。代码:#include #include #include #include... 阅读全文
摘要:
题意: 正方形的房子,给一些墙,墙在区域内是封闭的,给你人的坐标,每穿过一道墙需要一把钥匙,问走出正方形需要多少把钥匙。解法: 因为墙是封闭的,所以绕路也不会减少通过的墙的个数,还不如不绕路走直线,所以枚举角度,得出直线,求出与正方形内的所有墙交点最少的值,最后加1(正方形边界)。代码:#inclu... 阅读全文
摘要:
题意: 给一条线段,和一个矩形,问线段是否与矩形相交或在矩形内。解法: 判断是否在矩形内,如果不在,判断与四条边是否相交即可。这题让我发现自己的线段相交函数有错误的地方,原来我写的线段相交函数就是单纯做了两次跨立实验,在下图这种情况是错误的:这样的话线段与右边界的两次跨立实验(叉积#include ... 阅读全文
摘要:
题意: 给一些圆,要求从第一个圆的圆心走到最后一个圆的圆心,中间路径必须在某个圆内,求最短路径的长度。解法: 易知要保持在圆内且路径最短,走两圆相交的点能使路径尽量短,所以我们找出所有的两圆相交的点,再加上起点和终点,放到一个容器中,去重后,判断每两点之间的线段是否都在圆内,如果是则建边,建完所有的... 阅读全文
摘要:
题意: 按顺序扔木棒,求出最上层的木棒是哪些。解法: 由于最上层的木棒不超过1000个,所以用一个队列存储最上层的木棒,每次扔出一个木棒后,都与队列中的木棒一一判断,看此木棒是否在某一最上层的木棒的上面,即判线段是否相交(两次跨立实验),如果相交,则将那个被压的木棒抛出队列,最后再加入扔的这个木棒到... 阅读全文
摘要:
题意: 给n条线段,问有没有一条直线,是每条线段到这条直线上的投影有一个公共点。解法: 有公共点说明有一条这条直线的垂线过所有线段,要找一条直线过所有线段,等价于从所有线段中任选两端点形成的直线存在可以穿过所有的线段的直线(可将A平移至一条线段端点,然后绕这点旋转,使A过另一条线段端点),然后O(n... 阅读全文
摘要:
题意: 二维平面,给两条线段,判断形成的直线是否重合,或是相交于一点,或是不相交。解法: 简单几何。重合: 叉积为0,且一条线段的一个端点到另一条直线的距离为0不相交: 不满足重合的情况下叉积为0相交于一点: 直线相交的模板代码:#include #include #include #include... 阅读全文
摘要:
题意:儿子身无分文出去玩,只带了一张他爸的信用卡,当他自己现金不足的时候就会用信用卡支付,然后儿子还会挣钱,挣到的钱都是现金,也就是说他如果有现金就会先花现金,但是有了现金他不会还信用卡的钱。他每花一次钱和挣一次钱都会给他爸发一条短信,告诉他挣/花的钱和时间,但是给出的短信顺序时间可能不是按顺序来的... 阅读全文
摘要:
题意:一个月饼店做月饼,总营业时间m小时,只能在整点做月饼,可以做无限个,不过在不同的时间做月饼的话每个月饼的花费是不一样的,假设即为cost[i],再给n个订单,即为在某个时间要多少个月饼,时间从2000年1月1日0时开始计算,必须在每个订单的时间之前完成这么多月饼,月饼还有保质期T小时以及保存费... 阅读全文
摘要:
题意: 给一个象棋局势,问黑棋是否死棋了,黑棋只有一个将,红棋可能有2~7个棋,分别可能是车,马,炮以及帅。解法: 开始写法是对每个棋子,都处理处他能吃的地方,赋为-1,然后判断将能不能走到非-1的点。但是WA了好久,也找不出反例,但就是觉得不行,因为可能有将吃子的情况,可能有hack点。但是比赛后... 阅读全文
摘要:
题意: n个数(1~n)取出r个数,取出的数相差要>=k, 然后分成m个可空组,问有多少种情况。 解法: 先看从n个数中取r个相差>=k的数的方法数,可以发现 dp[i][j] = dp[1][j-1] + dp[2][j-1] + ... + dp[i-k][j-1],(dp[i][1] = i) 阅读全文
摘要:
题意: 给一个字符串,表示一颗树,要求你把它整理出来,节点从1开始编号,还要输出树边。解法: 模拟即可。因为由括号,所以可以递归地求,用map存对应关系,np存ind->name的映射,每进入一层括号,使father = now, 遇到右括号')',则father = fa[father],用vec... 阅读全文
摘要:
官方题解:f(x)=|a∗x3+b∗x2+c∗x+d|, 求最大值。令g(x)=a∗x3+b∗x2+c∗x+d,f(x)的最大值即为g(x)的正最大值,或者是负最小值。a!=0时,g′(x)=3∗a∗x2+2∗b∗x+c 求出g′(x)的根(若存在,x1,x2,由导数的性质知零点处有极值。ans=m... 阅读全文
摘要:
题意: 有n个地鼠,m个CD碟,每个CD碟有一个影响范围,范围内的地鼠都会被吵到,每次有一个操作就是移动CD碟,然后求每次被影响的地鼠有多少只。解法: 线段树做。我们只关注地鼠有没有被吵到就可以了,之前我还去把所有可能移到的位置都存下来离散化一下,然后维护也维护错了。一堆bug,真是想多了。线段树维... 阅读全文
摘要:
题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积。解法: 很容易想到线段树扫描线求矩形面积并,但是如何维护每种颜色的长度着实让我伤透了脑筋。后来看了一位朋友的题解,才幡然醒悟。开始想到了用二进制表示颜色,... 阅读全文
摘要:
题意:给你n-1条边,然后没两个节点的距离按照递增的顺序,求出前k项的和。官方题解:把所有边(u,v) 以及(v,u)放入一个队列,队列每弹出一个元素(u,v),对于所有与u相邻的点w,如果w!=v,就把(w,u)入队。这样就能一个一个生成前K小的距离。 注意到每条边实际上会入队两次,只要把K翻倍且... 阅读全文
摘要:
题意: n个物体从高H处以相同角度抛下,有各自的初速度,下面[L1,R1]是敌方坦克的范围,[L2,R2]是友方坦克,问从某个角度抛出,在没有一个炮弹碰到友方坦克的情况下,最多的碰到敌方坦克的炮弹数。解法: 枚举角度,将pi/2分成1000份,然后枚举,通过方程 v*sin(theta)*t - 1... 阅读全文
摘要:
题意: 给出一些名字,名字间有父子关系,有三种操作:1.按祖先到后代,兄弟间按字典序由小到大排序,然后输出2.求某个节点的兄弟节点有多少个,包括自己(注意,根节点的兄弟节点是1)3.求节点a和b的公共祖先 (注意:如果公共祖先是a或b,必须要输出其父亲,与传统的LCA可以是自己不同)解法: 先把整棵... 阅读全文
摘要:
题意:n 组,每组有一些值,求 在不同的两组中每组选一个使值的和大于k的方法数。解法:n * Cnt[n] #include #include #include #include #include #define lll __int64using namespace std;#define N 10... 阅读全文
摘要:
题意:问给定的一张图中,相距最远的两个点的距离为多少。解法:跟求树的直径差不多,从1 开始bfs,得到一个最远的点,然后再从该点bfs一遍,得到的最长距离即为答案。代码:#include #include #include #include #include #include #include #i... 阅读全文
摘要:
题意: 给一串数字,给q个查询,每次查询长度为w的所有子串中不同的数字个数之和为多少。解法:先预处理出D[i]为: 每个值的左边和它相等的值的位置和它的位置的距离,如果左边没有与他相同的,设为n+8(看做无穷)。考虑已知w=k的答案,推w = k+1时,这时每个区间都将增加一个数,即后n-k个数会增... 阅读全文
摘要:
题意: 给一个点,一个圆,一个矩形, 求一条折线,从点出发,到圆,再到矩形的最短距离。解法: 因为答案要求输出两位小数即可,精确度要求不是很高,于是可以试着爆一发,暴力角度得到圆上的点,然后求个距离,求点到矩形的距离就是求点到四边的距离然后求个最小值,然后总的取个最小值即可。代码:#include ... 阅读全文
摘要:
题意: 给一个圆盘,圆心为(0,0),半径为Rm, 然后给一个圆形区域,圆心同此圆盘,半径为R(R>Rm),一枚硬币(圆形),圆心为(x,y),半径为r,一定在圆形区域外面,速度向量为(vx,vy),硬币向圆盘撞过去,碰到圆盘后会以相反方向相同速度回来(好像有点违背物理规律啊,但是题目是这样,没办法... 阅读全文
摘要:
unsigned int 0~4294967295 int -2147483648~2147483647 unsigned long 0~4294967295long -2147483648~2147483647long long: -... 阅读全文
摘要:
题意:问方程X^Z + Y^Z + XYZ = K (X1)有多少个正整数解 (K#include #include #include #include #include #define lll __int64using namespace std;#define N 200007lll k;int... 阅读全文
摘要:
题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列。解法:可以splay做,但是其实双端队列更简便。维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L,R]这段区间的值和[L,R]右边的值。然后维护一个revd标记表示[L,R]内的数是否被翻转了,翻转了的... 阅读全文
摘要:
题意: 给一些平面上的点,然后给一些查询(x,y),即以(x,y)为原点建立坐标系,一个人拿走第I,III象限的点,另一个人拿II,IV象限的,点不会在任何一个查询的坐标轴上,问每次两人的点数差为多少。解法:离线树状数组。点不在坐标轴上,即点不共线使这题简单了不少,可以离散化点,也可以不离散化,因为... 阅读全文
摘要:
题意: 有点迷。有一些点,Stan先选择某个点,经过这个点画一条竖线,Ollie选择一个经过这条直接的点画一条横线。Stan选这两条直线分成的左下和右上部分的点,Ollie选左上和右下部分的点。Stan画一条竖线之后,Ollie有很多种选择,在所有选择中,Stan能获得 “分数最小值的最大值” ,而... 阅读全文
摘要:
题意:牛的听力为v,两头牛i,j之间交流,需要max(v[i],v[j])*dist(i,j)的音量。求所有两两头牛交谈时音量总和∑(max(v[i],v[j])*abs(x[j]-x[i])) ,x[i]表示i的坐标解法:将牛按听力从小到大排序,这样就可以使每次算一头牛与别的牛的值时听力永远取自己... 阅读全文
摘要:
题意: 有n*m个格子(n,m #include #include #include #include #include #include #include using namespace std;#define N 100007int nowR[N],R[N],b[N];map mp,CntC,n... 阅读全文
摘要:
题意:给一个数字序列,第一类操作是将[l,r]内的数全赋为x ,第二类操作是将[l,r]中大于x的数赋为该数与x的gcd,若干操作后输出整个序列。解法: 本题线段树要维护的最重要的东西就是一个区间内所有数是否相等的标记。只维护这个东西都可以做出来。 我当时想歪了,想到维护Max[rt]表示该段的最大... 阅读全文
摘要:
题意: 给一个数的序列,询问一些区间,问区间内与区间其他所有的数都互质的数有多少个。解法: 直接搞有点难, 所谓正难则反,我们求区间内与其他随便某个数不互质的数有多少个,然后区间长度减去它就是答案了。那么怎么求区间内与区间其他某个数不互质的数的个数(记为cnt)呢? 我们用L[i],R[i]表示在整... 阅读全文
摘要:
题意: 将一些分散在各行的HTML代码整理成标签树的形式。解法: 模拟,具体见代码的讲解。 开始没考虑 '\t' 。。代码:#include #include #include #include #include #include #include using namespace std;strin... 阅读全文
摘要:
题意: 构造一个序列,满足m个形如:[l,r,c] 的条件。 [l,r,c]表示[l,r]中的元素按位与(&)的和为c。解法: 线段树维护,sum[rt]表示要满足到现在为止的条件时该子树的按位与和至少为多少。更新时,如果val的pos位为1,那么整个区间的按位与和pos位也应该为1,否则与出来就不... 阅读全文
摘要:
题意: 给出矩阵M,求M*M矩阵的r行c列的数,每个查询跟前一个查询的结果有关。解法: 观察该矩阵得知,令ans = M*M,则 ans[x][y] = (n-1-x行的每个值)*(n-1+y列的每个值)。直接对每个查询做n次累加(n*m=10^8的复杂度)竟然可以水过。官方题解给的是n^2的算法,... 阅读全文
摘要:
题意:给出汇编指令,解释出编码或者给出编码,解释出汇编指令。解法:简单模拟,按照给出的规则一步一步来就好了,主要是注意“SET”的情况,还有要输出的东西最好放到最后一起输出,中间如果一旦不对就可以及时跳出去。其他也没什么了,只要细心点,多测几组样例就好了。代码:#include #include #... 阅读全文
摘要:
题意: 给一个矩阵,每次查询一个子矩阵内的最大最小值,然后更新子矩阵中心点为(Max+Min)/2.解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的线段树,所以没跳出来。后来熟悉了一下,原来很多细节地方都没有考虑到。这里build,update,qu... 阅读全文
摘要:
题意:给定n个楼层,初始在a层,b层不可停留,每次选一个楼层x,当|x-now| b时, 那么dp[i][j] += dp[i-1][(j与b的中点(以下))~n]由于dp[i][j]的值只跟dp[i-1][]的一些值有关,所以用滚动数组会大大减小内存。用一个sum[i][j]维护前缀和即可。代码:... 阅读全文
摘要:
题意:给出一个字符串,有两种操作: 1.插入一个数字 2.交换两个字符 问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*)。解法:仔细观察,发现如果数字够的话根本不用插入,数字够的最低标准为'*'的个数+1,因为最优是 '12*3*..' 这种形式,所以先判断够不够,不够就补,然后从左往... 阅读全文