上一页 1 ··· 14 15 16 17 18 19 20 21 22 ··· 29 下一页
摘要: 把长度转成右端点,按右端点排升序,f[i]=max(f[j]&&r[j] include include using namespace std; const int N=100005; int n,t[N],f[N],ans; struct qwe { int l,r; }a[N]; bool c 阅读全文
posted @ 2018-05-08 21:26 lokiii 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 洛谷数据好强啊,普通spfa开o2都过不了,要加双端队列优化 因为是双向边,所以dis(u,v)=dis(v,u),所以分别以pa1和pa2为起点spfa一遍,表示pb pa1 pa2和pb pa2 pa1,取个min即可 cpp include include include using name 阅读全文
posted @ 2018-05-08 21:11 lokiii 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 因为是双向边,所以相当于两条到1的最短路和,先跑spfa然后直接处理询问即可 阅读全文
posted @ 2018-05-08 20:52 lokiii 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 二分图最大点覆盖模型,因为对于一个点(x,y)显然只要选x或者y就好了,于是连边,跑最大匹配=最大点覆盖(不会证) cpp include include using namespace std; const int N=10005,inf=1e9; int n,m,h[N],cnt,con,lk[ 阅读全文
posted @ 2018-05-08 20:20 lokiii 阅读(160) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2018-05-08 19:09 lokiii 阅读(4) 评论(0) 推荐(0) 编辑
摘要: bzoj题面什么鬼啊…… 题目大意:有一个初始值均为0的数列,n次操作,每次将数列(ai,bi 1)这个区间中的数与ci取max,问n次后元素和 离散化,然后建立线段树,每次修改在区间上打max标记即可 cpp include include include include using namesp 阅读全文
posted @ 2018-05-07 16:23 lokiii 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 设f[u][0/1]为u这个点不选/选,转移的时候从儿子转移,f[u][1]=sum(f[son][0])+1,f[u][0]=sum(max(f[son][0],f[e[i].to][1])) cpp include include using namespace std; const int N 阅读全文
posted @ 2018-05-07 15:24 lokiii 阅读(99) 评论(0) 推荐(0) 编辑
摘要: 每个ai在最后sum中的值是本身值乘上组合数,按这个dfs一下即可 cpp include include using namespace std; int n,s,ans[15],c[20][20]; bool u[15],f=0; int dfs(int a,int b) { if(b==n) 阅读全文
posted @ 2018-05-07 14:58 lokiii 阅读(109) 评论(0) 推荐(0) 编辑
摘要: DAG上的dp 因为本身升序就是拓扑序,所以建出图来直接从1到ndp即可,设f[i][j]为到i花费了j cpp include include using namespace std; const int N=1005,inf=1e9+7; int n,m,b,h[N],cnt,f[N][N],a 阅读全文
posted @ 2018-05-07 14:45 lokiii 阅读(108) 评论(0) 推荐(0) 编辑
摘要: 预处理出g[i][j]表示原串第i个匹配第j个单词需要去掉几个字母(匹配不上为 1) 设f[i]为i及之后满足条件要去掉的最少字母 倒着dp! f[i]初始为f[i+1]+1,转移方程为f[i]=min(f[i],f[i+strlen(b[j]+1)+g[i][j]]+g[i][j]) 也不是很难理 阅读全文
posted @ 2018-05-06 22:02 lokiii 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 只要发现添加一个字符和删除一个字符是等价的,就是挺裸的区间dp了 因为在当前位置加上一个字符x就相当于在他的对称位置删掉字符x,所以只要考虑删除即可,删除费用是添加和删除取min 设f[i][j]为从i到j的价格,长度从小到大枚举更新就行了 f[i][j]=min(f[i][j 1]+cost[s[ 阅读全文
posted @ 2018-05-06 21:25 lokiii 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 好久没写2 SAT了啊,还以为是网络流 设点x为选,x'为不选,因为一头牛至少要满足一个条件,所以对于牛条件的两个点,选了一个不符合的点,就要选另一个符合的点,这样连两条边 然后枚举所有议案的选和不选点,从当前枚举的点出发,dfs一遍,把经过的点都打上标记,然后判断当前枚举的点是否合法(没有一个议案 阅读全文
posted @ 2018-05-06 20:28 lokiii 阅读(122) 评论(0) 推荐(0) 编辑
摘要: ……这可能是早年Pascal盛行的时候考排序的吧居然还是Glod…… 阅读全文
posted @ 2018-05-06 17:54 lokiii 阅读(82) 评论(0) 推荐(0) 编辑
摘要: k是1e5范围的,吗? 注意到n只有100,这意味着k去重之后之后n^2,也就是1e4! 然后就可以愉快的n^4枚举了,枚举每个格子,再枚举每个敌人,如果当前格子射不到敌人则退出,否则满足所有敌人则ans++ cpp include include include using namespace s 阅读全文
posted @ 2018-05-06 17:49 lokiii 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 模拟即可,注意包含可以是不连续的 方便起见读入的时候全转成小写 cpp include include using namespace std; const int N=1005; int n,m,s1,s2,ans[N]; struct qwe { int len; char s[N]; }c[N 阅读全文
posted @ 2018-05-06 17:32 lokiii 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 高精乘法板子 然而WA了两次也是没救了 cpp include include include using namespace std; const int N=105; int la,lb,lc,a[N],b[N],c[N],tot; char ch[N]; int main() { scanf( 阅读全文
posted @ 2018-05-06 17:13 lokiii 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 震惊!记忆化搜索忘记返回map值调了半小时! 边(u,v)的经过次数是:能到u的牛数\ v到n的方案数。正反两次连边,dfs两次即可 cpp include include include using namespace std; const int N=5005,M=50005; int n,m, 阅读全文
posted @ 2018-05-06 16:35 lokiii 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 长得挺唬人的贪心,按照右端点排序,用最小值线段树的询问判断当前牛是否能放进去,能的话更新线段树,ans++ 来自https://www.cnblogs.com/rausen/p/4529245.html非常严谨的证明 阅读全文
posted @ 2018-05-06 15:12 lokiii 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 4维枚举平方小于10000的数,相加等于n则ans++ cpp include include using namespace std; const int N=105; int n,a[N],ans; int main() { scanf("%d",&n); for(int i=1;i 阅读全文
posted @ 2018-05-06 14:21 lokiii 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 唔不知道怎么说……大概核心是把矩阵快速幂的乘法部分变成了Floyd一样的东西,非常之神 首先把点离散一下,最多有200个,然后建立邻接矩阵,a[u][v]为(u,v)之间的距离,没路就是inf 然后注意重载乘号的部分,注意到这样乘一次就相当于把本来存了经过k条路的最短路的邻接矩阵变成存了经过k+1条 阅读全文
posted @ 2018-05-06 12:04 lokiii 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 洛谷上能过的最大流bzoj上T了……但是贪心做法明明在洛谷上比最大流要慢啊……如果是最大流的话就是裸题了吧 说一下贪心,就按照防晒霜排序,然后对每一个防晒霜选一头可以使用的且r最小的牛 就,没了。 贪心 阅读全文
posted @ 2018-05-06 11:09 lokiii 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 和March的那道不一样,只是非常单纯的带着贪心的dfs 首先一个点被隔断,与它相邻的所有点也会被隔断,打上删除标记,从1dfs即可 cpp include include using namespace std; const int N=30005,M=200005; int n,m,q,h[N] 阅读全文
posted @ 2018-05-06 09:31 lokiii 阅读(104) 评论(0) 推荐(0) 编辑
摘要: 直接bfs即可,注意开double,还有驱动和终点的齿轮都在序列里,要把它们找出来= = cpp include include include include using namespace std; const int N=1505; int n,sx,sy,s,t,q[N],fr[N]; bo 阅读全文
posted @ 2018-05-05 21:47 lokiii 阅读(130) 评论(0) 推荐(0) 编辑
摘要: A\ K短路模板,详见https://blog.csdn.net/z_mendez/article/details/47057461 算法流程: 把有向图全建成反向边,跑一遍所有点到t的最短路记为dis; A\ ,估价函数:g(已走过价值)是已走过的路长度,h(到终点价值估计)是到目的地的最短路,建 阅读全文
posted @ 2018-05-05 21:23 lokiii 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 设f[i]为i时刻最小花费 把牛按l升序排列,每头牛能用f[l[i] 1]+c[i]更新(l[i],r[i])的区间min,所以用线段树维护f,用排完序的每头牛来更新,最后查询E点即可 cpp include include include using namespace std; const in 阅读全文
posted @ 2018-05-05 20:43 lokiii 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 参考:http://hzwer.com/3917.html 好神啊 注意到如果分成n段,那么答案为n,所以每一段最大值为\\( \sqrt{n} \\) 先把相邻并且值相等的弃掉 设f[i]为到i的最小答案,b[j]表示的是从b[j]+1开始到i共有j个不同的数字,p[a[i]]表示a[i]上次出现 阅读全文
posted @ 2018-05-05 18:03 lokiii 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 不是严格小于是小于等于啊!!!!!不是严格小于是小于等于啊!!!!!不是严格小于是小于等于啊!!!!! 是我看不懂人话还是翻译不说人话= = 把所有格子按值排个序,bfs扩展打标记即可 cpp include include include include using namespace std; 阅读全文
posted @ 2018-05-05 16:41 lokiii 阅读(118) 评论(0) 推荐(0) 编辑
摘要: 至今都不知道置换群是个什么东西……题解说什么就是什么.jpg 以下来自hzwer:http://hzwer.com/3905.html cpp include include include using namespace std; const int N=10005; int n,w[N],a[N 阅读全文
posted @ 2018-05-05 15:56 lokiii 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 对这个奇形怪状的图tarjan,然后重新连边把图变成DAG,然后记忆化搜索即可 cpp include include using namespace std; const int N=100005; int n,a[N],h[N],cnt,dfn[N],low[N],tot,s[N],top,bl 阅读全文
posted @ 2018-05-05 14:44 lokiii 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 从小到大排个序,然后能选就选 阅读全文
posted @ 2018-05-05 11:48 lokiii 阅读(135) 评论(0) 推荐(0) 编辑
上一页 1 ··· 14 15 16 17 18 19 20 21 22 ··· 29 下一页