10 2017 档案

摘要:线段树/树状数组裸题,用splay写 splay也是基本操作pushup pushdown 话说我就是找不到全一点的模板,我自己写又全是bug,导致代码风格一直变来变去= = 关键是建树和区间操作(区间和,区间翻转,区间合并这几个写法都很难统一) #include<map> #include<set 阅读全文
posted @ 2017-10-31 10:46 walfy 阅读(229) 评论(0) 推荐(0) 编辑
摘要:题意:有1到n的数组,每次删除第k小的值,并求和 题解:splay基本操作,删除+合并 坑点:由于不会c++指针操作,sb的只删除了头指针导致一直mle #include<bits/stdc++.h> #include<ext/rope> #define fi first #define se se 阅读全文
posted @ 2017-10-29 13:45 walfy 阅读(222) 评论(0) 推荐(0) 编辑
摘要:题意:一个值1到n的数组,一种(多次)操作把l到r的区间反转,然后放到数组尾部 题解:裸的splay,用区间合并和区间分割,反转用lazy标记+pushdown就好了 #include<bits/stdc++.h> #include<ext/rope> #define fi first #defin 阅读全文
posted @ 2017-10-28 22:59 walfy 阅读(185) 评论(0) 推荐(0) 编辑
摘要:题意:有一群骑士要坐在一个圆形的桌子上,他们之间有些人相互讨厌,所以不能挨着,要求算出一次也不能坐在桌子上的人,每次会议桌子必须奇数个人,一个人不能开会 题解:可以先建一个补图,要满足题目条件我们只要找出所有奇圈(奇数个点的环),求出点-双联通分量,对于每一个单独的点-双连通分量,如果它一定是一个奇 阅读全文
posted @ 2017-10-28 16:24 walfy 阅读(255) 评论(3) 推荐(0) 编辑
摘要:题意:求出所有的割顶,而且还有输出该割顶连接了几个点双连通分量 题解:直接tarjan求点双联通分量就好了,可以在加入边的时候记录加入次数,大于1的都是桥,输入输出很恶心,注意格式 #include<map> #include<set> #include<list> #include<cmath> 阅读全文
posted @ 2017-10-28 14:14 walfy 阅读(163) 评论(0) 推荐(0) 编辑
摘要:题意:先给了一张无向图,然后依次加边,每次求桥的数量 题解:先用一次tarjan,我们可以标记桥的位置和记录桥的数量同时记录fa数组,然后更新边的时候我们可以用lca,因为在tarjan缩点之后得到了一颗树,当连接a,b节点时,可以直观的看出从a,b的最近公共祖先到a,b之间所有的桥都会消失,我们可 阅读全文
posted @ 2017-10-28 01:54 walfy 阅读(204) 评论(0) 推荐(0) 编辑
摘要:题意和poj3352一样。。唯一区别就是有重边,预先判断一下就好了 #include<map> #include<set> #include<list> #include<cmath> #include<queue> #include<stack> #include<vector> #include 阅读全文
posted @ 2017-10-27 21:46 walfy 阅读(154) 评论(0) 推荐(0) 编辑
摘要:题意:给一个无向图,问最少加几条边变成边-双联通 题解:求一次双联通,缩点,这样就变成了一棵树,结果就是(树上的叶子节点+1)/2,叶子节点可以通过入度判断 #include<map> #include<set> #include<list> #include<cmath> #include<que 阅读全文
posted @ 2017-10-27 21:19 walfy 阅读(280) 评论(0) 推荐(0) 编辑
摘要:前言:关于如何求双连通分量,我们可以在tarjan搜索时标记下所有桥的位置(双连通分量(可以认为是没有桥的无向图图)即可通过删去所有桥得到),那么怎么找桥呢,对于每一条搜索到的边u->x,如果low【u】>dfn【x】则说明u不能通过子图到达比x更早的节点,那么就说明该边是桥 题意:把一个无向图变成 阅读全文
posted @ 2017-10-27 19:13 walfy 阅读(194) 评论(0) 推荐(0) 编辑
摘要:归并排序的逆操作,每次二分时把第二段第一位与第一段最后一位开始往前第一个比它大的数交换位置 可以用归并排序验证答案对不对 #include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define p 阅读全文
posted @ 2017-10-26 00:00 walfy 阅读(134) 评论(0) 推荐(0) 编辑
摘要:这是一个treap裸题,还可以用splay,替罪羊树,线段树等等写 treap是树和堆结合,可以方便的在O(log(n))期望时间内进行以下操作,因此treap又叫做名次树 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因 阅读全文
posted @ 2017-10-25 22:15 walfy 阅读(305) 评论(0) 推荐(0) 编辑
摘要:用线性筛来筛,复杂度O(n) #include<bits/stdc++.h> #include<ext/rope> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pai 阅读全文
posted @ 2017-10-24 23:49 walfy 阅读(123) 评论(0) 推荐(0) 编辑
摘要:题意:每天给你一个数,要求统计最小波动值,强制在线的就是每次从已经出现过的数值中找与当前值间隔最小的加起来 题解:splay维护,同时求解当前值的前驱和后继,找距离小的那个就好了 splay是一种二叉搜索树,可以在log(n)的时间内维护,而且通过左旋和右旋避免二叉搜索树退化成一条链,而且可以利用二 阅读全文
posted @ 2017-10-18 23:37 walfy 阅读(140) 评论(0) 推荐(0) 编辑
摘要:爆炸场,A被hack两次,a,c都看错题意。。。还是太菜了 A水题,ifelse写的太搓了被hack。。 #include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_b 阅读全文
posted @ 2017-10-17 22:02 walfy 阅读(194) 评论(0) 推荐(0) 编辑
摘要:tle了好几天= =提交20+次,我都怕cf说我恶意卡测评。。。 题意:一个数组,两种操作,一种l到r加一个值,还有一种查询整个数组里距离最远的某个数的距离 题解:分块,用vector+lowbound,加法用lazy标记,查询用lowbound,复杂度O(n*sqrt(n)*log(sqrt(n) 阅读全文
posted @ 2017-10-16 15:56 walfy 阅读(318) 评论(0) 推荐(0) 编辑
摘要:想分块想了很久一点思路都没有,结果一看都是写的线段树= = 。。。完全忘记了还有线段树这种操作 题意:给一个数组,一种操作是改变l到r为c,还有一种操作是查询l到r的总和差 线段树记得+lazy标记 #include<bits/stdc++.h> #define fi first #define s 阅读全文
posted @ 2017-10-14 18:36 walfy 阅读(337) 评论(0) 推荐(0) 编辑
摘要:。。wa了一整天,,,死都找不出bug,后来把x-=l[idx],y-=l[idy]就过了= = 还是分块,用双端队列+数组(map可能会爆内存)维护,每次更新只需要更新两端的队列值和数组里存的值,查询直接暴力查询每个块复杂度O(n*sqrt(n)) #include<bits/stdc++.h> 阅读全文
posted @ 2017-10-12 20:42 walfy 阅读(186) 评论(0) 推荐(0) 编辑
摘要:和上一题差不多,就只查询了次数,不用输出跳出前的最后一位 #include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int 阅读全文
posted @ 2017-10-12 09:14 walfy 阅读(173) 评论(0) 推荐(0) 编辑
摘要:给一个数组,有两种操作,一种是将a位数改成b,一种是判断从a点跳几次能跳出数组,每次跳从a到x【a】+a 题解:用两个数组记录,每次点跳出下一个块 的次数,和跳到下一个块 的位置,用块来不断更新,查找的时候直接暴力跳每一个块,到最后一个块就挨个跳, #include<bits/stdc++.h> # 阅读全文
posted @ 2017-10-12 09:13 walfy 阅读(222) 评论(0) 推荐(0) 编辑
摘要:先对b从小到大sort,判断b是不是比sqrt(n)大,是的话就直接暴力,不是的话就用dp维护一下 dp【i】表示以nb为等差,i为起点的答案,可以节省nb相同的情况 #include<bits/stdc++.h> #define fi first #define se second #define 阅读全文
posted @ 2017-10-10 17:00 walfy 阅读(157) 评论(0) 推荐(0) 编辑
摘要:分块,在每一块中保存可见的斜率(从左边起点开始递增),对于整个数组,第k个块的最后一个可见块必须比第k+1个块的第一个可见块小 对于分块,复杂度为O(sqrt(n)) #include<bits/stdc++.h> #define fi first #define se second #define 阅读全文
posted @ 2017-10-10 12:50 walfy 阅读(134) 评论(0) 推荐(0) 编辑
摘要:一共a了6题 A:找二分图,判断有没有冲突或者孤立的店 题解:直接dfs即可 #include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> # 阅读全文
posted @ 2017-10-08 17:17 walfy 阅读(175) 评论(0) 推荐(0) 编辑
摘要:题意:给一堆照片,只能左右翻(时间为a),如果看的时候不正,就旋转(时间为b),看的时间为1,不能跳过,看过的不用再看,求看到的最大照片数 题解:模拟+二分,先从左到右扫一遍,扫的同时反向进行二分,看最远能到达的地方是哪里,然后求看到的最大照片数,还要反向来一遍,先向后扫,然后向前二分 #inclu 阅读全文
posted @ 2017-10-06 18:55 walfy 阅读(207) 评论(0) 推荐(0) 编辑
摘要:题意:减前面的数,加后面的数,保证最后不剩下数,加减次数要相同; 题解:emmmmm,看出是个贪心,先对价值排序,相同就对下标排序,规律是每次找第一个,然后从后往前找没有使用过的下表比他大的第一个,相减,然后直到找不到为止, 但是这样的时间复杂度是O(N^2),想了很久还是不知道怎么用优先队列来优化 阅读全文
posted @ 2017-10-03 09:11 walfy 阅读(120) 评论(0) 推荐(0) 编辑
摘要:emm,a出3题,补了两题 A,B水题 #include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define read(a) scanf("%d",&a 阅读全文
posted @ 2017-10-02 20:17 walfy 阅读(261) 评论(0) 推荐(0) 编辑
摘要:二进制处理 题意:给一堆数和价值,求其中数异或起来不大于k,而且价值最大 对于一个数t,如果一个数s不大于它,那么s的二进制中对应t,如果t是1,那么s可能是0,1,如果t是0,那么s必是0 枚举k的每一位1,改成0,把后面全改成1,再枚举所有情况,看能不能满足,最后求最大的价值 #include< 阅读全文
posted @ 2017-10-02 09:26 walfy 阅读(210) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示