比赛的时候看完就get到是dp,然后发现要开1000*1000*1000的数组,然后就跪那里起不来了。。。赛后看题解学会了一种好机智的姿势啊,将第一维降为√1000,对于D小于√m的用dp做,D大于√m的暴力,这样两种做法都是n^2.5,太机智了。psum是前缀和,xpsum[k][i][j]是D为... Read More
_(:3 ⌒゙)_ 调我半天,还是记录下吧。用轻重链可解决此题。用轻重链的方式给点重新编号后,建两棵线段树,一棵(sumTree)用于记录路径修改,另外一棵(markTree)用于记录邻边修改的点。然后维护下两棵树即可。注意,markTree修改时,要在sumTree上修改第一个点和最后一个点对应的... Read More
我决定记录下这么恶心的代码。比赛的时候头晕脑胀,写得好搓,错的地方好多好多,回来调了好久。。。。做法大概就是C(20,6)选出卡牌后,再k!枚举排列,再k*k得出该排列能得出什么数字。当然,光这样做绝对会T,里面加了各种剪枝后就1650ms险过了。。最主要的剪枝是选出k张牌后,看牌能不能组成L~an... Read More
(¦3[____]← 扫描线问题,抛物线方程为 y=a*x*x 形式,对每个点求出抛物线中轴的范围theta-delta~theta+delta,theta = atan2(y,x),delta则用方程组可解x*x+y*y=z*z+(a*z*z)^2,tan(theta)=z/(a*z*z),故th... Read More
一道找循环节的题,RE了很多发。要用到一个转换式子:a^b%c=[(a%c)^(b%phi(c)+phi(c))]%c#include#include#include#include#include#define ull unsigned long longusing namespace std;i... Read More
_(:3」∠)_四边形优化dp[i][j]:第i个点和第j个点合并的最小花费cost(i,j,k):第i和第j个点通过第k个点合并所需要的花费容易写出:dp[i][j]=min{dp[i][k]+dp[k+1][j]+cost(i,j,k)}易证cost函数为凸然后四边形优化之#include#include#include#include#include#include#include#include#include#define BUG printf("hehe\n")#define INF 0x3f3f3f3f#define ll long longusing nam Read More
_(:3」∠)_dp[i][j]:前i个分j组的最小值cost[i][j]:i到j为一组的值sum[i]:前i个的值的总和dp[i][j]=min{dp[k][j-1]+cost[k+1][i]}cost[k+1][i]=cost[1][i]-cost[1][k]-sum[k]*(sum[i]-sum[k])=cost[i]-cost[k]+sum[k]*sum[k]-sum[k]*sum[i]令y=dp[k][j-1]-cost[k]+sum[k]*sum[k]则dp[i][j]=min{y+cost[i]-sum[k]*sum[i]}sum[i]为斜率 1 #include 2 #incl Read More
_(:3」∠)_就是很裸的一道2-SAT问题,比赛的时候忘记加同一对里的边,也没注意到最后的进位问题,所以搓了。计算所有点之间的距离,排序后二分建图,二分的判断条件就是2-SAT。#include#include#include#include#include#includeusing namespace std;const int N=410;struct Point{ int x,y,z;}point[N];struct Dis{ int dis,x,y;}d[N*N];int n,dlen;vector G[N<<1];bool mark[N<<1];int s[ Read More
dp。dp[i][j][k] :i表示前i个工件,j表示在A工作台上的耗时-B工作台上的耗时,k表示在A工作台上的耗时-C工作台上的耗时。dp[i][j+a[i]][k+a[i]]=min(dp[i-1][j][k]+a[i],dp[i][j+a[i]][k+a[i]]);dp[i][j-b[i]][k]=min(dp[i-1][j][k]+b[i],dp[i][j-b[i]][k]);dp[i][j][k-c[i]]=min(dp[i-1][j][k]+c[i],dp[i][j][k-c[i]]);#include#include#include#include#includeusing n Read More
_(:3」∠)_对于任意的V,要使表面积最小,H,R,h,r会符合一定的比例关系。然后算得 表面积=C*(V的2/3次方) C为一常数。故设V=1的时候算出C值。对于R,V1(上面圆柱的体积),r而言,这个奇怪的组合体的表面积的函数都为单峰函数,然后三分R,再在里面三分V1,再在里面三分r,算出H和h的值,更新最小表面积。//通过这个计算常数C#include#include#include#include#include#include#define eps 1e-9using namespace std;const double pi=acos(-1);double v=1.0;doubl Read More