自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 HDU 5961传递 思维 + bitset

传送门:HDU 5961题意:中文题思路:这题如果按hdu上的6s时限的话就有很多做法了,从每个点开始bfs判断是否有长度大于等于2的最短路径,或者dfs判断给出的图中是否有三元环等等,但是据说现场赛是1500ms时限,那这些做法就都不行了。能在现场赛实现下通过的一个方法是用bitset将每个点的出边保存下来,然后枚举每一条边,判断该边的两个端点的出边是否都为下图的情况即判断是

2017-10-17 15:39:43 440

原创 Codeforces 873D. Merge Sort 分治 + 构造

传送门:Codeforces 873D题意:给出一种特殊的归并排序,分治的方法同普通的归并排序一样,只是如果当前待排序的区间已经是有序的,就不会再继续递归了,让你构造一个会调用k次mergesort函数的序列。思路:因为我们上来就会调用一次mergesort函数,并且只要当前待排序区间不是有序的,那么在该层递归里就会调用两次mergesort,因此可以推出总调用次数一定是个奇数。然后我们递

2017-10-17 13:03:01 542

原创 HDU - 5963 朋友 思维 + 博弈

题意:中文题。思路:考虑和根相连的一条树链,如果这条树链上和根相连的那条边权值为1,那么最终在该链上的操作次数要为奇数次才能使得和根相连的边的权值变为0(因为不论选择该条树链上哪个点,此边的权值总会翻转),同理可得和根相连的边若初始权值为0要操作偶数次。而无论两个人怎么操作,都不会改变这些根的直连边变0所需操作次数的奇偶性,而若总操作次数为奇数次的话那就必定是先手胜了,因此我们只需维护一个每个

2017-10-16 23:50:46 305

原创 HDU - 5493 Queue 线段树 || Treap

传送门:HDU5493题意:给出n个人的身高和每个人前面或者后面有多少人比他高(不知道是前面还是后面),问能否构造出一个合法的序列。思路1:将所有人按身高从小到大排序,然后一个个取出来插入线段树,插入线段树的时候要保证前面留出足够的空来给比他高的人,又因为要字典序最小,那么我们插入的位置就是要min(ki, n - i - ki - 1) + 1.代码:#include#defi

2017-10-14 20:56:58 234

原创 HDU - 5573 Binary Tree 构造

题意:给出一颗二叉树,根节点为1,子节点为父节点的2倍和2倍+1,从根节点开始依次向下走k层,问如何走能使得将路径上的数进行加减最终结果得到n。思路:来自:点击打开链接做题一定要注意数据范围!  n 是真的没想到利用差值去搞事情。。代码:#include#define ll long longusing namespace std;int main(){ int

2017-10-14 18:44:59 208

原创 HDU 5008 Boring String Problem 二分 + 后缀数组

传送门:HDU 5008题意:给出一个字符串和q次询问,每次问字典序第k小的子串是哪个,若有多个字典序相同的第k小字符串,输出起始点最小的那个。思路:后缀数组经典应用之一有求一个字符串的不同子串个数,由于后缀数组的后缀都是按字典序排好序的,因此每个后缀贡献的子串也是排好序的,这样我们可以搞一个不同子串个数的前缀和数组,然后就可以二分求出一个解来了,但是这个解不一定是起始点最小的解,因此我们

2017-10-13 16:45:17 316

原创 HDU - 5009 Paint Pearls dp + 链表 + 下界优化

