上一页 1 ··· 14 15 16 17 18 19 20 21 22 ··· 26 下一页
摘要: 把'I'拆成容量为1一条边,一个入点一个出点,入点和相邻的'W'连一条容量为1的边,出点和相邻的'N'连一条容量为1,所有的'W'和源点连一条容量为1边,所有的'N'和汇点连一条容量为1的边,表示只能用一次。一发网络流就过了。写了4000B+的贪心,然并卵#includeusing namespac... 阅读全文
posted @ 2015-08-15 17:24 陈瑞宇 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 官方题解是离线询问,dfs树形转线性,然后二分找区间。还有一种比较好的做法是直接dfs,将当前访问这个结点u相关的询问之前的状态存起来,然后访问完以后利用异或开关性,得到这颗子树上的答案。代码是学习别人的http://blog.csdn.net/squee_spoon/article/details... 阅读全文
posted @ 2015-08-14 23:49 陈瑞宇 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 将源点和每个时间点连一条容量为k的边,表示同一时间最多剃k次胡子,将一个人和对应时间连一条容量为1的边,表示一个人在某个时间只能剃1次,再将每个人和汇点连一条容量为2的边表示一个人要剃两次。先是想贪心,结果不对,后来想到网络流,不会写好伤,下来写了好几发才过,写得依然丑。对最大流的理解加深了,图论有... 阅读全文
posted @ 2015-08-14 20:27 陈瑞宇 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 先扫描一遍得到每个位置向后连续的'.'的长度,包含自身,然后在扫一遍求出初始的合并次数。对于询问,只要对应位置判断一下是不是'.',以及周围的情况。#includeusing namespace std;const int maxn = 3e5+5;char s[maxn];int post[max... 阅读全文
posted @ 2015-08-14 03:09 陈瑞宇 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 贪心,如果m分成的两个区间长度不相等,那么选长的那个区间最接近m的位置,否则选m-1位置,特判一下n等于1的情况#includeusing namespace std;int main(){ int n,m; scanf("%d%d",&n,&m); if(n == 1){ ... 阅读全文
posted @ 2015-08-14 03:05 陈瑞宇 阅读(127) 评论(0) 推荐(0) 编辑
摘要: 坑,一开始以为,分成两半的时候去最大那个就行了,实际上这样是不对的,因为有可能出现小的一半的时间比大的要长,因为还和等待次数有关,且转移的时候需要用到次数更小的状态,所以状态定义为二维,dp[i][j]表示长度为i的区间,放小于等于j次的概率。要求确切的某次的概率,比如k,就只要用dp[i][k]-... 阅读全文
posted @ 2015-08-13 22:02 陈瑞宇 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 首先是一个贪心,一种灯泡要么全都换,要么全都不换。先排序,定义状态d[i]为前面i种灯泡的最小花费,状态转移就是从d[j],jusing namespace std;const int maxn = 1e3+3;int V[maxn], K[maxn], C[maxn], L[maxn];int d... 阅读全文
posted @ 2015-08-13 11:24 陈瑞宇 阅读(229) 评论(0) 推荐(0) 编辑
摘要: d[i]表示前面i个字符划分成的最小回文串个数,转移:当第i字符加进来和前面区间j构成回文串,那么d[i] = d[j]+1。要判断前面的字符j+1到i是不是回文串,可以用Manacher算法预处理出来。(其实O(n^2)判断回文串的也可以,时间复杂度不会变,只是为了学习ManacherManach... 阅读全文
posted @ 2015-08-13 11:21 陈瑞宇 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 每首只能唱一次,而且中间不能不唱歌,所以先把状态赋值为-1,以区别合法状态和非法状态,在唱歌曲目最多的条件下,离开时间应该尽量晚。状态定义f[i][j]考虑前i首歌唱歌时间为j的最大唱歌曲目#includeusing namespace std;const int maxn = 55;const i... 阅读全文
posted @ 2015-08-13 10:48 陈瑞宇 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 分阶段的DAG,注意字典序的处理和路径的保存。定义状态d[i][j]为从i,j 出发到最后一列的最小花费,转移的时候只有三种,向上,向下,或平移。#includeusing namespace std;const int maxm = 11;const int maxn = 101;int G[ma... 阅读全文
posted @ 2015-08-13 10:44 陈瑞宇 阅读(385) 评论(0) 推荐(0) 编辑
摘要: TSP是NP难,但是把问题简化,到最右点之前的巡游路线只能严格向右,到最右边的点以后,返回的时候严格向左,这个问题就可以在多项式时间内求出来了。定义状态d[i][j]表示一个人在i号点,令一个人在j号点,之前的点全走过到终点还要走的最小长度,为了区别d[i][j]和d[j][i]规定i>j,然后考虑... 阅读全文
posted @ 2015-08-12 20:06 陈瑞宇 阅读(249) 评论(0) 推荐(0) 编辑
摘要: 据说是DAG的dp,可用spfa来做,松弛操作改成变长。注意状态的表示。影响决策的只有顶部的尺寸,因为尺寸可能很大,所以用立方体的编号和高的编号来表示,然后向尺寸更小的转移就行了。#includeusing namespace std;#define MP make_pair#define fi f... 阅读全文
posted @ 2015-08-11 23:58 陈瑞宇 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 因为年历是400年一个循环节的,所以递推出一年的情况,然后递推处理出一个循环节的情况。对于询问,求一个类似前缀和的东西就好了。跑出来和比样例小一,把A和B加一以后交后AC...写得时候注意变量的定义。。。不然WA到哭。。。我是以6代表星期5的,1900年是第一年,所以B,A减去1900之前要加一。#... 阅读全文
posted @ 2015-08-11 00:23 陈瑞宇 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 对于一个数来说,它的除数是确定的,那么它的前驱也是确定的,而起点只能是1或2,所以只要类似筛法先预处理出每个数的除数个数,然后递推出每个数往前的延伸的链长,更新最大长度,记录对应数字。找到maxn以后,根据最后一个数找到前驱,并记录到ans数组中。代码来自队友#include#include#inc... 阅读全文
posted @ 2015-08-11 00:15 陈瑞宇 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 贪心,每次遇到一个满水的湖要下暴雨的时候,就往前找之前最后一次满水之后的第一个没有下雨的且没有被用掉天day1。因为如果不选这day1,那么之后的湖不一定能选上这一天。如果这一天后面还有没有下雨的天day2的话,选后面的,会使得day1到day2之间满水的湖选择减少。#include#define ... 阅读全文
posted @ 2015-08-10 23:57 陈瑞宇 阅读(729) 评论(0) 推荐(0) 编辑
上一页 1 ··· 14 15 16 17 18 19 20 21 22 ··· 26 下一页