bzoj
Notokkkkkk
这个作者很懒,什么都没留下…
展开
-
bzoj1010
这道题的初始方程很容易推。 f[i]=min { f[j]+(cost(j+1,i)-L)^2} 其中,f[i]表示前i个东西放在容器里的最小代价 cost表示把j+1到i这些东西都放在一个容器的长度,可以用前缀和s来维护 但是时间上还不够,这时可以用一个斜率优化。 对于j1 对于i来说,如果j2这个点更优于j1,那么从今以后j1都没有用了,把它剔除出去。 这样对于我们的取最原创 2016-11-28 18:15:50 · 394 阅读 · 0 评论 -
bzoj1003
这道题数据范围很小。 用f[i]表示前i天的最小代价,那么f[i]=min{f[j]+cost(j+1,i)+k} cost表示从j+1天到第i天找一条 唯一的 最短路径 的长度 #include #include #include int n,m,k,e; int first[25]; struct mod{int x,y,z,next;}; mod q[1005]; b原创 2016-11-27 15:42:39 · 318 阅读 · 0 评论 -
bzoj3875
用f[x]表示彻底把x消灭的代价 用g[x]表示把x的衍生物(不包括x)彻底杀死的代价 那么一开始f[x]就等于膜法攻击的代价,g[x]为膜法把x的衍生物逐个杀死的代价总和 之后不断用一个队列(类似SPFA的思想)不断更新维护f[x]就可以了 #include #include #include #include #include using namespace std; long lon原创 2016-12-15 20:27:22 · 416 阅读 · 0 评论 -
bzoj1002
直接用上规律:f[n]=f[n-1]*3+2-f[n-2] 注意要用高精度,证明要用到基尔霍夫矩阵,而蒟蒻我不会。 #include #include #include int f[105][105]; int L[105]; int main() { int n; f[1][0]=1;L[1]=1; f[2][0]=5;L[2]=1; scanf("%d",&n); for (in原创 2016-12-15 20:32:12 · 423 阅读 · 0 评论 -
bzoj1013
这道题直接根据题目给出的式子列方程组,拆开就能用上高斯消元求出坐标。 然而我并不会n^2的高斯消元,所以自己打了个暴力n^3(数据小) #include #include #include double ans[15]; double a[15][15]; double s[15][15]; double t[15][15]; int main() { int n; scanf原创 2016-12-15 20:34:46 · 326 阅读 · 0 评论 -
bzoj1007
一开始看到这道题只能想到n^2暴力 不知道如何下手 实际上,我们要找到一种筛选的办法,这种筛选方法要在某种情况(顺序)下通用, 于是我们就可以按A值从大到小排序,用一个栈来维护后面加入的边 所以当一条边不合法,那它一定会被后来的边给弹出栈,具体可以通过求点的坐标来得知 #include #include #include #include using namespace std; str原创 2016-12-15 20:40:00 · 447 阅读 · 0 评论 -
bzoj1059
我们首先要推出几点: 一。无论怎么变换,我的1的数量不会变化 二。同一行或者同一列的1不可能经过变换然后在对角线上 基于第二点,我们得出每一列最多只能选一个,每一行最多也只能选一个。如果我们选了(i,j)那么,任何处于第i行的1或者第j列的1都不能再选 那么建图: 如果(i,j)上的是1,那么i->j连一条边,最后求一边二分图匹配,看一看是否是完美匹配。 因为当你选了i->j这条边,你原创 2016-12-15 20:42:13 · 426 阅读 · 0 评论 -
bzoj4720
这道是NOIP的题目。 先用SPFA找出所有最短路 用f[i][j]表示到第i个时间段时决定提出申请换教室,而加上这次申请总共用了j次申请的最小期望 而g则表示这次不申请。 直接按照期望的情况(申请成功与否去转移就好了) #include #include #include int n,m,v,E; int c[30005]; int d[30005]; double p[30005];原创 2016-12-15 20:47:49 · 333 阅读 · 0 评论 -
bzoj1497
要求最大获利 如果我能使损失的收益最小,那么就是最大获利了。 把每一个中转站看成一个点,用户群也看成一个点 源向中转站连边,容量为建中转站的费用 用户群向汇连边,容量为收益 如果用户群i需要j和k中转站,那么j,k向i连边,容量为无限大。 求出最小割 源到站j,k,用户i到汇这三条边是不会同时割掉的,因为不可能同时损失这两者的收益 为什么 因为他们中间有容量无限大的边,这边是不会原创 2016-12-15 20:53:51 · 384 阅读 · 0 评论 -
bzoj1015
这道题是要求一个动态的联通块数量。 刚开始的想法是强连通,找割点,然后发现打不下去。 所以想到了并查集。可是并查集如何删点? 我这里采用了逆时间建边,就是先把最后结果的边建好,再把删的点加回去,维护联通块数量。 #include #include #include bool v[500000];//是否被释放 int p[500000]; struct mod{int x,y,next;原创 2016-11-25 18:14:49 · 306 阅读 · 0 评论 -
bzoj1031
把原字符串直接接一个一样的在后面,这样就能解决环的问题了,直接后缀数组sa水过。 注意dsort的范围,不知为何,第一次设400然后RE。 看来是有特殊字符的!? #include #include #include int sa[200005]; int rank[200005]; char s[200005]; int dsort[200005],Y[200005],wr[200005]原创 2016-11-25 18:13:38 · 356 阅读 · 0 评论 -
bzoj1001
这道题,n*m=1000*1000=100 0000 网络流理论上过不了,可是因为数据太弱了,网络流dinic也可以过。 然而这个团队只有我用最短路QAQ。 原题就是一个最小割的典型模型,我们可以把原图的每一个面(三角形)当成一个点,再虚拟一个源和一个汇,拥有上边界或右边界(边界!)的连到源,下边界或左边界的连到汇。有公共边的三角形相连。这样,我最短路中的每一个路径都是一个割。构图很原创 2016-11-24 17:46:08 · 447 阅读 · 0 评论 -
bzoj3437
斜率优化 先把原方程拆开(拆到没有括号) 然后运用结合律 用前缀和维护 数据范围只有一百万! #include #include #include long long a[1000005]; long long b[1000005]; long long f[1000005]; int q[1000005]; long long s[1000005]; long long s原创 2016-11-30 20:46:00 · 545 阅读 · 0 评论 -
bzoj1911
斜率优化 这道题方程划开挺长的,一定要细心。 最后的斜率方程右边只能剩下含有 i 的项,不含 i 的项必须全部到左边 #include #include #include #include using namespace std; long long f[1010005]; long long o[1010005]; long long s[1010005]; int q[10100原创 2016-11-30 20:48:37 · 413 阅读 · 0 评论 -
bzoj1597
斜率优化 这道题先按从大到下排序(两个关键字) 然后如果一个木板长和宽均小于另一块木板,前者是可以直接舍弃的。 f[i]=min{f[j]+A[j+1]*B[i]} 这样吧 j+1 到 i 的部分包装起来了。 注意这道题为了维护斜率方程原来的样子,我的除数是相反数。 #include #include #include #include using namespace std; lon原创 2016-11-30 20:52:57 · 394 阅读 · 0 评论 -
bzoj1096
斜率优化 把原方程化开(看代码),用前缀和维护。 #include #include #include #include using namespace std; long long x[1000005],p[1000005],c[1000005]; long long sump[1000005],cheng[1000005]; long long f[1000005]; int q[1000原创 2016-11-30 20:54:43 · 287 阅读 · 0 评论 -
bzoj3156
斜率优化。 注意long long的使用,一不小心就没有用。 #include #include #include #define LL long long long long f[1000005]; long long a[1000005]; int q[1000005]; long long s[1000005]; double Y(int j) { return f[j原创 2016-11-30 20:43:28 · 437 阅读 · 0 评论 -
bzoj4518
斜率优化。 把m^2乘进式子里,优化式子。 注意初始化。 #include #include #include long long a[3005]; long long f[3005][3005]; long long s[3005]; long long q[3005]; int t; double Y(int j) { return (double)(f[t-1][j]+s[j原创 2016-12-04 14:24:25 · 456 阅读 · 0 评论 -
bzoj1026
这题是一道数位DP f[i][j]表示总共有i位数字,其中最高位数字为j的windy数个数 f[i][j]+=f[i-1][k] 其中,k为0~9中的数且|j-k|>=2 那么接下来就根据题目所给的A,B用前缀和相减就好了。 那对于A/B如何求前缀和呢,下面用A来说明 一。若一个数 的位数比A少,那么这个数一定比A小,直接加上方案数。 二。位数相同: 这个数的最高位 比 A的原创 2016-11-24 18:00:18 · 469 阅读 · 0 评论 -
bzoj1012
线段树水题 #include #include #include struct mod{int l,r,lc,rc,c;}; mod tr[400005]; int trlen=0; char s[5]; int mymax(int u1,int u2) { if (u1>u2)原创 2016-11-24 17:59:18 · 297 阅读 · 0 评论 -
bzoj1257
给出n,k n>=k都可以直接算的。 那么仅考虑n 因为k%i= k-(k/i)*i (取整) 所以,对于多个i值,k/i的结果是一样,所以把这些数放在一起算 k-(k/i1)*i1 k-(k/i2)*i2 k*(k/i3)*i3这些数构成一个等差数列(i逐渐递增) 所以我们可以一次性过掉多个i,而具体过掉多少i,用二分来查找 #include #include #in原创 2016-12-15 20:24:04 · 422 阅读 · 0 评论