自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Everything can be done!

学习充实自己,使自己变得更加强大

  • 博客(51)
  • 收藏
  • 关注

原创 玲珑杯round#19B 1149 Buildings

题意:给出一个数列和k,求出满足[L,R]区间中最大的数减去最小的数思路:注意到固定l之后,随着r的右移,[l,r]的最大值越来越大,[l,r]的最小值越来越小,故max(hl,…,hr)−min(hl,…,hr)是单调递增的。二分得到r的最大值,答案加上r−l+1。用ST表维护O(1)查询区间最值。时间复杂度O(nlogn)。#includeusing

2017-07-31 11:30:36 214

原创 codeforces 673D(思维)

题意:给出一个a,b,c,d。然后求出一个满足a -> …… -> b ,c -> …… -> d的情况,a ,b不能直接相连,c ,d不能直接相连,给出点数和允许的最大的边数。思路:随意构造出一个满足的情况,你会发现满足最少的边数为n + 1。除ACBD点的边数为n - 4 - 1,然后还需要6条边,所以至少需要n+1条边。#includeusing namespa

2017-07-31 11:05:48 300

原创 codeforces 673C(思维)

题意:找出每种颜色在区间是否满足它在这个区间的数量最多或者与最大相等但颜色最小,满足的话就加一,输出每种颜色操作后的结果。思路:直接枚举区间,开一个数组然后O(1)维护这个区间的最多的颜色的数。PS:比赛的时候想不到呀?思维还是不够!#includeusing namespace std;typedef pair P;const int maxn = 5000 +

2017-07-31 10:53:00 231

原创 hihocoder1543(思维+ 二分)

