自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

KIJamesQi的博客

大神养成中。

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

原创 UVALive 7148 LRIP(树分治+STL)

题目链接 题目大意:给出一棵树有1≤n≤1051 \leq n \leq 10^5个节点,每个节点有个权值1≤ai≤1051 \leq a_i \leq 10^5 ,求一个由节点构成的 最长权值不降连续子串,且串的最大值和最小值的差diff≤D,1≤D≤105diff \leq D, 1 \leq D \leq 10^5,样例数T≤10T \leq 10。 思路:用树分治比较方便。考

2016-08-28 16:35:01 774

原创 Gym 100646H You’ll be Working on the Railroad(搜索)

题意就是找一条从0到1的简单路径,费用最小。这里的费用定义如下: 1.路径条数=1,费用就为这条边的费用。 2.路径条数=2,费用就为两条中最小的。 3.路径条数>2,费用等于所有边的费用减去路径中最大和次大的费用。 且要求费用相同的话路径条数最少,路径条数 也也 相同的话字典序最小。/*****************************************Au

2016-08-27 15:55:49 699 1

原创 Acdream1103 瑶瑶正式成为CEO(费用流+树剖)

题目链接 中文题意就略去。求1到u的最小费用可以用费用流来做,其他的就直接遍历一遍。那么铁路的a值的更改需要用树剖来维护, 并且每次查询前需要把线断树中的a值更新到tree,再重新构网络流的图跑费用流。先算出流量为0时的费用 sum=∑cisum = \sum c_i, 然后对于每单位流量,相当于其经过的边要少花c,当流量超过了a时就不能相当于少花了,所以这里需要拆边,分为流量小于等

2016-08-27 12:53:10 499

原创 HDU 4729 An Easy Problem for Elfness(树上主席树+LCA+二分)

题目大意:给你一棵树,每条边有一个容量。然后m个询问,每个询问是互相独立的,给你两个点S, T,一个预算K, 建一条容量为1的新边的费用A(可以建在任一两个节点之间,包括S,T),将某一条现有的边容量扩大1的费用B。 问从S到T在预算允许的情况下最大流是多少。 这个分两种情况来讨论最优解: 1.如果A≤BA \leq B,显然新建不会比扩展差,可以建立kA\frac{k}{A

2016-08-23 21:14:44 445

原创 SPOJ COT(树上k大,主席树+LCA)

给出一颗含有n个节点的树,每个节点有个权值。问u到v的路径上第k小的权值是多大。 做法就是主席树+LCA,每个节点建立一颗从根(默认为1)到它的线断树,那么u->v路径的线断树就等于T[u] + T[v] - 2*LCA(u, v) + (l <= a[LCA] && a[LCA] <= r)。/*****************************************Author

2016-08-23 20:45:12 557

原创 Aizu 2677 Breadth-First Search by Foxpower(LCA + BFS)

题目链接 题目大致意思就是给出含有n节点的树,1为树根。从1开始bfs搜索整棵树,不过有顺序。深度小的比大的优先, 同一深度的其优先值为其父节点在上一层的搜索顺序,如果同属一个父节点,那么就是节点编号小的优先。然后求出路径总和sum。比如这次搜索到了u,下次需要搜索到v, 那么sum += dis(u, v)。树上的dis就是lca了,因为边权为1. 然后剩下的就是模拟这个过程

2016-08-22 23:37:00 381

原创 spoj DQUERY - D-query(区间不同数的个数 主席树 or BIT)

题目链接 给出含有n个数字的序列,每次问区间[l,r]不同数的个数。 可以用主席树也可以用树状数组,做法都是同一个原理。从左往右扫一遍,记录每个数上一次出现的位置。当扫到i位置时, 把a[i]上一次出现的位置-1,i这个位置+1。然后对于所有询问区间[x, i]进行回答(BIT区间求和)。主席树也是这个原理, 只是要保存历史版本。const int maxn = 3e4 +

2016-08-21 12:20:49 917

原创 poj2104 K-th Number(静态区间k大,主席树)

主席树 给出一个有n个元素的数列,每次问区间[a, b]间第c小的数是哪个。#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;#define Rep(i, l, r) for (int i = l;i <= r;++i)#define Rrep(

2016-08-20 17:14:20 409

原创 CodeForces 547B (单调栈)

题意 一个有n个元素的序列,没连续l个元素的最小值为这个串的strength值,求所有连续l个元素的strength是的最大值。分析 a[i]如果是其所在串的strength值,那么必然它是最小值,往前和往后找小于它的第一个位置l、r,显然[l + 1, r + 1]区间的strength等于a[i]。 就可以更新长度为len(len = r - l + 1)的strength。还有

2016-08-17 17:18:36 558

原创 Gym 100851F Froggy Ford(dijkstra)

题意有条宽为w的河流,两岸分别在x = 0, x = w处,河中间有n个石板。在河的一岸有一只青蛙想通过石板跳到对岸去。现在可以在河中间某个位置多加一块石板,使得在单步跳跃中的最大值最小。思路Dijkstra变形,用两维来表示是否路径中使用过额外的石板。dis[0][u]表示没使用额外石板的最大最小,dis[1][u]表示使用额外石板的最大最小。然后就用Dijkstra格式进行转移了。/**

2016-08-15 21:35:54 865

原创 Lightoj1267 Points in Rectangle (II)(排序+树状数组)

题意二维平面上给出p个点,然后q次讯问。每次讯问一个矩形内有多少个点落于里面,包涵边界。思路容易想到二维树状数组,但是空间炸了。可以降维处理,去掉x这一维。离散化y值,把所有点放在一起排序,每个点还有其编号、离散化后的y值、是否是询问矩形上的点、左下角还是右上角等信息。然后按照x的大小排序,剩下的看代码。const int MAXN =1e6 + 12;int p, q;struct po

2016-08-12 23:24:02 460

原创 Lightoj1083 Histogram(线断树+二分)

选定a[i]是,以它的高为准,往左找第一个小于它的后一个位置,往右找第一个小于它的前一个位置。const int maxn = 3e4 + 123;int a[maxn];int n;struct SegmentTree { struct node { int l, r, _min; }p[maxn<<2]; void build(int rt,int

2016-08-05 13:41:59 404

原创 codeforces 703D Mishka and Interesting sum (树状数组区间异或)

题意给出一个有n个元素的数组a[...], 1 <= a[i] <= 10^9,(n,m <= 10^6)。m次讯问区间[l,r]见出现了偶次的数的异或值。思路可以先求出1到i的异或值sum[i] = sum[i - 1] ^ a[i];树状数组部分有点同于求区间数的种数。last记录每个数前一次出现的位置。走到i时,如果a[i]出现过,那么把他上次出现的位置异或掉,再在i位置上异或上a[i]。

2016-08-05 10:10:33 802

原创 Lightoj 1411 - Rip Van Winkle`s Code(线断树)

题意就是用快速的方式实现在面的四种操作。long long data[250001];void A( int st, int nd ) { for( int i = st; i <= nd; i++ ) data[i] = data[i] + (i - st + 1);}void B( int st, int nd ) { for( int i = st; i <= nd;

2016-08-03 10:11:11 464

原创 Lightoj1188 Fast Queries(树状数组离线)

题意给出n个数,Q次询问l,r表示数组l到r区间内有多少种数字。思路离线处理每个区间,把区间按照r的值从小到大排序。用vis[...]数组记录每个数前面出现的最近的位置。处理到位置i时,如果前面出现过a[i],那么把前面的那个位置清0,然后标记新的位置,再就是求前缀和了。。。const int maxn = 1e6 + 1234;struct Querys { int l, r, i

2016-08-02 22:55:53 457

原创 Lightoj1187 Lining up Students(树状数组)

题意有n个人,每个人有不同的身高,n个人站成一条线,每个人说出左边比自己高的人数,问最左边的人是第几高的。思路可以从最右边开始做,比如n = 10, a[n]=2,说明左边比他高的有5人,那么b[n] = 8;a[n-1] = 4,说明左边比他高的有4人,b[n-1] = 5,因为8出现在了他的右边,不能算在里面,这样就显然是二分+树状数组,因为线断树TLE了。/****************

2016-08-02 22:48:39 346

空空如也

空空如也

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

TA关注的人

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