BZOJ3242 [Noi2013]快餐店

<div class="post_brief"><p> 好吧我的本意是想学习一下dp的。然后发现了这道纠结了一年半还多的题。</p>   首先把环找出来。然后环上会长一些树。先把树的答案求了,因为它很好求。   然后考虑环,那么答案应该是随便断一条边之后答案的最小值(而不是最大值)。于是乎记录一下每个点按某个方向到起点的距离,记为d[i]。算一下每个点的树的深度,记为l[i]。于是每次要最大化l[i]+l[j]+|d[i]-d[j]|。反正是最大化所以顺序是没有关系的,但是不能自交。这是个比较容易错的地方。于是就去写个线段树来维护吧。只查询不修改让我总有能线性搞的想法,虽然没想清楚具体怎么实现。   #include <cstdio> #include <cstring> #include <algorithm> #include <set> using namespace std; struct edge { int t, v; edge *next; }; typedef long long dint; #ifdef WIN32 #define lld “%I64d” #else #define lld “%lld” #endif #define _l (long long int) const int maxn = 100009; edge elst[maxn << 1], *ep(elst), *head[maxn]; int n, fa[maxn], df[maxn], ol[maxn], d[maxn]; int tlp, lp[maxn << 1]; dint lv[maxn << 1], le[maxn << 1], md[maxn], ans;...

March 3, 2015 · 4 min · laekov

20150304

<div class="post_brief"><p> 又被虐了。</p>   第一题感受了一下感觉线段树会被卡成平方?然后果断了一个分块+smt维护凸壳。然后调了很久。舍点的地方一直有点问题。于是还写了个js来画图。然后最后还是怎么就错了两个点。完了之后发现线段树是可以保证时间复杂度的。naive了我。   第二题当时觉得不太可做也没有认真想。其实就是根据a[1]+a[2]的值的不同取值去推前三个数,这个我都想到了。然后就没去想a[0]+a[3]一定是剩下的最小的。然后就又naive了。想通后秒过。   第三题想对了。淘汰的顺序是无关的。只要有一种行就行,否则就不行。然后中间cnt写错了居然还有91分,好神奇。然后100个点把我的页面撑得也是难看啊。   然后又花了一个下午去思考。还好晚上可以再干点别的了。   所以我还是太年轻了。

March 3, 2015 · 1 min · laekov

BZOJ1079 [SCOI2008]着色方案

<div class="post_brief"><p> 看上去比较不可做的DP。好像别人写的记搜跑得飞快。</p>   我看我是写最小表示写上瘾了。   压一下状态,有点像今天第二题。算每种值的有多少。然后直接跑。   感觉废状态比较多啊,跑得好慢。另外用memset清空高维数组会比较快。   #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int mod = 1e9 + 7; const int maxn = 17; const int maxst = 16009; #define mbit(a,b) ((a)<<((b)<<2)) #define gbit(a,b) (((a)>>((b)<<2))&0xf) #define _l (long long int) int m, c[maxn], n, mt, tots, slst[maxst]; int f[2][7][maxst]; void dfsState(int t, int l, int v) { if (l == mt + 1) { slst[tots ++] = v | t; } else { for (int i = 0; i <= t; ++ i) dfsState(t - i, l + 1, v | mbit(i, l)); } }...

March 2, 2015 · 2 min · laekov

20150303

<div class="post_brief"><p> 被痛虐。</p>   zhx的出题风格越来越水了。   第一题最关键的结论是两个不能与当前块同字母的块也一定不能同字母。没推出来于是暴力了。然后再见。orz mhy。   第二题矩阵快速幂。因为昨天才写了插头所以优化还是比较在行。然后就被卡常数了。然后才知道矩阵乘还有这么神奇的优化。应该是废转移比较多。加上之后飞快虐std。   第三题又是想对了方向没有想到底。平衡树上的数据结构题还是比较有意思的碰到可以多做做。   然后一下午加大半个晚上就花在第三题和它的变形上了。   然后死得有点惨。   是我太年轻了啊。

March 2, 2015 · 1 min · laekov

BZOJ2770 YY的Treap

<div class="post_brief"><p> 今天考试题的弱化版。只用求LCA是谁,不用求它的深度。所以直接用线段树找下区间最值就搞定了。然后long的范围有负数坑了一发。</p>   好像在不平衡的平衡树上的题也比较热啊。而且我还做得比较少。是要补一补。   #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef pair <int, int> vpr; typedef pair <bool, vpr> dpr; struct seg { int l, r; dpr d; seg *ls, *rs; }; struct query { int t, a, b; }; const int maxn = 400009; int n, m, vl[maxn], tv; vpr a[maxn]; query q[maxn]; seg slst[maxn * 3], *sp(slst), *rt; inline int gpos(int x) { return lower_bound(vl, vl + tv, x) - vl; }...

March 2, 2015 · 2 min · laekov

20150302

<div class="post_brief"><p> 算是新学期开始的第一天吧。</p>   上午写了道水题,然后开始纠结插头。一上午都没有写出一道插头来。   下午有cf。状态还是和昨天一样比较差。写挫了好多次。各种WA一时爽还导致罚时很多。   第一题逗你玩。就看最多的字母有几种。然后乘一下都不用快速幂,虽然我顺手就写了一个。已经不会用非快速幂了么。   第二题用map来存位置,然后用两个堆搞一下就完了。可以证明状态变化量是线性的所以不会出事。   第三题逗你玩。每个位置在第j位的贡献可以用组合数算出来。然后用前缀和就行。然后各种细节导致WA傻了。   后面两道神题不可做。   ORZ xyz大爷。然后看到jcvb又在我上面很近的地方。   晚上写了道水题继续纠结插头,一直纠结到回家终于在11:05:56的时候过了。开心中。   看来还是就怕写长代码啊。怎么能这样呢。   看来我还是太年轻了。

