04 2016 档案

摘要:#include #include #include #include #include #define M 100000 #define pa pair//优先比较第一个元素 using namespace std; int d[M],n,m,cnt,head[M],next[M],u[M],dis[M],num,s,t; bool f[M]; void add(int from,int t... 阅读全文
posted @ 2016-04-25 21:30 一入OI深似海 阅读(1927) 评论(0) 推荐(1)
摘要:/* 树形DP 根节点一定有人 然后 剩下的人没到每个孩子去 因为孩子数可能很多 不好枚举 所以转二叉树 分两部分 O(sum)就可以了 当然 转二叉树候必须顾及原来树的一些性质 如不能只选左孩子 转化好了之后就是DP了 写的记忆化 递归每个节点 枚举分给左右孩子的人数 */ #include #include #include #define maxn 1010 using namesp... 阅读全文
posted @ 2016-04-25 19:30 一入OI深似海 阅读(273) 评论(0) 推荐(0)
摘要:/* 一开始认为是个水题 直接模拟 没想到只得了50分 一看数据吓niao了 模拟妥妥的TLE 实在不好优化了0.0(最快O(m)) 然后借鉴别人的 DP+神奇的输出 DP:状态:f[i][j] 前i个字符出现j次1的数字个数 很容易想到 如果i是1 f[i][j]=f[i][j]+f[i-1][j-1] 如果i是0 f[i][j]=f[i][j]+f[i-1][j] 初始化 i==... 阅读全文
posted @ 2016-04-25 16:43 一入OI深似海 阅读(188) 评论(0) 推荐(0)
摘要:/* 算法描述:维护一个s[p]表示累加和 并且更新最大值ans 如果s[p]<0 则从p+1重新累加 证明:设某个区间的起点和终点分别为s t 分两种情况 1.t0 s1=s3-s2 所以有s3>s1 即 从1开始更优 2. t>=p:设s2表示1到p的累加和 s1表示1到s的累加和 s3表示s到p的累积和 根据前面的条件 s1>0 s2s4 即s[p]<0 时 重新;累加更优 */ ... 阅读全文
posted @ 2016-04-25 10:25 一入OI深似海 阅读(394) 评论(0) 推荐(0)
摘要:#include #include #include #include using namespace std; int n,ans[1010],a[1010],b[1010],sum,ti[1010]; struct node//三元组结构 { int o;//工作编号 int t;//时间 int ab;//在哪个机器 }job[1010]; int cmp(... 阅读全文
posted @ 2016-04-24 21:35 一入OI深似海 阅读(436) 评论(0) 推荐(0)
摘要:/* 第一眼以为就是个区间覆盖 然后敲完提交60分0.0 然而觉得自己的做法很对 以为数据错了 后来发现XXX他的牛棚是一圈(牛过得挺好的啊 还能赏湖...) 然后枚举断开的点 可惜n=750 p=10000 这组数据TLE了 1.3秒的样子 90分 后来看题解说可以并查集 觉得好有道理的样子 0.0 下面是两次的代码 */ #include #include #include #def... 阅读全文
posted @ 2016-04-23 21:35 一入OI深似海 阅读(262) 评论(0) 推荐(1)
摘要:/* 状态:f[i][j] 前i个村庄已经建了j个学校 转移:f[i][j]=min(f[i][j],f[ii][j-1]+s[ii+1][i]) 1 #include #include #include #include using namespace std; int n,m,a[505],h[505],s[505][505],f[505][505],ans; int Dfs(int nn... 阅读全文
posted @ 2016-04-23 16:29 一入OI深似海 阅读(253) 评论(0) 推荐(0)
摘要:/* 因为m为连续放的个数 所以状态要包括这个条件 定义状态:f[n][m]表示第n个坑连续放了m个 转移:分两种 1. 第x个坑 放 即m>=1 则 f[x][k]=f[x-1][k-1] 2. 第x个坑 不放 即m==0 则 f[x][k]=Σf[x-1][i] 最后sum一下 f[n][i] */ #include #include using namespace std; long ... 阅读全文
posted @ 2016-04-23 16:09 一入OI深似海 阅读(277) 评论(0) 推荐(0)
摘要:/* 先来个灌水法 然后建图跑最小生成树 注意观察题目中的规则 a[1][i]!=a[1][j]&&abs(a[2][i]-a[2][j]) #include #include #include using namespace std; int n,m,tot,g[1001][1001],a[3][1001],minn[10001],f[10001],sum,bb; char s[101][10... 阅读全文
posted @ 2016-04-23 11:14 一入OI深似海 阅读(379) 评论(0) 推荐(0)
摘要:/* 最少步数问题 妥妥的Bfs 很显然队列里存的是串(可能存个数也可以 就像8数码那样) 然后每次队首元素弄出来 能换的都换一遍 最后每次换完的新串入队前先判断到头了没 最后说一句 String大法好0.0 */ #include #include #include #include using namespace std; int ans,n=1,head,tail,t[2000050];... 阅读全文
posted @ 2016-04-23 11:00 一入OI深似海 阅读(253) 评论(0) 推荐(0)
摘要:/* 数据范围太小 暴力暴力 Dfs直接 终止条件嘛 就是4中目标棋局 挨着枚举一遍就好了 搜索的起点一定是空格 当然 空格周围有黑有白 黑先走或者白先走答案可能不一样 所以 维护一个b 表示这一步走那种颜色 b=1先走白棋 b=2先走黑棋 */ #include #include #include using namespace std; int xx[5]={0,0,0,1,-1}... 阅读全文
posted @ 2016-04-23 10:50 一入OI深似海 阅读(257) 评论(0) 推荐(0)
摘要:/* 首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了) 最少步数 想到Bfs 维护队列里的状态:要有个步数 还要有v :此时刻三个杯子有多少水 然后倒水:因为没有刻度 所以有两种情况:要么出水的为空 要么接水的满了 然后每次取队首时判断有没有某一个杯子装的水恰好为答案 注意判重时可以弄一个f [a][b] 表示第一个杯子有a升水 第二个杯子有b升水的状态存在了没... 阅读全文
posted @ 2016-04-23 10:42 一入OI深似海 阅读(583) 评论(1) 推荐(1)
摘要:/* 看到n的范围就觉得这个不可能是DP啥的 因为这个接龙的规则十分的简单 只要前缀相同即可 所以先按字典序排一遍 这样保证符合规则的一定挨着 然后弄一个stack 每次拿栈顶元素看看待入栈的元素是否符合条件 如果符合 就入栈 否则的话弹出栈顶元素 接着比较 这样在过程中不断更新最大的ans */ #include #include #include #include #include ... 阅读全文
posted @ 2016-04-23 09:51 一入OI深似海 阅读(273) 评论(0) 推荐(0)
摘要:/* 乍一看就是个最短路 SFPA 但是要保证路径上的所有点的出边所指向的点都直接或间接与终点连通。 这一点就蛋疼了0.0 开始想的是正着跑一边 每一个点的所有边都能符合条件 那这个点就符合条件0.0 可惜WA +RE 了 后来xyd大神说 可以先到这从终点跑一边 能到的标记 然后在枚举每个点的所有边指向的点 全被标记那么这个点就ok 最后SPFA 注意 正反建边 数组要大!!!!!!... 阅读全文
posted @ 2016-04-21 21:31 一入OI深似海 阅读(231) 评论(0) 推荐(0)
摘要:/* 双向DP 两条路 f[i][j] 表示第一条路末位置为i 第二条路末位置为j 的最优解 转移:对于下一个点 k=max(i,j)+1 可以更新 路1的末位置 也可以更新路2的末位置 f[i][k]=min(f[i][k],f[i][j]+dis[j][k])路2 f[k][j]=min(f[k][j],f[i][j]+dis[i][k])路1 最后 点n 可能属于路1 也可能属于路2... 阅读全文
posted @ 2016-04-20 15:32 一入OI深似海 阅读(202) 评论(0) 推荐(0)
摘要:/* 假设当前有a个A b个B c个C 用 f[a][b][c]来表示 那么如果这个串以A结尾 那就是 f[a-1][b][c]转移来的 所以构成 f[a][b][c]的串一定有一部分是 f[a-1][b][c] 同理 B C 所以: f[a][b][c] = f[a-1][b][c]+f[a][b-1][c]+f[a][b][c-1] 至于题目里那个什么前缀什么规则 既然f[1][1][... 阅读全文
posted @ 2016-04-20 15:31 一入OI深似海 阅读(236) 评论(0) 推荐(0)
摘要:不想吐槽题目..../* K bulabula 算法(好像用哪个T bulabula更简单 然而我并不会 - -) 丑陋的处理cnt: Printf时 cnt中 ans[i][0]==1 的删掉 然后更丑陋的处理强连通分量的出度 : 先把所包含的所有点f 成1 然后以每个点为起点跑一边 看看是不是出度指向本连通分量内的点 */ #include #include #include #incl... 阅读全文
posted @ 2016-04-19 15:29 一入OI深似海 阅读(198) 评论(0) 推荐(0)
摘要:/* 丧心病狂的最短路 关键是建图 根据题目中给的路 拆出节点来 建图 (i,j) -->(j-1)*n+i 然后根据障碍 把死路 湖覆盖的dis改变成极大值 然后Floyd 然后 然后就没有然后了.... */ #include #include #include #define maxn 99999999; using namespace std; int g[150][150],x[... 阅读全文
posted @ 2016-04-19 11:00 一入OI深似海 阅读(313) 评论(0) 推荐(0)
摘要:- - - - - - - -一个()打成[] 看了一晚上...../* 求强连通分量 kosaraju算法 边表存图 正反构造两个图 跑两边 分别记下入栈顺序 和每个强连通分量的具体信息 */ #include #include #include #include #define maxn 1010 #define maxx 10010 using namespace std;... 阅读全文
posted @ 2016-04-18 21:46 一入OI深似海 阅读(230) 评论(0) 推荐(0)
摘要:/* Problem 画家问题 假设一个ans数组存的是对每一个点的操作 0表示不图 1表示图 那么 对于原图 g 操作第三行时对第一行没有影响 同样往下类似的 所以 假设我们知道了ans的第一行就是最后答案的第一行 那么对于ans的第二行 就必须是的第一行全变成黄色 以此类推 最后检验第n行 是不是全部黄色就好了 所以只需要枚举第一行的所有情况 共2的n次方种情况 */ #include #... 阅读全文
posted @ 2016-04-18 19:51 一入OI深似海 阅读(574) 评论(0) 推荐(0)
摘要:/* 树形DP 而然我并不知道树在哪(....) f[x][0]表示x节点不参加舞会 以x为根的子树的最优解 f[x][1]表示x节点参加舞会 以x为根的子树的最优解 方程为:(so为x的儿子 so要枚举一下) f[x][0]+=max(f[so][0],f[so][1]); f[x][1]+=f[so][0]; 初始化 f[i][1]= 输入的happy值 最后比较 max(f[i][0]... 阅读全文
posted @ 2016-04-18 19:31 一入OI深似海 阅读(220) 评论(1) 推荐(0)
摘要:第一次参加,哎,就当做积累经验了。 今年的题要比去年的难,难,难一些。 看题吧,,,, A:跳绳游戏 A:跳绳游戏 描述小朋友玩跳绳比赛,要计算在一分钟内跳了多少下.假设每秒钟跳一下,如果中途失败了,则要花三秒钟后才能开始重跳.一般小朋友跳绳一分钟要跳坏好几次.现在给出小朋友每次跳坏时已经跳的总数, 阅读全文
posted @ 2016-04-17 19:22 一入OI深似海 阅读(1211) 评论(0) 推荐(1)
摘要:#include #include #include #define maxn 100010 #define maxm 200020 #define maxx 10010 using namespace std; int n,m,a[maxn],num; struct node { int lc,rc; int l,r; int sum; }tree[maxm]; vo... 阅读全文
posted @ 2016-04-04 20:49 一入OI深似海 阅读(328) 评论(4) 推荐(0)