上一页 1 ··· 25 26 27 28 29 30 31 32 33 ··· 37 下一页
摘要: 由于是排列,因此b一定只出现了一次,找到出现的位置并向左右扩展考虑如何判定是否满足条件,当且仅当$[左边比b小的数ls]+[右边比b小的数rs]=[左边比b大的数lb]+[右边比b大的数rb]$,暴力枚举+线段树复杂度为$o(n^2logn)$变形上式,得到$ls-lb=rb-rs$,对两边分别处理 阅读全文
posted @ 2019-11-08 16:19 PYWBKTDA 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 一道有趣的建图题,新建一个初始存在水的点,那么造井相当于向其连边,费用就是造井的费用,之后求最小生成树即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int x,y,z; 5 bool operator < (co 阅读全文
posted @ 2019-11-08 16:06 PYWBKTDA 阅读(82) 评论(0) 推荐(0) 编辑
摘要: 首先有一个东西叫做括号序列,即每一个点入栈加左括号,出栈加右括号容易证明,括号序列中A到B的距离是A到B中消去所有成对出现后剩余括号的数量用线段树来维护,考虑某个区间中两点的距离最大值,分为两种情况:1.点对在左区间/右区间;2.跨过区间的中点前者很好处理,来分析一下后者:容易发现消去成对的括号后剩 阅读全文
posted @ 2019-11-08 15:57 PYWBKTDA 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 移动可以理解为空白格的移动,问题等价于双方在一张无向图(相邻不同色点连边,起点视为黑色)移动,不能经过重复的点,无法移动者为负由于这张图是二分图,因此有结论,先手必胜当且仅当起点一定在任意一组最大匹配中证明:必要性,即先手必胜=>一定在匹配中,其等价于不在匹配中=>后手必胜,考虑一组最大匹配,容易发 阅读全文
posted @ 2019-11-08 09:01 PYWBKTDA 阅读(153) 评论(0) 推荐(0) 编辑
摘要: bzoj1068的简化版本,用f[i][j]表示表示区间i到j的最少字符数量,分为两种情况:1.某个子串重叠,枚举这个子串(注意:二位数长度为2);2.枚举断点 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define mod 998244 阅读全文
posted @ 2019-11-07 13:35 PYWBKTDA 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 设f[i]表示深度不超过i的方案数,那么有f[0]=1,$f[i]=f[i-1]^{n}+1$,然后用高精度即可(注意深度恰好为d还要用f[d]-f[d-1]才是答案) 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 i 阅读全文
posted @ 2019-11-07 13:31 PYWBKTDA 阅读(99) 评论(0) 推荐(0) 编辑
摘要: 手动模拟一组样例,可以理解大致应该如何操作具体实现中,记录每一位当前应该+1还是-1,然后操作最低的位并将后面的+1和-1全部取反即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,b,a[105],flag[105]; 4 voi 阅读全文
posted @ 2019-11-07 12:13 PYWBKTDA 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 将每一个重置为0的点作为一段,那么它会导致后面为以x x为开头的斐波拿起数列的东西,那么设这一段是以x为开头,要快速转移到下一段,就可以解决这道题目为了转移,我们要处理出下面的东西:1.求出x关于模k的逆元,也就是找到这个0原来的值,那么x*上一个数就是下一段的开头;2.通过这个值反推出这一段的长度 阅读全文
posted @ 2019-11-07 10:22 PYWBKTDA 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 对于每一行,用一个2^12个01来表示,其中这一行就是其中所有为1的点所代表的行(i二进制中包含的行)的max的min,然后就可以支持取max和min了,查询只需要枚举答案即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 阅读全文
posted @ 2019-11-06 13:09 PYWBKTDA 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 记一条链两端的lca为该链的lca,f[i]表示所有lca在i子树内的链的最大价值和(为方便递推,假设存在i-i的链价值为0),有递推式$f[i]=max(\sum_{son}f[son]+val)$(其中son是链上所有点的儿子且不再链上的节点,val表示该链的价值),时间复杂度为$o(n^{2} 阅读全文
posted @ 2019-11-06 09:47 PYWBKTDA 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 先考虑如何求出任意两数的最大差值和最小差值,直接差分约束建图跑floyd求最短路和最长路即可然后枚举i和j,考虑dA+dB和di+dj的关系,分两种情况移项,转化成dA-di和dj-dB的关系或dA-dj和di-dB的关系(只要有一个关系确定即确定)即可考虑(由于不等式都是两个变量,因此一定无法形成 阅读全文
posted @ 2019-11-05 12:52 PYWBKTDA 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 用f[i][j]表示到第i轮,之前取过的状态为j时之后的期望收益,枚举第i轮出现的物品,并判断能否取来转移,最终再将f[i][j]/=n即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,x,a[105],b[105]; 4 d 阅读全文
posted @ 2019-11-05 12:04 PYWBKTDA 阅读(107) 评论(0) 推荐(0) 编辑
摘要: 容易发现从当前状态到目标最少要跳不同的位置数-1,然后以此为估价函数IDA*(444ms,即先枚举答案再A*)或A*(664ms)即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,x,y,ans,dx[8]={-2,-2,-1,- 阅读全文
posted @ 2019-11-05 09:27 PYWBKTDA 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 先二分答案,然后搜索暴力判断由于数据范围较大,需要剪枝:1.当前所有可能被用到的木板长度和(长度要不小于最小所需长度)>=所要拼成的所有木板的和;2.对于需求从大到小枚举木板(这样一开始枚举次数较少,后来的情况容易被剪枝掉) 1 #include<bits/stdc++.h> 2 using nam 阅读全文
posted @ 2019-11-05 08:10 PYWBKTDA 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 用f[i][j][k]表示第一行前i个数,第二行前j个数选k个子矩形的答案,考虑转移:1.在第一行/第二行选择一个矩形2.当i=j时,可以选择一个两行的矩形注意要特判m=1的情况 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,t 阅读全文
posted @ 2019-11-04 16:41 PYWBKTDA 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 考虑用状压dp枚举排列,即f[i][j]表示当前状态为i,余数为j的方案数,考虑在末尾新增一个字符来转移即可,注意最后答案要除以排列组合 1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,d,n,tot[15],f[2005][1005 阅读全文
posted @ 2019-11-04 16:16 PYWBKTDA 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 题目即要求$Ah+Bv<=C+Aminh+Bminv$,如果同时枚举minh和minv,那么即要求$minh\le h$,$minv\le v$且$s\le C+Aminh+Bminv$从小到大枚举minh,然后答案可以理解为所有s合法-v合法且s合法,对于两个在枚举minv的时候预处理即可 1 # 阅读全文
posted @ 2019-11-04 16:04 PYWBKTDA 阅读(110) 评论(0) 推荐(0) 编辑
摘要: 用f[i][j][0/1]表示区间[i,j],i之前有没有M的最少需要多少个字符,然后分两种情况:1.可以分为两个,转移到dp[l][mid][0]+1;2.枚举断点,但当前面有M时,后面的这个不能重复,因此只能写成r-k 1 #include<bits/stdc++.h> 2 using name 阅读全文
posted @ 2019-11-04 09:57 PYWBKTDA 阅读(116) 评论(0) 推荐(0) 编辑
摘要: 对于同一行或同一列的点,不论如何交换都在同一行或同一列,而最终这n个点行和列各不相同,因此即要找到n个点,使得行和列不同然后对于每一个1,将所在行和所在列连边,二分图能完全匹配那么就说明存在这种方案 1 #include<bits/stdc++.h> 2 using namespace std; 3 阅读全文
posted @ 2019-11-01 16:41 PYWBKTDA 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 先二分答案,容易发现一定有一个正方形覆盖在角上(即有两条边在最X的地方),否则4个最X的点一定无法覆盖,然后暴力确定即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int x,y; 5 bool operator 阅读全文
posted @ 2019-11-01 10:25 PYWBKTDA 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 用线段树维护区间中最大的一段连续的1,以左端点为左端点最大的一段连续的1,以右端点为右端点最大的一段连续的1,然后就可以支持区间修改和查询了 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 50005 4 #define L 阅读全文
posted @ 2019-11-01 10:09 PYWBKTDA 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 容易发现操作任意次并不会改变每一个点的概率(因为每一个点加d的概率相同,期望与原数成比例),然后直接输出即可(要用高精度) 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 20005 4 int n,m,k,x,s,a[N], 阅读全文
posted @ 2019-10-30 16:46 PYWBKTDA 阅读(242) 评论(0) 推荐(0) 编辑
摘要: 以i为开头的最长上升子序列,那么就是反过来以i为结尾的最长下降子序列,预处理出来后,不断向后找到下一个数即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 10005 4 int n,m,x,a[N],b[N],f[N]; 阅读全文
posted @ 2019-10-30 16:20 PYWBKTDA 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 用b[i]表示第i个人给第i+1个人(b[n]表示给1,可以为负)的糖果数量,显然有$ai+b_{i-1}-bi=\sum_{i=1}^{n}ai/n$很容易构造出某一组bi(例如确定b1=0),那么我们可以让所有bi加上某个值,然后最小化$\sum_{i=1}^{n}|bi|$当bi中正数个数多于 阅读全文
posted @ 2019-10-29 09:20 PYWBKTDA 阅读(90) 评论(0) 推荐(0) 编辑
摘要: 第一个问题可以用贪心+二分解决第二个问题用f[i][j]表示i次分割后分割到j且满足条件的方案数,$f[i][j]=\sum_{k<j且sum[j]-sum[k]<=ans}f[i-1][k]$优化时间:前缀和优化,二分要先预处理出来(也可以用优先队列)优化空间:发现f并没有什么用处,只需要记录前缀 阅读全文
posted @ 2019-10-29 08:47 PYWBKTDA 阅读(190) 评论(0) 推荐(0) 编辑
上一页 1 ··· 25 26 27 28 29 30 31 32 33 ··· 37 下一页