摘要:
由于本人傻×,给bzoj上贡献了满满一屏的wa,真是对不住了......这个题其实挺水的,我就简单一说吧。可以看出选的原材料组成的凸包一定要包住需求的材料组成的凸包,那么我们枚举任意两个材料的点,如果他们的向量在所有材料组成的点的同侧的话,就给这两个点连一条1的边,否则连一条正无穷的边,那么用floyd跑一边最小环 就行了。注意特殊情况,如果只有1个点就能满足,那么这个点必须和所有需求的点重合,如果只有2个点就能满足,那么所有需求的点都应在这两个点的连线段上。metal 1 #include<iostream> 2 #include<cstdio> 3 #in 阅读全文
摘要:
最近惊讶地发现陈丹琪分治又名时间分治......写完cash以后,突然就觉得分治法解决一些需要高级数据结构维护的题目非常地爽,于是我就很2b地去做共点圆了。对于一个几乎没有做过计算几何的我,居然还傻傻地以为直接用斜率就可以搞了......并且一开始解不等式居然忘变号了,以为只用维护一个下半凸壳就行了......以上都是废话。这个题给过圆心的点,询问点是不是在所有圆内,运用时间分治,我们变成了用[l,mid]段的圆去计算[mid+1,r]段的点,以更新答案。因为这个题中添加操作之间对答案的贡献是互不影响的,这样我们通过分治创造了一种序,就是先给出圆,后计算点。于是这个问题就比价容易了,符合条件的 阅读全文
摘要:
经典的1D1D动态规划题目,标准做法是平衡树维护凸壳,但实际上还有更简洁的分治法。首先分析一下题目,对于任意一天,一定是贪心地买入所有货币或者卖出所有货币是最优的,因为有便宜我们就要尽量去占,有亏损就一点也不去碰。于是我们得到方程:f[i]=max{f[j]/(a[j]*rate[j]+b[j])*rate[j]*a[i]+f[j]/(a[j]*rate[j]+b[j])*b[i]}其中,x[j]=f[j]/(a[j]*rate[j]+b[j])*rate[j]表示第j天最多可以拥有的A货币的数量 y[j]=f[j]/(a[j]*rate[j]+b[j])表示第j天最多可以拥有的B货币的数.. 阅读全文
摘要:
这个题挺厉害的,一道线性规划和网络流结合的经典模型。那样例来解释吧:Min->X1+5*X2+6*X3+3*X4+4*X5X2+X3≥1X1+X2+X3+X4+X5≥4X3+X4+X5≥2X1,X2,X3,X4,X5≥0我们可以利用对偶原理把它转化成标准形式:Max->Y1+4*Y2+2*Y3Y2≤1Y1+Y2≤5Y1+Y2+Y3≤6Y2+Y3≤3Y2+Y3≤4增加松弛变量,把标准形式变成松弛形式Max->Z=Y1+4*Y2+2*Y3Y2+Y4=1Y1+Y2+Y5=5Y1+Y2+Y3+Y6=6Y2+Y3+Y7=3Y2+Y3+Y8=4到这里,其实我们已经可以利用单纯形来解决了。 阅读全文
摘要:
很容易想出O(NMT)的算法,枚举时间,然后枚举位置,转移就好了,大概是f[t][i][j]=max(f[t-1][i][j],f[t-1][i-dx[t]][j-dy[t]]+1) dx,dy表示某时刻的滑行方向。这样显然过不了,但是看到每一时间段滑行的方向是相同的,也就是只会在一条直线上转移,于是可以用单调队列维护这一条线上的最优值。当某位置是障碍的时候,这个点不能转移或者被转移,那么清空队列;当转移长度大于时间段长度的时候,当前值不合法,需要后移队首指针;当不动比队尾还要优的时候,队尾永远不可能成为最优值,那么前移队尾指针。这样枚举时间段,枚举位置就可以了,O(NMK)。adv1900 阅读全文
摘要:
决策单调优化的1D1D动规,比较经典的题,链接一下byvoid大神的博客http://www.byvoid.com/blog/noi-2009-poet博客里说的很清楚了。这个题主要是利用了四边形不等式证出了决策的单调性,这样我们可以二分不停地更新决策区间,这样效率nlogn可以ac。由于这个题比较奇葩,要求大于10^18的输出Too hard to arrange,所以过程中需要保存大于long long的数,所以我们用long double 保存中间量,这样最后再转成long long 就行了。poet 1 #include<iostream> 2 #include<cs 阅读全文
摘要:
水题。网上都说是什么链表的启发式合并,我也不太明白,反正我就写了个链表,然后也没什么启发式合并,就那么暴力合并就行了,速度也不慢。我们记录每个位置的下一个和它一样的颜色的位置next[i],对于每个i如果i+1!=next[i],那么i处会构成一个颜色短,一开始先这么统计出来,往后只可能增加,不可能减少。另外记录每个颜色的起始位置。合并的时候把两个颜色(x,y)都扫一遍,遇到相邻的x,y就链上,然后如果出现了i+1==next[i]就把答案数减1。注意最后保证x的信息全都复制到了y上才行。pudding 1 #include<iostream> 2 #include<cstd 阅读全文
摘要:
那一天,我闭目在经殿的香雾中,蓦然听见,你颂经中的真言;那一月,我摇动所有的经筒,不为超度,只为触摸你的指尖; 那一年,磕长头匍匐在山路,不为觐见,只为贴着你的温暖; 那一世,转山转水转佛塔,不为修来世,只为途中与你相见。 那一月,我轻转过所有经筒,不为超度,只为触摸你的指纹; 那一... 阅读全文
摘要:
后缀自动机+dp,后缀自动机是用来求出给定文章最长的在模板中出现的字串的长度,这个很好做吧。把文章在模板上匹配就行了,记录每一位的最大匹配长度就行了。然后我们二分答案,然后按照答案的限制求得最大匹配字符数。dp的方程很容易求得:f[i]=max{f[j]+i-j}。然后,假设二分的答案是limit,某位置的最大匹配长度是v[i],决策区间就是[i-v[i],i-limit],由于i-limit是逐步增加的,那么每一次只需要往队列里添加i-limit这个点,然后判断队首是否在决策区间里,即是否q[head]>=i-v[i]。那么此时单调队列里的元素都在决策区间里。这样就可以用队首元素的到最 阅读全文
摘要:
费用流题,构图非常巧妙。考虑每个点的交换限制的约束,一看就知道是点容量,但是这里不是一分为二,而是一分为三。首先我们把问题化简,变成对于原图上所有黑点,找到一个新图中的黑点,进行多次交换后到达。我们看到多次交换实际上是走了一条路径(这里不是最短路)。对于这条路径的起点和终点,仅进行了1次交换,而路径上的其他点都交换了2次。所以我们需要构造一种图来把这个交换次数的差异体现出来,于是:对于每个点一分为三,分为p0,p1,p2,对于每个点,如果它是原图中得黑点,连边<p1,p0,c/2,0>,<p0,p2,(c+1)/2>,<st,p0,1,0>;如果它是新图中得 阅读全文