传送门:HDU 5009题意:给出n个连续的珠子,珠子有不同的颜色,现将其划分成任意多段,每一段的代价为该段中颜色种数的平方,问划分的最小总代价和是多少。总思路:dp[i]代表处理到第i个珠子的最小花费,显然dp[i] = min(dp[j] + num[i][j] * num[i][j])(0 优化方法1:用双向链表维护珠子的颜色,使得任意时刻已经遍历过的珠子中每种颜色都只保存一个最

2017-10-13 12:02:43 203

原创 CodeForces - 867E Buy Low Sell High 贪心 + 优先队列

传送门:CodeForces - 867E题意:有一个物品,在n天内有不同的价格,每天可以选择买入或者卖出该物品,而且只能操作一次,初始手上没有该物品,问能获得的最大利益是多少。思路:题目都告诉你了,我们肯定是要贪心的低买高卖,考虑用优先队列(小顶堆)维护这一过程,我们每次得到一个新的价格,将其和堆顶的价格比较,如果比堆顶的价格低,就直接放入堆中,如果比堆顶的价格高,就意味着我们可以提前以

2017-10-12 15:38:51 752

原创 HDU - 5029 Relief grain 树链剖分 + 线段树好题

题意:给出一棵n个节点的树,和m次操作。 操作a,b,k相当于将树上a,b结点间的路径上的节点都加上一个type k,最后输出每个结点被加最多次的那个type, 若有多个type被加的次数相同,输出编号最小的type。思路:显然要先树链剖分将树上操作变成线性序列的操作,emmm,然后我就不会了。。正解:树链剖分后考虑如何维护更新操作,对于一个操作a,b,k,我们可以在pos[a]位置打上一

2017-10-11 22:50:04 289

原创 HDU - 5036 Explosion floyd(bitset优化) + 概率期望

题意:给出n个房间。每个房间上都有锁。每个房间内有一定数量的能开其他房间的钥匙,若当前手里的钥匙不能再打开新的房间,我们可以选择用炸弹炸开一个新的房间,给出每个房间中钥匙的数目和具体能开那个房间,求要打开所有房间,需要使用的炸弹数目。思路:单独考虑每个点打开需要用炸弹的期望次数,那么所有点的期望之和就是答案。每个点 v 需要用炸弹的期望次数是 1/S, S是u(u->v连通)的数量,然后就变成

2017-10-11 22:16:42 434

原创 Gym-100851F Froggy Ford 最短路变形 dijkstra || spfa

题意:有条宽为w的河流,两岸分别在x = 0, x = w处,河中间有n个石头。在河的左岸有一只青蛙想通过石头跳到对岸去。现在可以在河中间某个位置多加一块石头,使得青蛙在单步跳跃中的最大值最小,问应在哪里加。思路:将左岸抽象成原点,右岸抽象成目标点,原点到任意石头(x, y)的距离都是x,目标点到任意石头的距离都是w - x,任意两石头之间的距离就是他们坐标的欧氏距离,按此建图,跑一个dijk

2017-10-10 21:37:48 348

原创 HDU - 6191 Query on A Tree 可持久化字典树(01Trie) || 字典树启发式合并

题意:给出一个含有n个节点的树,每个点有一个权值,现有q次询问,每次询问给出u,x,问以u为根的子树中的点权值和x异或最大是多少。思路1:在线做法,用dfs序将对子树的询问化成对一个连续的序列的询问,然后对dfs序建立可持久化字典树,每次询问时贪心的寻找一个能使异或值最大的数就好了。第一次写可持久化数据结构,感觉很神奇。代码:#include#define ll long lon

2017-10-09 21:05:32 401

原创 2015-2016 Northwestern European Regional Contest (NWERC 2015) 补题

C.Cleaning Pipes题意:给出n条管道(线段),任意两个管道之间之多有一个交点,忽略一个管道头部和其他管道的交点,问能否选出一个不相交的管道集合来使得所有交点都被这些管道覆盖。思路:将管道抽象成点,两个管道的交点抽象成边,那么问题转化成判断新建的图是否是一个二分图。判断二分图最常用的方法就是染色法,本题当然也就可以用,然而我看dalao的代码还学了另一种方法:利用并查集判断

2017-10-08 23:12:37 387

原创 UVALive - 7139 Rotation 矩阵前缀和(imos和)

传送门:UVALive 7139题意:N*M的网格,一辆车沿着网格线按给定路线走,每个网格里有一个人,人的视线始终看着车,问这些人净转圈数的平方和。思路:因为起点和终点都是左上角,因此我们可以维护每一个格子左边部分的上下经过次数差,这也就是该格子的净转圈数,维护这个经过次数的时候可以用差分的思想(类似树状数组区间更新点查询),然后最后再求一个矩阵前缀和就是每个点真正的值了。代码:#

2017-10-08 00:20:21 318

原创 Codeforces 869 E. The Untended Antiquity 二维树状数组

传送门:Codeforces 869E题意:在一个n×m的方格板上,操作1将一个矩形区域的边界上加上一圈障碍,操作2将一个矩形区域的边界上的障碍移除,操作3询问两点是否能不越过障碍互相到达。题目保证任意两圈矩形障碍不会相交。思路:很容易想到二维树状数组实现区间更新点查询,但是如果只是简单的+1,-1更新的话是无法判断出两点是否可以不经过障碍可达的。因此我们要把每一圈障碍都哈希出一个不同的值

2017-10-07 22:26:58 546

原创 Codeforces 868 D. Huge Strings 字符串思维乱搞

传送门:Codeforces 868 D题意:有n个01字符串,第i个操作是用第l个和第r个拼成第n + i个字符串,然后询问最大的k使得所有长度为k的01串都在这个串中出现过。思路:emmm,借鉴了杜瑜皓大佬的思路和代码风格,这题解法很多,前提是要知道一点:k的范围不会很大,甚至不会超过10。知道了答案范围这么小以后基本就可以瞎搞了,暴力,搜索,二分,STL什么的都能上。大佬的思路是

2017-10-07 19:41:40 575

原创 HDU - 4850 Wow! Such String! 构造(字符串上的欧拉回路)

题意:构造一个长度为N的小写字母字符串,要求所有长度大于等于4的子串只能出现一次。不能构造输出“Impossible”。思路:详见:点击打开链接类似的字符串构造题应该也能抽象出类似的模型。代码:#include#define MAXN 26 * 26 * 26#define mod (26 * 26)using namespace std;struct node{ int

2017-10-07 17:54:12 340

原创 HDU 6183 Color it 线段树(动态分配节点)

传送门:HDU6183题意:有四种操作:0:把所有点清空1:在(x,y)上添加一个颜色为 c 的点(不会覆盖以前的颜色)2:查询横坐标1 到 x1,纵坐标 y1 到 y2 这块区域内颜色种数3:退出思路:因为只有51种颜色,建立51颗线段树,每颗线段树节点下标对应颜色c的y坐标值,节点的值为该y坐标下最早出现颜色c的x坐标,因为每次询问都是[1, x1], 易证这样维护是正

2017-10-05 20:21:01 323

原创 CodeForces - 862E Mahmoud and Ehab and the function 二分(思维题)

传送门:Codeforces 862E题意:给出长为n的a序列和长为m的b序列,求.的最小值,其中0 还有q次操作,每次操作将a[l..r]区间内的数 + x, 每次操作后求一次f(j)的最小值思路:容易得到无论a序列的数怎么变化,每个位置上的数的加减性质是不会变的,即奇数位置上的数一直是加,偶数位置上的减,因此我们将f(j)的值拆成a序列的贡献和b序列的贡献两部分,无论j怎么

2017-10-03 22:12:35 256

原创 HDU - 5514 Frogs 容斥(技巧)

题意:给你n种步长,无限走一个圈,圈长m,位置标号从0到m−1,求至少被经过一次的位置之和。 思路:来自:点击打开链接大致思路就是用两个数组记录每一个因子该算几遍和已经算了几遍了。就算是这样做我也感觉复杂度不科学,因为一个数的因子数目不是根号n数量级的么。。代码:#include#define ll long long#define inf 0x3f3f3f3fusing

2017-10-02 21:47:21 199

原创 HDU - 5556 Land of Farms 枚举 + 无向二分图最大独立集

题意:有一个农场大小为n*m  里面有一些古老的农田,你现在需要新建一些农田,要求新建的农田之间不能相连,古老的农田不可拆分,如果你选择了一块土地(原为古老的农田)建立新农田则该新农田需要把一整块连通的古老的农田全部包含。问最多能新建多少个农田。思路:由于古老的农田只有10个,因此我们可以枚举选哪几个古老的农田,然后对于剩下的空地,相邻空地之间建边,求一个二分图的最大独立集就是剩下的空地中最多

2017-10-02 21:34:02 266

原创 CodeForces - 540E Infinite Inversions 离散化 + 树状数组

题意:有一个1,2,3,4...无限序列,进行m次操作,每次交换i,j位置上的数,问操作完以后有多少对逆序数。思路:来自:点击打开链接思维点在于将没有操作过的连续序列也离散成一个点,权值为序列中数的个数,这样就可以无脑进行交换操作,然后用树状数组统计一下逆序对数就好了(注意每个点有权值)。代码:#include#define ll long long#define inf 0x

2017-10-02 21:15:34 261

原创 HDU - 5517 Triple 二维树状数组

题意:有二元组(a,b),三元组(c,d,e)。当b == e时它们能构成(a,c,d)。 然后,当不存在 [ (u,v,w)!=(a,b,c)且u>=a,v>=b,w>=c ]时,则是一个better集合里的元素。 问这个better集合有几个元素.思路:首先能确定的是每一个原来的三元组最多构造一个新的三元组,因为当b == e时,我们只能选所有(a, b)当中a最大的那个(选其

2017-10-02 20:58:44 213

原创 HDU - 4424 Conquer a New Region 并查集好题

题意:给定N个点的树。定义d(u,v)为路径u到v的容量,其值为路径上最小的边权。求一个点作为root,使得其他所有点到该点的容量和最小,求最小值。思路:考虑边权最小的边e,则root一定在其左子树或者右子树上,假设在左子树上,那么e的贡献就是w[e] * sz[rchild] + ans[lchild],然后将最小边去掉,树就被分成了两部分,每一部分都会有一个最小边,这样分治下去就能求出

2017-10-02 20:37:18 304 4

原创 HDU - 5046 Airport 二分 + DLX可重复覆盖

题意:给定n个城市的坐标,要在城市中建k个飞机场,使任意城市距离最近的飞机场的最大值最小,求这个最小距离。思路:最大值最小化是典型二分条件,然后就是如何check,将每对距离小于二分值的两个机场称为互相可覆盖,构造n * n的矩阵,机场之间有覆盖关系的置为1,否则为0,则转化为DLX求解矩阵可重复覆盖问题。DLX精确覆盖详解:点击打开链接 (想不会都难)DLX重复覆盖与精确覆盖:点击打

2017-10-02 19:53:48 276

原创 HDU - 4803 Poor Warehouse Keeper 贪心 + 思维

题意:给出两种操作:如果按下按钮1,会使数量+1,总价对应增长单价数目(因此按下按钮1不会改变单价)如果按下按钮2,会使总价加1,数量不变(按下按钮2会使单价增加)现在问至少多少步可以使得   按钮1数字为x, 按钮2数字为y;

2017-10-01 22:04:05 225

原创 HDU - 4587 TWO NODES 求割点变形(去掉一个割点能得到的最大连通块数)

题意:给出一张图,问从中任意去掉两个点及其邻接边,所有可能情况剩下的图中连通块的数量最大是多少。思路:先枚举去电其中一个点,剩下的一个点用tarjan求无向图割点类似的方法求个最大值,具体就是当一个点能成为割点时,我们不是将其标记出来,而是将其计数器+1,最后取一个最大值就行了。需要注意的就是当根节点为割点时,将其去掉以后得到的新连通块数量是son - 1.(son为搜索树上其儿子的数量)

2017-10-01 21:53:48 495

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除