题意:给出一个10^9的数,然后判断这个数最多能够由多少个连续的数组成。思路:先假设能1 ~ n组成这个数,打个表,二分一下,然后得到这个数最多有多少个数组成,最多为10^5;然后以这个最多的数开始进行暴力枚举,枚举这个数由多少个连续的数组成,假设这些连续的数的起点为x,那么的话满足(x + (x +  i - 1))/2 * i == n;得到如果刚好分完的话x = (n * 2 /

2017-07-31 10:41:09 178

原创 codeforces686D(树的重心)

题意:求出以每个点为子树的重心。思路:可以利用重心的性质,某一个点的重心在最大的点那个子树上,并且在在这个节点到最大子树的重心之间,重心满足num[x] * 2 > num[u],x为重心,u为要求重心的节点,num[]代表这个节点的子树的节点个数。#includeusing namespace std;typedef pair P;const int maxn = 3000

2017-07-31 10:34:49 743

原创 codeforces731F (思维)

题意:给出一个数列.在数列中选取一个数,然后求把数列中的数变成小于他们的并且是这个数的倍数的数,求变化之后的数列的和最大值。思路: 将每个数的个数记录下来,用前缀和记录下来。然后枚举每一个数,以他们的倍数进行计算出选取这个数后数列和。以他们的倍数计算是:比如以枚举a[i] ,那么在 a[i] * j 和 a[i] * (j + 1) - 1这个区间的数经过变换之后都是a[i] * j

2017-07-29 20:17:59 242

原创 hdu 5945 单调队列优化的DP

题意:给3个数x, k, t。经一系列操作后,使x变为1,求最少的操作次数。具体操作为:每次x可以减去一个数0~t,或者除以k。解析:本题使用dp,但是需要用单调队列进行优化。动规需要从1开始,一直往上计算,直到x为止。递归公式为:dp[i]=min(min(dp[i-t]~dp[i-1])+1,dp[i/k]+1)单调队列:单调队列中的数字都是递增或者递减的。本题中队列用来保存下

2017-07-29 16:50:41 281

原创 hdu 5762 (思维 + 暴力)

题意:在10^5个点中找出两对点的曼哈顿距离相等的话就输出YES,否则NO。坐标的取值范围为1e5思路:因为两个点的曼哈顿距离最大为2e5,所以根据鸽笼原理,当超过这个数的时候肯定会有两个相等的,最大也就是跑到2e5PS:做这个题的时候没往这边想,没想出来,不过涨姿势了。#includeusing namespace std;const int maxn = 2e5

2017-07-29 10:52:38 267

原创 队列极值NOJ1926

题目链接:http://acm.nuc.edu.cn/problem/show/1926题意:对一个队列进行插入和删除操作,然后会有询问最大值和最小值。思路:开两个栈A,B,一个用来进一个用来出。然后分别在A,B这边维护最大值和最小值的两个栈。总共开了6个栈数组。注意为了维护是队列的性质。当B为空的时候A才能吧它的元素放入其中。然后对每次出栈,入栈操作维护一下最大值最小值就行了

2017-07-29 10:01:22 214

原创 hdu 5094 状压+BFS

题意:给出k扇门,每扇门有一个编号,要开这扇门需要提前拥有对应编号的钥匙。相邻的两个格子存在墙,不能通过。然后要求从(1,1)到(n,m)的最少的时间。思路:用状态表示获得的钥匙的情况,经过门的时候判断是否拥有这个编号的钥匙。用0表示相邻两个格子之间能通过,1表示有墙,大于2的表示的是门的编号。PS:注意每个格子不止有一种钥匙。不能用钥匙表示标记,因为种类数相同的话情况不同

2017-07-28 17:39:53 216

原创 treap普通平衡树bzoj3224

Treap拥有二叉排序树和heap的共同性质,rnd修正值是节点的一个随机值,使得平衡树为大顶堆,rnd小的为父节点。当左子节点的rnd小于父节点的时候,需要进行右旋转:父节点作为左节点的右节点,左节点的右节点作为父节点的左节点。当右子节点的rnd小于父节点的时候,需要进行左旋转:父节点作为右节点的左节点,右节点的左节点作为父节点的右节点。以下转载自:http://hzwer.

2017-07-28 10:32:19 236

转载 随机二叉平衡树treap学习

转载自:http://blog.csdn.net/acceptedxukai/article/details/6910685感觉别人写得特别好。二叉查找树二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点

2017-07-26 20:57:03 306

原创 hdu6040 (nth_element函数)

题意:搞糟出一个数组,查询整个数组第k大。思路:可以运用nth_element函数,nth_element函数是把第k大的数放在第k位,然后左边都是比它小的数,右边都是比它大的数,顺序任意。为了更优化一些,先将要查询的数列排个序,然后从后往前进行查询,因为输入保证任意两个小的之和小于第三个所以查询数列的间隔一定大于等于斐波那契,也就是从大到小查询的话,每次至少能去掉一半的区

2017-07-26 15:08:11 629

原创 codeforces 463C(对角线技巧)

题意:选取两个点,分别得到两个点对应的对角线上的值,要求两个点走的对角线不能相交,然后求两个点的对角线的值最大。思路:对于一个n * n,求一个点的左对角线和右对角线的技巧为:对于a[i][j]这个点对应的左对角线上的横坐标+纵坐标都等于i + j,右对角线 的i - j + n 都相等。例如4 * 4 的:i + j :为左对角线i - j +

2017-07-26 10:10:21 439

原创 codeforces197C(二分)

题意:在给出的一个字符串中找出字典序最大的子串。思路:找出字典序最大的话就要求大的尽可能在前面,所以要把所有的最大的枚举出来,然后在这个的后边再找第二大的,这个时候就要用到二分,找到后一个在这个点之后的点。#includeusing namespace std;const int maxn = 100000 + 10;int pos[26][maxn];char s[max

2017-07-25 21:27:02 254

原创 hdu 6034(贪心)

第一场多校,就卡在这个题了,好难受,只是因为没看到前导零这个条件,哎,wa了一下午。题意:给出n个字符串,包含的字符为a ~ z,然后给每一个字符付一个0~25的值,使得这n个26进制数之和最大。思路:对于26个字母,进入每一个字母建一个26进制代表它的权(如果有一位大于26,就是/26,%26操作),然后判断26进制的大小,大的取25,依次类推。PS:以后看题要认

2017-07-25 20:39:52 373

原创 hdu 4568 (状压dp TSP问题)

题意:给出一个二维宝藏图,有些点为-1代表不能走,否则的话代表挖这个点的宝藏需要的花费。然后给出k个点,问经过出边界出发经过这k个点,再从边界结束的最小花费是多少?从哪个边界出发和结束不限制。思路:首先想到的就是tsp问题,不过这里首先要建边,求出这k个点到各个点的距离和到边界的最小距离。然后跑tsp的状压dp.dp[i][s]代表这个跑完s集合以i结束的最小花费,那么当j也属于这个集合的

2017-07-25 09:54:25 443

原创 hdu2818(带权并查集)

题意:给出编号为1 - n堆的石头堆,初始每个石头堆中都有一块石头。然后有两个操作,M x y,表示的是将x石头堆堆在y石头堆上,C x 表示的是查询x石头堆下面有多少块石头。注意如果是移动第x堆的话,和他在一起的一起移动。如果是移动到第y堆,那么直接在第y堆最上面放,原来的不变。PS:题意理解了许久许久。思路:用两个数组,d数组表示的是在这堆下面的石头有多少块,num数组

2017-07-24 21:22:07 457

原创 hdu 3861(tarjan 缩点 + 二分图匹配 求最小路径覆盖

题意:题目大意:一个有向图,让你按规则划分区域,要求划分的区域数最少。规则如下:1、有边u到v以及有边v到u,则u,v必须划分到同一个区域内。2、一个区域内的两点至少要有一方能到达另一方。3、一个点只能划分到一个区域内。 解题思路:根据规则1可知必然要对强连通分量进行缩点,缩点后变成了一个弱连通图。根据规则2、3可知即是要求图的最小路径覆盖。定义:最小路

2017-07-23 17:17:20 300

原创 poj3252(数位dp)

题意:给出一个区间,在区间中找出用二进制表示的话0的个数大于1的个数的数的个数。思路:先将数排成二进制的数,然后对比他小的数进行搜索,记录0,1的个数cnt1,cnt2.注意这里要去除前导零,因为前面如果都是零的话,这些零的个数不算那个数的。PS:刚开始一直用dp[pos][pre]进行记录,发现当pre的pre是1的时候,也许这个dp[pos][pre]不能加上了,因为这样会使1的个数增

2017-07-22 21:07:39 318

原创 数位dp hdu2089 ,4734,bzoj 1026

PS:第一次有信心地去写数位dp.hdu 2089:题意:求L,R区间中不含4,和62的数的个数。思路:记录前一个数,如果前一个数是6,那么这个数就不能是2;4的话直接判断不加入数中。          记忆化在全局会省时间,每次要判断是否是这个数的上界。#includeusing namespace std;const int maxn = 20;typed

2017-07-22 17:25:39 194

原创 poj1506(栈优化技巧)

题意:给出一些柱状图,要求求出柱状图中长方形的最大面积。思路:以每个点为起点,左右延伸,要保持a[j] >= a[i] ,a[j]为a[i]两边的数,得到以a[i]为高形成的长方形,底为满足a[j] >= a[i],经过i并且连续的区间。然后枚举以h[i]为高形成的长方形的面积的大小,得出答案。这里得到以a[i] 为高的长方形的底的方法为:因为数有10^6个,所以不能暴力。当算

2017-07-21 20:04:06 259

原创 hdu5936二分

题意:f(y,K)=∑z in every digits of yzKx=f(y,K)−y,给出x,k,求出满足这个等式的y有多少个。思路:易得y最大为10^10,而y 可以分成两部分,y = y1 * 100000 + y2,y1,y2        等式等效为: x = f(y1,k) - y1 * 100000  +     f(y2,k) - y

2017-07-21 17:28:52 258

原创 hdu5934(tarjan缩点)

题意:给出一些炸弹,引爆需要花费一些价值,引爆炸弹会有一个爆炸范围,在爆炸范围之内的炸弹也会被引爆。求出包所有的炸弹引爆的最小价值。思路:有炸弹在一个炸弹的爆炸范围之内就说明这个炸弹能引爆其他炸弹,说明要建的是有向图。  现在这个有向图可能出现环或者一些复杂的情况,所以需要tarjan缩点,使其成为一个简单的DAG,引爆联通块中的任何一个点,这个联通块中所有的点就会被引爆,这样的话判断是否

2017-07-21 09:13:55 357

原创 hdu 5943 二分图匹配

题意:给出S + 1 ~ S + N这些数,然后放到1 ~ n的位置中去,x能放到y这个位置的条件是x % y == 0.思路:素数出现两次就不能匹配,但是没想到素数间隔(潜意识认为20亿以内的素数肯定间隔很大).20亿内两个素数之间最大间隔不会超过300,所以超过600直接输出No.所以解法就是小数据二分图匹配,大数据直接输出No.防止区间相交,要特判一下n,s的大小.PS

2017-07-20 19:42:29 217

原创 uva 424 Java大数

import java.io.*;import java.math.*;import java.util.*;public class Main{ public static void main(String args[]) { Scanner in = new Scanner(System.in); BigInteger ans = Bi

2017-07-19 19:38:38 210

原创 hdu4920 滚动数组的矩阵相乘

因为元素是%3之后的数,所以就三种0,1,2,所以0比较多,滚动优化会有效。#includeusing namespace std;const int Mod = 1e9 + 7;typedef long long ll;const int maxn = 800 + 10;struct Matrix{ int m[maxn][maxn];};int n;Mat

2017-07-19 18:12:47 207

原创 hdu 3970(欧拉+逆元)

题意:找出{0 ,1,……,n - 1}这个集合中的子集的元素的和能整除n的个数。思路:不会推导,打了个表,还是没发现规律,找到网站才发现规律为:a(n) = 1/n * sum_{d divides n and d is odd}2^(n/d) * phi(d).哎,都不好意思粘了。。#includeusing namespace std;const int Mod

2017-07-19 17:42:34 223

原创 hdu4927 大数

题意:给一个数列,进行n - 1次操作,每次操作是把数列的相邻的两个数的后一个减前一个,求经过操作最后的数的值。思路:虽然数据只有3000,暴力n ^ 2不会超时,但是因为加减很多,会出现数非常大的情况,所以要用大数,     只是用大数加n ^ 2的模拟的话也超时了;   那就得找规律,发现会出现一个杨辉三角,即 a[n],a[n - 1],a[n - 2],……,a[1]的系数分别

2017-07-19 17:25:02 284

原创 最大流学习hdu3549 && 4920二分图匹配

Dinic算法:#includeusing namespace std;const int maxn = 500 + 10;typedef long long ll;#define clr(x,y) memset(x,y,sizeof x)#define INF 0x3f3f3f3fstruct Edge{ Edge(int x,int y,int z):to(

2017-07-19 13:58:23 247

原创 hdu 1568求斐波那契数的前4位 && hdu3117矩阵快速幂

hdu1568斐波那契数的通项式为:1 / sqrt(5.0) * (((1 + sqrt(5.0)/2)/2)^n - (sqrt(1 - sqrt(5.0))/2))^n)一开始就知道要取对数,但怎么也没想到后面的大一点的时候可以省掉,zz.假设给出一个数10234432,那么log10(10234432)=log10(1.0234432*10^7)=log10

2017-07-19 09:48:33 248

原创 poj3318 (随机化验证)

题意:验证两个矩阵A * B相乘是否等于C;思路:直接相乘的话n^3,不行;可以加入一个辅助行矩阵H,如果A * B = C,那么 H * A * B =  H * C,因为H * A 之后还是一个行矩阵,时间复杂度为n^2。不过为了避免错误,H数组需要随机。Code:#include#include#include#includeusing nam

2017-07-18 21:10:56 778

原创 任务分配hihocoder 1309(离散化 )

题目链接:http://hihocoder.com/problemset/problem/1309描述给定 N 项任务的起至时间( S1, E1 ), (S2, E2 ), ..., ( SN,EN ), 计算最少需要多少台机器才能按时完成所有任务。同一时间一台机器上最多进行一项任务,并且一项任务必须从头到尾保持在一台机器上进行。任务切换不需要时间。输入第一

2017-07-18 19:59:28 309

转载 最小生成树讲解

设G = (V,E)是无向连通带权图,即一个网络。E中的每一条边(v,w)的权为c[v][w]。如果G的子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树。生成树上各边权的总和称为生成树的耗费。在G的所有生成树中,耗费最小的生成树称为G的最小生成树。构造最小生成树的两种方法:Prim算法和Kruskal算法。 一、最小生成树的性质  设G = (V,E)是连通带权图,U是V的

2017-07-18 08:57:47 461

原创 51Nod1116 K进制下的大数(思维)

题意:一个大数是k进制并且是(k - 1)的倍数,求出最小的k;思路:当为k进制的时候,因为k % (k - 1) == 1,k ^ k % (k - 1) == 1,……,所以这个大数每位的权取模之后全是一,所以要判断k进制数是否是(k - 1)的倍数的话直接将各个数相加,判断一下是否是(k - 1)的倍数就行。COde:#include#include#include

2017-07-16 20:57:01 230

原创 玲珑杯round #18 1147 - 最后你还是AK了(思维)

题意:给一棵树,然后找n / 2对点,使得max(∑n/2i=1dis(ai,bi))最大,而且可以给边加某些数,每条边只能加一次。思路:PS:n和m搞混了,一直WA,太粗心!#define OPENSTACK#includeusing namespace std;typedef unsigned long long ll;const ll maxn

2017-07-16 11:26:35 326

原创 hdu 5823(状压DP)

题意:给出无向图,然后找出给它的各个非空子图染色的最小值,染色要求一条边相邻的两个点的颜色不一样。思路:独立集是一个所有的点都不相连的点集。它的最小染色为1.          用独立集去更新它的全集;#include#include#include#includeusing namespace std;typedef long long ll;const

2017-07-15 20:55:44 323

原创 codeforces828C

题意:给出一些串的位置,要求构造成原串,空余的地方补a;思路:将每一个串的位置用vector存,排序,然后避免重复。PS:在循环里面string 赋值就超时了,要调用,因为这里串的长度和串的个数都很大。。Code:#include#include#include#include#includeusing namespace std;typedef l

2017-07-15 17:47:02 314

原创 poj3255次短路

题意:求出1 -> n的次短路;思路:1.可以跑两遍最短路,从1 -> n 和 n -> 1,因为次短路肯定是替换最短路上的一条边后形成的,所以之后直接枚举每条边替换就行了。2.在dijkstra的时候同时更新最短和次短,比较巧妙。PS:两种思路在有向图中同样适用,不过思路一在跑n - > 1的时候要建反向图。Code1:#include#

2017-07-15 09:45:55 659

原创 hdu 1829(并查集)

题意:两两配偶,其中是一男一女,问会不会出现冲突。思路:两个并查集,1 ~ n代表男,n + 1 ~ n * 2代表女。#includeusing namespace std;typedef unsigned long long ll;const int maxn = 2000 + 10;#define clr(x,y) memset(x,y,sizeof x)i

2017-07-14 20:39:19 224

空空如也

空空如也

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

TA关注的人

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