自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

On the way

blog

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

原创 HDU - 1007 - Quoit Design (分治解平面最近点对)

HDU - 1007 - Quoit DesignHDU1007 查找平面最近点对 - Sun1956 - CSDN博客这个博客讲的不错。。不过画图发现并不需要取 66 个相邻的点, 44 个就行。 分析一下复杂度。。类似线段树,solve 运行了 O(n)O(n) 次,均摊每次运行处理的点的数量应该是 O(logn)O(logn) 个,排序的常数很小,因此总复杂度大概是 O(nlogn)O(nl

2017-08-30 16:03:21 334 1

原创 HDU - 5840 - This world need more Zhu(树链剖分)

HDU - 5840 - This world need more Zhu将询问分为 kk 大和 kk 小的两部分。假设k≤Bk \leq B 的部分为 kk 小。 对于 kk 大的情况,我们考虑直接暴力。把每一条边分成向上和向下的两条边: 对于向上的边,开始点 (d[x]−d[u]+1)%k==0(d[x]-d[u]+1) \% k==0 。故 d[x]=d[u]−k+1d[x]=d[u]-k

2017-08-30 15:05:14 719 1

原创 Codeforces Round #430 (Div. 2) 题解

Codeforces Round #430 (Div. 2) A: 水#include<bits/stdc++.h>using namespace std;typedef long long ll;int main(){ int l,r,x,y,k; cin >> l >> r >> x >> y >> k; bool ok=false; for(int

2017-08-30 14:26:32 586 2

原创 Codeforces - 842D - Vitya and Strange Lesson(Trie)

Codeforces - 842D - Vitya and Strange Lesson题意可以很轻松的转化为:每个询问给定一个整数 qq, 求满足 q⊕kq \oplus k 在数组中存在的最小的 kk 。 可以先将数组中的所有元素放入01Trie 中,每次询问,对于 qq 的某一位 bb 来说,Trie 的 bb 方向是左子树,如果左子树不满,访问左子树,否则访问右子树。最后得到的就是最小的

2017-08-30 14:21:44 747 1

原创 HDU - 4008 - Parent and son (树形dp)

HDU - 4008 - Parent and son题意是给出一棵无根树,对于每个询问 (x,y)(x,y) ,输出以 xx 为根的树中, yy 的最小儿子编号和最小后代编号。 我们可以先以 11 为根处理出每个结点的最小/次小儿子编号和最小/次小后代编号。 对于一个询问 (x,y)(x,y) 。如果 yy 的子树大小为 00 ,则没有答案。如果 xx 不是 yy 的子树结点,答案就是原答案。

2017-08-29 15:43:53 485

原创 HDU - 2196 - Computer(树形dp求某点到其他点的最长路)

HDU - 2196 - Computer第一次 dfs 求出每个点到其子树叶子的最长路和次长路 第二次 dfs 求出每个点向上走的最长路#include<bits/stdc++.h>using namespace std;const int N=1e4+7;struct Edge{ int v,d;};vector<Edge> adj[N];int mx[N],se[N],

2017-08-29 14:17:56 336

原创 BZOJ - 3674 - 可持久化并查集加强版

BZOJ - 3674 考虑用可持久化线段树维护 fafa 和 deepdeep 数组。并且按秩合并。 这样复杂度就是 O(nlog2n)O(nlog^2n) 了。代码里没对 deepdeep 数组持久化。。。不过好像没什么影响。#include<bits/stdc++.h>using namespace std;const int N=2e5+7;int fa[N*25],ls[N*25

2017-08-29 00:32:13 321

原创 NOI - 2016 - 区间(双指针+线段树)

NOI - 2016 - 区间首先离散化,然后对所有区间按照区间长度排序。然后用双指针。双指针保持 [l,r][l,r] 这段的所有区间叠加后存在叠加次数为 mm 的点。然后 ansans 等于每一次合法时的最小值。这样显然是对的。因为一个合法的答案一定在某次双指针区间内计数。#include<bits/stdc++.h>#define lson (rt<<1)#define rson (rt<

2017-08-28 22:57:44 460

原创 HDU - 4747 - Mex(线段树)

HDU - 4747 - Mex用线段树维护 mex(l,1),mex(l,2),...mex(l,n)mex(l,1),mex(l,2),...mex(l,n) 。 一开始可以预处理出 l=1l=1 的情况 。 然后删去 a[1]a[1] ,由于 mexmex 是递增的,因此只需要修改线段树上第一个比 a[1]a[1] 大的值到下一个为 11 的值这段区间改为 a[1]a[1] 即可。 算法

2017-08-28 21:32:42 287

原创 HDU - 5381 - The sum of gcd(莫队算法)

HDU - 5381 - The sum of gcd 左端点相同的区间最多有 log(max(ai))log(max(a_i)) 个 gcdgcd ,且随着右端点的变大而变小。右端点相同的区间同理。 于是考虑 O(nlogn)O(nlogn) 预处理出来。 然后用莫队维护区间 gcdgcd 和就行了。#include<bits/stdc++.h>#define fi first#defi

2017-08-27 23:01:06 423

原创 NOIP - 2016 - 天天爱跑步(dfs计数)

NOIP - 2016 - 天天爱跑步把每一条边分成向上的边和向下的边。对于向上的边:如果 d[s]−d[x]=w[x]d[s]-d[x]=w[x] ,且 ss 在 xx 的子树中,且 ss 开始的路径经过 xx ,那么 ss 会被 xx 观察到。计数这一部分可以用 dfs ,当回溯到 ss 路径的 lcalca 时,把这部分的贡献消除掉就行了。对于向下的边:如果 d[t]−d[x]=len−w[x

2017-08-27 12:04:13 558

原创 Codeforces - 794F - Leha and security system(线段树)

Codeforces - 794F - Leha and security system• 给n个数,两种操作 • 1. 将[l, r]上所有数中数位为x的都改为y • 2. 求[l, r]上所有数的和我们可以对每一个0~9每一个数位用线段树维护它的和(如 9791997919 中数位9的和是 1010110101 ) ,求答案的时候就是∑数位×数位的和\sum 数位 \times 数位的和 。

2017-08-26 16:53:19 412

原创 Codeforces - Gym - 101161 - E - Tax (主席树)

链接:Codeforces - Gym - 101161 - E - Tax • 给定一棵带权树,每次询问一个路径上所有边权的中位数 • 1 ≤ n ≤ 5* 1e4 • 1 ≤ n ≤ 1e5这道题可以转化为查询树上一条链的第 kk 小。 考虑建主席树,类似求深度的方法建。 然后根据LCA求链上第 kk 小即可。#include<bits/stdc++.h>using namespac

2017-08-25 21:05:32 318

原创 BZOJ - 1568 - Blue Mary开公司(线段树标记永久化)

BZOJ - 1568 - Blue Mary开公司题意是给定若干条直线,然后有若干个询问,每个询问求该坐标所有直线的最大值。 标记永久化的思想就是当且仅当要更新的值优于该区间的所有值时才更新,否则下放。单点询问时取叶子结点到根的最值。 这题更新直线有3种情况: 1. 完全优于,直接更新就行了,O(1)O(1) 2. 部分优于,仅左/右半边需要一直递归,另一个不递归或变成1情况,O(logn

2017-08-25 19:15:02 318

原创 ONTAK - 2010 - aut (线段树合并)

ONTAK - 2010 - aut 给一棵 nn 个点的树以及 mm 条额外的双向边 qq 次询问,统计满足以下条件的 uu 到 vv 的路径数量: 恰经过一条额外的边 不经过树上 uu 到 vv 的路径上的边对于一个询问 (u,v)(u,v) ,答案就是两个端点分别在 uu 的子树和 vv 的子树中的边。因为是子树,所以在dfs序上。考虑用线段树维护边在每个点的子树中的另一个端点的位

2017-08-24 22:18:34 386

原创 HDU - 6161 - Big binary tree

HDU - 6161 - Big binary tree通过一个点的最大权值的链可以通过维护每个点到叶子的最大权值得到,方法就是一直把这个点向上提。 因此考虑维护每个点到叶子的最大权值 ff 。 如果 uu 的子树没有发生过修改:因为是一棵完全二叉树,所以一直往左走的深度-一直往右走的深度≥1。如果深度相同,肯定一直往左走,如果大1: 往左走:an=x2na_n=x2^n,Sn=x(2n−1)

2017-08-23 21:16:25 363

原创 HDU - 6133 - Army Formations(线段树合并)

HDU - 6133 - Army Formations考虑对每个结点维护一棵只含一条链的线段树,在dfs的过程中对线段树进行合并。 线段树的每个结点维护答案ans,区间元素和sum和数字个数sz。 线段树合并时: 如果是叶子结点,就是有sz[rt]个sum[rt]/sz[rt]。是个等比数列,所以ans[rt]=sum[rt]*(sz[rt]+1)/2。 如果不是叶子结点。先合并他的左右儿

2017-08-23 19:28:19 338

原创 POI - 18 - Tree Rotation (线段树合并)

POI-18-Tree Rotation第一道线段树合并题。这题的题意是问给定一棵树,其中有 n≤106n \leq 10^6 个叶子节点,允许任意次交换某个结点的左右子树。在所有交换结束后,其先序遍历序列的逆序对数的最大值。对于一棵以 uu 为根节点的子树,它的逆序对数仅由以下三种情况得以产生:左子树内部右子树内部一个点在左子树,一个点在右子树因此可以递归地来做。首先对于每个叶子结点建立一

2017-08-23 16:23:31 818

原创 Codeforces - 839E - Mother of Dragons(状压解最大团问题)

Codeforces - 839E - Mother of Dragons首先猜一个结论(不会证),应该均分在最大团上,然后求解最大团。 一个最大团的任意子图都是一个完全图。因此我们可以把所有点分成两部分,第一部分直接状压枚举,如果所有点的邻接点都是其他的点,那么这部分构成最大团。 然后枚举另一部分,如果另一部分也是个完全图则求出他们邻接点的交集,这个交集再并上这一部分就是候选的最大团了。复杂度

2017-08-20 21:57:18 1672

原创 线性筛求欧拉函数

线性复杂度的原因是因为它保证了每个合数只会被筛到一次。 每个合数都可以表示成一个数与另一个质数的乘积。 当 if(i%p[j]==0) 时 break 是因为大于p[j]p[j] 的那些素数 xx 产生的乘积 i∗xi*x 并不需要由ii来筛得,而可以由 i∗xi*x 的某个更大的合数因子来筛得,因为 ii 至少有一个比 xx 小的素数因子。void init(){ int c=0;

2017-08-20 16:58:40 593

原创 HDU - 1542 - Atlantis (线段树扫描线求矩形并)

题目连接: HDU - 1542 - Atlantis大佬博客讲解通过观察可以发现,以y轴为扫描线从下往上扫,若一个区间下边数量大于上边,则扫描的过程中这部分肯定算面积的,因此用线段树维护这样的区间就行了。#include<bits/stdc++.h>using namespace std;typedef double ld;const int N=207;int n,m;struct L

2017-08-11 16:59:24 230

原创 HDU - 5863 - cjj's string game (递推)

题目连接: HDU - 5863 - cjj’s string game设 SS 为到当前长度时,所有出现过长度为 mm 的子串,之后字母都相异的情况数量之和。dp1[i]dp_1[i] 为相同后缀长度为 ii 且之前从未出现过长度为 mm 的子串情况数量。dp2[i]dp_2[i] 为相同后缀长度为 ii 且之前出现过长度为 mm 的字符串的数量。进行计数转移就行。#include<bits/st

2017-08-05 21:53:02 296 1

原创 HDU - 6070 - Dirt Ratio(二分+线段树)

题目链接:HDU - 6070 - Dirt Ratio要求存在一个区间使得 size(l,r)r−l+1≤ans\frac{size(l,r)}{r-l+1} \leq ans 。整理得 size(l,r)+l∗ans≤ans(r+1)size(l,r)+l*ans \leq ans(r+1) 。左边一项只与 ll 有关,另一项可以通过 rr 的移动进行区间 +1+1 维护。因此二分 ansans

2017-08-03 21:57:58 123

空空如也

空空如也

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

TA关注的人

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