March 1, 2015 · 1 min · laekov

BZOJ1187 [HNOI2007]神奇游乐园

<div class="post_brief"><p> 我的第二道插头DP。差不多纠结了一天。</p>   这道题网上的题解都讲的好简略啊。最后还得自己yy。没有用括号序列法让我觉得自己比较厉害。   考虑轮廓线上的m个格子,有3种情况:没有插头,有且只能往一边走,有且要往两边走。对于第二种,要用最多3个不同的值来记录连通性。还要有两个不同的值来表示第一种情况和第三种情况。我比较懒,所以直接用一个八进制数去表示,然后每次二分找编号。   考虑转移,分一堆情况进行讨论。默认从左上朝右下走。   首先是要走当前格子的情况。   如果左边和上面都有插头,那么看它们是否连通。如果不连通则把它们连通,如果已经连通,看是否还有其它插头。没有就更新答案,否则忽略。   如果只有左边有插头,再分类。如果它是第二种,那么这个格子可以新建一个第三种插头,或者把左边格子的插头接过来。如果它是第三种那么它必需把左边格子接过来。   如果只有上面有插头,那么必需把上面的插头接上来。   如果左边和上面都没有插头,那么可以新建一个第三种插头。   然后如果不走这个格子的话,要求上面没有插头,且左边不是第三种插头。   按mhy的话说,插头dp就是写起来很麻烦。的确。不过写出来也还是挺高兴的。   然后代码丑到不能看了。   #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 109; const int maxm = 9; const int maxst = 50009; const int inf = 0x3f3f3f3f; #define pow8(x) (1<<(x)<<(x)<<(x)) #define mbit(x,y) ((x)<<(y)<<(y)<<(y)) #define gbit(x,y) (((x)>>(y)>>(y)>>(y))&7) int f[2][maxst], n, m, a[maxn][maxm], ans; int slst[maxst], tots;...

March 1, 2015 · 4 min · laekov

BZOJ3438 小M的作物

<div class="post_brief"><p> 我以为是最大权闭合子图来着。然后好像就直接最小割就行了吧。突然觉得我的网络流好弱。</p>   建源汇,分别连每个作物。对于每个组合建两个点分别边源汇,然后中间像源汇一样连它的成员。如果全在一边,那么会有一条边不用割。这也是一个集合都选对答案有贡献的建图方式。   然后就完了。建图和dinic都写得有些丑,所以调了半天。   #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct edge { int t, c; edge *next, *rv; }; const int maxn = 3009; const int inf = 0x3f3f3f3f; int n, m, c, d[maxn], t, st, te; edge *head[maxn]; inline edge* newEdge(int u, int v, int c) { edge* e(new edge); e-> t = v; e-> c = c; e-> next = head[u]; return head[u] = e; } inline void addEdge(int u, int v, int c) { edge *a(newEdge(u, v, c)), *b(newEdge(v, u, 0)); a-> rv = b; b-> rv = a; }...

March 1, 2015 · 2 min · laekov

BZOJ3888 [Usaco2015 Jan]Stampede

<div class="post_brief"><p> usaco的银组都开始考这种题了么。其实还是挺水的,不过题号比较好。</p>   就按y排序,挨个把时间轴上的东西扔掉就完了。写离散可能还没有直接写smt快呢。   然后线段有一边要减1有点坑。   #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; typedef long long dint; #define _l (long long int) struct cow { int y; int ta, tb; }; struct node { int l, r, w; node ls, rs; }; typedef pair <node, node > npr; const int maxn = 50009; inline bool operator <(const cow& a, const cow& b) { return a....

March 1, 2015 · 2 min · laekov

20150301 hihoc9

<div class="post_brief"><p> 连续两天都是一天两场。</p>   上午考试比较naive。   第一题反正也不会,就随便写了个乱枚举的东西,还骗到80分。正解比较神奇,不过今天是没有时间写了。   第二题想到了正确的解法,但是没有优化好,加上高精写挂了,于是只有85分。   第三题数据结构那一部分想的是对的,但是前面对期望不熟没有想清楚,于是直接想简单了。也就是把我的链剖再改得更麻烦一些。   所以说在学长们出的比较难的题面前我还是很无力的。   下午讨论,改第二题。状态不好啊,改东西改了好久。   晚上hihoc9去拿github玩偶。   第一题小学生题么。然后排序的时候把m写成n于是挂了一次。所以虽然一血但是分也不高。   第二题有点像中国象棋棋盘上放炮的那个题。唯一的区别是这题两个炮可以放在一起。用dp,f[i][j][k]表示做了i列,有j行和为2,有k行和为1的方案数。对于每一个高度可以O(n3)预处理出答案。中间有一个转移写错了调了好久。幸好样例比较良心。于是总时间复杂度是四方的。n=100感觉很悬。本机不开O2的话会TLE一点。想到mac比较慢于是交了然后过了。   第三题神题。   第四题感觉可做,于是交了16次最后没有过。首先要判合法。最初没有判。然后建出树之后归并,用组合数。然后求阶乘的逆元的时候千万不要再像今天这样naive去线性筛了。我觉得我的思路是对的啊。不开心。(upd:看了题解之后觉得我的想法好像也不是太对)   于是今天被一堆人虐了。-16真心不好看。   我还是太年轻了啊。   明天下午有cf,比较开心。

February 28, 2015 · 1 min · laekov