- 博客(157)
- 收藏
- 关注
转载 我又双叒叕搬家了
https://blog.csdn.net/Patrickpwq 转载于:https://www.cnblogs.com/Patrickpwq/articles/10322325.html
2019-01-25 23:42:00
255
转载 【USACO15JAN】草鉴定Grass Cownoisseur(缩点+分层图?)
蒟蒻好紧张啊 蒟蒻好紧张啊 蒟蒻好紧张啊 蒟蒻好紧张啊 一开始方向好像走错了 乱推了个拓扑的式子 然后FST了 然后还不肯放弃 挣扎了20分钟 又受到了刚上来都打完球了的ldx的diss "我靠,这么傻逼的题你还没A吗" 好吧的确是傻逼题 先缩点 设s是1所在的scc的编号 考虑逆行的使用姿势 对于一个可以从s出发到达的点 逆行到一个可以到达s的点 然后这个东西你可以跑正反两发spfa ...
2018-11-07 22:04:00
268
转载 【洛谷 P3398】仓鼠找sugar(lca)
听了教练的考前须知 蒟蒻紧张的要死 只想做信心题 同时满足:c或者d在x子树里 a或者b在y子树里 其中x=lca(a,b),y=lca(c,d) #include<bits/stdc++.h> #define N 100005 using namespace std; template<class T> inline void read(T &x) { ...
2018-11-06 14:45:00
269
转载 【ZJOJ2010】数字计数(数字计数)
设f[i][j][p]表示长度为i 最高位为j p出现的个数 显然 f[i][j][p]=sigma{f[i-1][k][p]} 其中k是次高位 但是最高位出现的那么多次都没有被我们算进去 但是很显然只需要加上(i-2)^10就阔以了 然后常规的分[1,b],[1,a-1]解决 常规的分成两部分 一部分最高位小于最高位(似乎有点怪怪的??) 另一部分就是剩下的 在这里只说下另一部分 算了...
2018-11-06 11:57:00
280
转载 【USACO15DEC】最大流Max Flow(树上差分)
听了教练的考前须知 蒟蒻紧张的要死 只想做信心题 #include<bits/stdc++.h> #define N 50005 using namespace std; int n,k,tot,first[N]; struct Tree { int to,next; }edge[2*N]; inline void addedge(int x,int y) { ...
2018-11-06 10:30:00
175
转载 【洛谷11月月赛T3】【P4996】咕咕咕(组合数)
迟到的题解 昨天乱翻的时候感觉这道题挺有意思的 一眼看过去状态压缩乱搜 转移方程大概是 设f[i]表示从0转移到i的遗憾值之和 f[i]=sigma(f[j])+val[i]*dis[i] dis[i]=sigma(dis[j]) 其中j是i的子集,dis[i]表示从0转移到i的方案数之和 妙啊有70分了 // luogu-judger-enable-o2 // luogu-judger...
2018-11-06 09:56:00
254
转载 【BZOJ 4247】挂饰(背包变形)
虽然转移方程可以一眼看出 但是烦就烦在为何要排序 有人说这是一个贪心,又有人说这是一个保障正确性的。 就按照贪心的想法好了:在保证正确性的情况下尽量多的挂钩。 #include<bits/stdc++.h> #define N 2005 #define INF 0x3f3f3f3f using namespace std; int n,f[N][N]; struct Node...
2018-11-05 22:10:00
169
转载 【NOIP 校内模拟】T3 忘了是啥名字了(dfs序+树状数组)
对于当前新加入的一条路径 他产生的贡献分为两种 1.另一条路径的LCA在当前路径上 2.当前路径的LCA在另一条上 对于情况1: 可以维护当前点到根节点有多少个LCA,查询只需查询u,v,-2*lca(u,v),修改需要对lca的子树+1 对于情况2: 显然的树上差分,查询就是lca子树的前缀和,修改u++,v++,lca-2 即开两个树状数组,一个支持单点查询+区间修改,一个支持单点修...
2018-11-05 20:30:00
226
转载 【NOIP 校内模拟】T2 规避(容斥+最短路计数)
可以先不管符合条件的 先统计出所有的可能走法(最短路条数*最短路条数) 然后减去会相遇的 会相遇的分为在点相遇和在边相遇 在点(设为p)相遇:先保证点在最短路上 然后从s到p的最短路等于从t到p的最短路 在边(设为(x,y,z))相遇:同样需要保证边在最短路上(需要判断三次 同样玄妙♂) 以及相遇的地方一定在边上(两条不同的最短路的两倍不超过总长 这个姿♂势可以记住) 挺玄妙的 #inc...
2018-11-05 16:50:00
216
转载 【NOIP 校内模拟】T1 line(带权并查集)
很无奈 离正解就差一句话 简单的带权并查集 没啥好说的 也可以差分约束 #include<bits/stdc++.h> #define N 100005 #define M 200005 #define D 10005 using namespace std; template<class T> inline void read(T &x) { x...
2018-11-05 13:58:00
151
转载 【NOIP 校内模拟】T1 优美的序列(二分+st表+卡常)
我是菜鸡 我是蒟蒻 我好菜 ak一定是区间最小的值,且是所有数(包括自己)的最大公约数 我没看出来 没救了 noip爆零了 回家养猪了 没学上了 怎么办 gcd有单调性 gcd有单调性 gcd有单调性 gcd有单调性 gcd有单调性 可以二分 可以二分 可以二分 可以二分 要说多少遍才记得到 我没想到 没救了 noip爆零了 回家养猪了 没学上了 怎么办 stl少用 stl少用 stl少...
2018-11-02 17:00:00
241
转载 【NOIP校内模拟】T2 飞越行星带(kruskal)
啥玩意儿啊 题都没读懂 飞船要飞过这个行星带 就必须穿过每个行星形成的瓶颈 于是我们把每个行星想象成一个点 形成的瓶颈就是与其他点相连的边 相当于一个最小生成树了 直到s t联通 当然 这样做有点难理解 还可以类似的二分+并查集做 #include<bits/stdc++.h> #define N 805 #define eps 1e-6 using namespace st...
2018-11-02 15:48:00
219
转载 【NOIP 2017】逛公园(最短路+记忆化搜索)
肯定要先跑一次最短路 题目中的k 相当于允许我们走k距离的“冤枉路” 回想之前有些题是如何判断哪些边是属于最短路上的 当dis[now]+edge[u].val==dis[vis] 这条边就在最短路上 类似的 我们可以得出 dis[now]+edge[u].val-dis[vis]就是这一次走的“冤枉路”的长度 到这个地方搜索的策略已经很明显了 dfs(now,remain)表示当前当前...
2018-11-02 08:10:00
216
转载 【SDOI2009】Elaxia的路线(拓扑+最短路+dp)
先找出Elaxia的最短路 重新建图 在此图上我们再标记同时也是w**的最短路的边 显然这是一个DAG 可以做dp 设f[i]表示以i点结尾的最长公共连续和(公共路径一定是一条链) 则f[vis]=max(f[now],f[now]+e[u].val*e[u].flag)(flag表示是否也是w**的最短路) 为了使得没有后效性 需要在拓扑排序时做dp #include<iostr...
2018-11-01 20:48:00
247
转载 【BZOJ2750】【HAOI2012】道路(最短路+拓扑)
容易想到枚举所有起点 做最短路 然后枚举边统计次数 一条边(x,y)的贡献 肯定是 s到x最短路的方案数 乘上 s到其他点但经过了y的最短路 对于前者 每个点可以从前一个点递推过来 只要满足dis[vis]==dis[now]+edge[u].val 当一个点被所有入边都统计了一次后 就可以搜他了(拓扑思想) 对于后者 每个点从后一个点递推过来 #include<bits/stdc...
2018-11-01 16:09:00
242
转载 递增数列(迭代加深搜索)
迭代加深搜索就是限制递归的层数,然后一层层地扩大限制的层数 我们记录当前深度,以及当前应该搜出几个数 设计剪枝: 1.当当前深度乘上2^r(r是还没有选的数)比m还小 那肯定是不行的 因为最大的扩展方式就是选两个最大的数 2.这一层比上一层数小 #include<bits/stdc++.h> using namespace std; int m,step,s[1000]; b...
2018-11-01 14:32:00
325
转载 【TYVJ1340】送礼物(折半搜索+hashmap)
当答案可以分为两半时 为了降低复杂度 可以使用折半搜索 对前半部分 搜出所有可能的和 用map记录 对后半部分 同样也是搜出可能的和 如果前半部分存在一个和 能拼起来 那ans++ #include<bits/stdc++.h> #define N 45 #define ll long long using namespace std; ll n,key,ans,a[N]; ...
2018-11-01 13:36:00
253
转载 再数17(搜索+容斥)
n个集合的容斥其实就是 总的 减去两两相交的 加上三个相交 减去四个相交 加上五个.....(奇加偶减) 这道题就是一个lcm的容斥 我们用搜索来实现 枚举选的数 需要加个剪枝 当前lcm已经超过了m #include<bits/stdc++.h> #define N 35 #define int long long using namespace std; int n,m,...
2018-11-01 12:16:00
196
转载 【CF869E】The Untended Antiquity(哈希+二维树状数组)
当覆盖两点的最小矩形不同时,一定不可达 这样的问题不难想到经典的二维树状数组+差分来支持二维区间覆盖+查询 对于覆盖操作 我们可以差分的给这个矩阵里加上一个编号 对于操墙操作 我们可以反着减去这个编号 对于查询 就查询这两个点的值是否相同 编号的累积不影响 因为只有在同一个墙内才会累积 注意 如果只是单单的把编号从1开始标号是不够的 因为会出现1+3=2+2这类情况 需要哈希 #incl...
2018-10-31 17:33:00
208
转载 【NOIP校内模拟】T1 一串数字(思考题+一点点数论知识)
关键是那些两个数相乘拼成了立方数的 一个数分解质因数后,指数%3是不影响的 我们可以这样想——我们通过一个数,反推出能够和他凑成立方数的数 但有可能这个数在原序列里不存在 不过没关系 我们开两个桶 每次比较下大小 只往一边放 这样就不会多统计了 #include<bits/stdc++.h> #define N 100005 #define int long long usi...
2018-10-31 16:16:00
249
转载 【NOI2018】归程(kruskal重构树+最短路+树上倍增)
总的来说 从v通往1的道路 分为了步行和开车 也就是说 一个点u 他能作为分界点 当且仅当存在一条路径(u,v)的海拔全部高于当天水位线 且(u,1)是最短路 很显然 这是一个与瓶颈有关的问题 不难想到Kruskal重构树 由于瓶颈是海拔 所以我们先建出以海拔为关键字的重构树 由于是个小根堆 所以一个节点 子树的海拔都大于他 换句话说 v能到达子树里的任意一点 所以我们可以预处理出一个子...
2018-10-31 15:00:00
249
转载 【HDU1007】Quoit Design(分治求平面最近点对)
假设当前区间为[l,r] 中间点为mid 那么最近点对 要么在[1,l]中,要么在[l+1,r]中,要么两边各有一个 我们递归处理出左区间的 最近点对距离d1 右区间d2 取d=min(d1,d2) 然后有两个剪枝来处理情况3 1.按x为关键字排个序,枚举[l,r]的点,假如一个点的x与中间点的x差值已经超过了d,那肯定不满足要求,因为还要算上y 2.剪枝1还不够,当我们已经筛选出符合剪...
2018-10-30 22:41:00
490
转载 【BZOJ 4289】PA2012 Tax(技巧建图最短路)
暴力做法:(30pts) 把每条无向边拆成两条有向边.把每条边看成一个点,对于两条从一个点出去的边 建两条有向边 边权为较大值 这样是m^2的 优化: 可以用类似差分的思想来 然后出边之间做差分 对出边的边权排序 然后相邻边之间连边(小边向大边连权值为两边权值之差的边,大边向小边连权值为0的边) 这样入边只需向他的对应边连一个权值为原边权的边即可达到去最大值的效果。 #include&l...
2018-10-30 20:55:00
182
转载 【NOIP校内模拟】T2 字胡串(分治)
%%%%%%%%%%%lst神仙 这是他的做法 吊了标算 对于这种有多少区间满足要求的 我们套路的用分治做 每次都统计左端点在左半边 右端点在右半边的个数 设f(i) 表示当前点到中间分割点的最大值,g(i)表示当前点到中间分割点的或和 我们发现 g(i)≥f(i) 所以只需找到g[i]=f[i]的区间就好 然后f肯定是单调递增的 所以可以维护双指针 边界条件很坏坏 膜lst神仙啊 #i...
2018-10-30 16:48:00
195
转载 【NOIP校内模拟】T1 排列树(树上的组合数)
假设当前节点now的子树大小为size now的方案数是他的所有儿子内部如何分配的方案数相乘得到的 这个可以递归计算 不过对于那么多儿子之间 他们分配走的标号可能是不同的 比如now将把2,3,4,5分配给他的子树,那有可能是2,3;4,5 也有可能是2,4; 3,5这样分 所以还得套个组合数 C(size,size') size需要一直减下去 #include<bits/stdc...
2018-10-30 15:39:00
223
转载 【BZOJ 3718】 [PA2014]Parking(树状数组)
容易想到如果两个“交叉”的车车的宽度加起来比停车场还宽了那肯定是不合法的 也就是说 一个车子移动过程中只要前面存在一个位置,经过了他,而且和他的和大于w就是不合法的 然后我们从大到小枚举终点位置 这样保证了树状数组里维护的一定是经过了当前点的 #include<bits/stdc++.h> #define N 50005 using namespace std; templa...
2018-10-29 17:07:00
211
转载 【洛谷P3388】【模板】割点
都快忘了割点怎么搞了 对所有点分两类 1.根节点 2.非根节点 显然根节点是很好做的 只需要数一下有没有两个子树以上 对于非根节点 利用tarjan算法 回忆到dfn的定义:时间戳,即在dfs中第几个被访问到 low:经过最多一条后向边/栈中横叉边能到达的最小的节点时间戳 对于当前节点now来说,把整个图分成了两个子树。假如low[vis]>=dfn[now],(注意不要把时间戳和...
2018-10-29 14:47:00
206
转载 【BZOJ 1801】【AHOI 2009】中国象棋(递推DP)
(谁告诉我是状压的????) 一行/列最多能放三个炮 30分是让你爆搜的 50分是让你状压的 假设有8列 dp[i][j]表示到第i行且前面列的状态为j (没有/有一个/有两个炮) 然后刷表 100分其实就是在50分的基础上修改了一点 因为发现 并不需要准确的知道之前摆放情况到底是什么样子的 于是dp[i][j][k]表示放了前i行,有j列是有1个棋子,有k列有两个棋子 同样的刷表 #i...
2018-10-29 14:36:00
156
转载 【BZOJ 3613】【Heoi2014】南园满地堆轻絮(贪心结论题)
一开始在往平均数那方面想 但是好像是错的 我们这样想 每当加入一个数 如果他与之前构成的是上升的就不管 如果是下降的 那肯定要折中 变成中间值才能最小 即答案就是最大的逆序对差值/2 #include<bits/stdc++.h> #define ll long long #define N 5000000 using namespace std; int n; ll Sa,...
2018-10-29 10:42:00
214
转载 【BZOJ 1922】【SDOI 2010】大陆争霸(有限制的最短路)
(谁告诉我这是个分层最短路来着的???) 进入一个城市必须要这个城市所有结界都打破才能进 那我们可以边炸边走 也就是说 我们可以维护d1数组:走到的时间(结界可能没炸完) d2数组:可进入的时间(结界都被炸完了) d数组:真实的到达时间 容易发现d[i]=max(d1[i],d2[2]) 那我们就用dijkstra维护d数组 每次都要更新当前点所保护的城市的可进入时间 以及当前点连的城市...
2018-10-29 09:54:00
213
转载 【BZOJ 2600】【IOI 2011】ricehub(贪心+中位数)
拿到这道题一开始有两个naive的想法 想法1:对于每个位置 向右扩展 直到不能取了为之 但是又觉得复杂度不对就放弃了...... 想法2:离散化坐标 二分仓库的位置 每次往左右两边数量较多的一边靠(这是什么口胡玩意儿???) 正解: 事实证明我是被ioi2011吓到了 其实就是想法1加了一丢丢东西 维护一个左指针 右指针 假设是[l,r]区间 那么仓库放的位置最优一定是中位数的地方 这...
2018-10-28 22:39:00
222
转载 【BZOJ 2151】种树(链表+贪心)
有一种显然错误的做法:每次从堆里取最大的,更新链表 比如 19,20,19 这样的话会先选20。但是很显然,选两个19带来的贡献可能是更好的 这时我们就要想一种能做到“反悔”的方法 其实只需要做一点点修改,每次再push一个“19+19-20”进去,一样是对的 那这个“19+19-20”的放在哪儿呢(编号)?只需要放在20的位置就行了,这样是正确的 其实这样做的本质 是重写了这个问题 将...
2018-10-28 17:07:00
204
转载 【洛谷P4315】月下“毛景树”(树链剖分)
这是一道毒瘤题。 首先题目中给的是边权而不是点权,但是我们把边权移到点上就行了 但是要注意,之后我们修改u,v两点之间的路径时,就不要修改他们的lca,以及当要修改单边的时候,把边的编号*2(因为是双向边),然后挑深度大的那个点来修改 重点是区间覆盖tag和区间加tag。首先注意,进行区间覆盖时,一定要清零区间加tag。然后其次,pushdown的时候一定要先覆盖再加 #include&...
2018-10-28 16:08:00
160
转载 【CF402D】Upgrading Array(素数+质因数+gcd+贪心)
不难发现 题目中给出的f函数 其实就是一个数分解质因数后好素数和坏素数的个数之差 也就是说 数x带来的贡献 与x的质因数的种类有关系 又联想到gcd[1~x]一定是这个数的因子 也就是说一个数的贡献可以表示成:f(gcd[1~x])+f(....) 容易想到贪心做法:我们从后往前枚举 如果当前gcd前缀带来的贡献<0 就除一下 另外有几个小细节我平时没有注意到的: 1.线性筛素数 ...
2018-10-27 21:49:00
279
转载 【BZOJ3732】Network(Kruskal重构树)
发现我还naive的不会Kruskal重构树 所谓Kruskal重构树 就是在做Kruskal的时候 构造一颗树 对两个即将合并的联通块 新建一个节点 作为这两个联通块的父亲 且这个节点的权值就是那条相连两个联通块的权值 而且这棵树很明显是一个堆 那么对于最初的最小生成树 两个节点路径上的最大/小值 就是重构树上他们的lca 然后就可以解决这道题了 #include<bits/st...
2018-10-26 17:44:00
163
转载 【NOIP校内模拟】T1 性感♂手枪(dfs)
vis是一个三维数组 vis[x][y][0]代表第一次搜到原图坐标(x,y)的x"虚"坐标,vis[x][y][1]代表第一次搜到原图坐标(x,y)的y"虚"坐标,vis[x][y][2]代表是否搜过 这样既可以判断什么时候进入了无限走状态,又可以判断是否死循环了(往前走一步又退回一步) #include<iostream> #include<cstdio> #...
2018-10-26 16:45:00
267
转载 【BZOJ1106】【POI2007】立方体大作战tet(树状数组+贪心)
贪心策略:每加入一个数,如果之前已经存在它了,就直接交换 因此我们需要维护距离 就用树状数组好了 注意是2n #include<bits/stdc++.h> #define N 100005 using namespace std; int n,tree[N],pre[N],ans; inline int lowbit(int x) { return x&(-...
2018-10-25 22:15:00
159
转载 【BZOJ1087】【SCOI2005】互不侵犯(状压dp)
对于这类棋盘问题 要关注的是这一行与前一行的关系 设dp[i][j][state]表示前i行,已经放了j个国王,状态为state的方案数 然后枚举i,枚举j,再枚举state,再枚举上一行last 先判断state,last各自是否合法,再判断他们俩合起来会不会冲突 最后答案就是最后一行所有状态的方案数之和 我这个写法好像常数巨大啊。。。 #include<bits/stdc++....
2018-10-25 21:26:00
111
转载 【BZOJ 3155】Preprefix sum(树状数组)
显然是不能直接开两个树状数组维护 前缀和,前缀和的前缀和。因为一旦对a[i]进行修改,将会影响许多位前缀和的前缀和 我们考虑对式子变一下形 Qi =S1+S2+S3+...+Si =a1+a1+a2+a1+a2+a3+...+ai =a1*i+a2*(i-1)+a3*(i-2)+...+ai* =(a1+a2+a3+...+ai)*i - (a2+a3^2+a...
2018-10-25 15:57:00
211
转载 【BZOJ 2163】【JLOI2011】飞行路线(分层图最短路)
据说这个叫分层图最短路 是个常见套路 一般就是:有k次机会可以直接通过一条边,问起点与终点之间的最短路径 我的理解:就相当给dis和inque数组加了一维表示用了j次免费机会 然后在松弛的时候就有两种决策:1.走免费边 2.走要钱的边 8102年了 别写spfa了 #include<bits/stdc++.h> #define N 10005 #define M 50005 ...
2018-10-25 14:45:00
138
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