自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

morejarphone~

从爱好,到梦想

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

原创 codeforces 785E (树状数组套平衡树)

题目链接:点击这里题意:动态逆序对问题。一个[1,2,3…n][1,2,3\dots n]的数组,每次操作是交换两个元素,输出交换后的逆序对数。需要计算的是交换的两个数,在它们中间的数中分别有多少数比他们大(小)。利用树状数组的思想,把下标为i的树用第i,i+lowbit(i),i+lowbit(i)+lowbit(i+lowbit(i))...i,i+lowbit(i),i+lowbit(i)+l

2017-03-20 15:25:51 1038

原创 codeforces 645F (莫比乌斯反演)

题目链接:点击这里题意:给出初始n个数,问每次增加一个数字后的k元组的gcd之和.只需要求出gcd分别等于1-1e6的k元组数. 设F[x]F[x]表示gcd等于x的倍数的k元组数量,f[x]f[x]表示gcd等于x的k元组数量,那么就有: ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪f[1]=μ(1)F[1]+μ(2)F[2]+μ(3)F[3]+⋯+μ[n]F[n]f[2]=μ(1)F[2]+μ(2)F[4]+μ

2016-12-04 20:56:30 769

原创 codeforces 731D (DP 二分 二维RMQ)

题目链接:点击这里题意:给出一个01矩阵,每次询问一个矩形中的最大全1正方形的边长。用dp[i][j]dp[i][j]存储以(i,j)(i,j)为右下角的最大全1正方形,转移方程就是dp[i][j]={min{dp[i−1][j],dp[i][j−1],dp[i−1][j−1]}+10(val[i][j]=1)(val[i][j]=0)dp[i][j]=\left\{\begin{aligned

2016-12-02 15:03:57 452

原创 codeforces 650D (树状数组)

题目链接:点击这里题意:动态LIS,改变一个值求LIS。先把询问离线下来按照改变的位置排序,把所有的数字离散化。首先先用树状数组求出每一位为结尾的最长上升前缀f[i]和每一位开始的最长上升后缀g[i],然后考虑每一个数字改变后的LIS情况,分成两种讨论:LIS不包含这个数。这种情况比较简单,考虑是不是每一个LIS都含有这个数字即可,也即对于所有的LIS,某一位必须是这个数。所以直接统计每一个数字在

2016-12-02 00:03:51 488

原创 codeforces 508E (构造)

题目链接:点击这里题意:依次给出从左到右每一个左括号到与其匹配的右括号的距离范围,求出一个合法的括号序列。注意到如果一个括号他的右括号已经可以放了那么就可以直接放上去。那么直接先把左括号扔进一个栈,并且记录下所有栈中的左括号在没找到与之匹配的右括号之前中间长度增加了多少。扫一边就好了。#include <cstdio>#include <iostream>#include <cstring>#

2016-12-01 16:52:06 361

原创 codeforces 508D (无向图欧拉路径)

题目链接:点击这里题意:给出n个单词(长度为3),求出一种头尾相连的方案。两个单词能连起来当且仅当前一个单词的后两位和后一个单词的前两位相同。直接把每个单词看成边,前两位和后两位看成点,跑欧拉路径即可。需要一些优化把欧拉路径改成线性。#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <

2016-12-01 16:46:02 559

原创 POJ 2337 (有向图欧拉通路)

题目链接:点击这里题意:给出n个单词,求出最小字典序的头尾连接方案。欧拉通路板子题。把每个单词当做边,头字母和尾字母当做节点,建完跑欧拉通路即可。#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <cmath>#include <algorithm>#include <stack>

2016-11-30 23:50:02 323

原创 ACdream 1211 (无源汇上下界网络流)

题目链接:点击这里题意:给出一个无源汇有上下界网络流,求出一种可行流。板子题,建立超级远点S,超级汇点T,对于每一条边<u,v,l,r><u,v,l,r>,u-T连边,流量为l;S-v连边,流量为l;u-v连边,流量为r-l。然后跑最大流输出即可。#include <cstdio>#include <iostream>#include <cstring>#include <queue>#in

2016-11-29 23:49:30 312

原创 HDU 5992 (kdtree)

题目链接:点击这里题意:给出n个酒店,每个酒店有一个花费和坐标。然后给出m个询问,输出离询问最近并且花费在询问要求内的酒店。第一个想法是两种东西按照花费排序,每次插入新酒店。但是这个插入比较麻烦,在kdtree退化的时候需要及时重构(套个替罪羊树啥的)。 还有一种就是直接建三维kdtree,然后对于每一个询问,如果一个节点范围内最小第三维比询问大,那么可以直接忽略。计算的时候只要算上两维的距离即可

2016-11-22 00:21:43 1859 1

原创 BZOJ 3053 (kdtree)

题目链接:点击这里k维坐标系下的最近点对问题。直接对于每一个询问都在kdtree中询问m次最近点,每次找到一个最近点对需要把它记录下来,当下次再找到它的时候距离直接设置成无穷大即可。#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <cmath>#include <algorithm

2016-11-19 22:49:07 434

原创 HDU 2966 (kdtree板子题)

题目链接:点击这里题意:给出n个不同的点,求出离每个点欧几里得距离平方最近的其他点。只需要一点小技巧即可:当当前kdtree节点坐标和询问坐标一致时,距离改成无穷大(因为不能选择自己)。#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <cmath>#include <algorit

2016-11-19 15:08:14 1143

原创 BZOJ 2648 (kdtree)

题目链接:点击这里题意:给出n个点,接下来m个操作,每次插入一个点,或者询问离询问点的最近曼哈顿距离。直接暴力插点询问即可。#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <cmath>#include <algorithm>#include <stack>#define Cl

2016-11-19 15:05:31 517

原创 Kattis taboo (AC自动机 拓扑排序 DP)

题目链接:点击这里题意:给出n个01串,要构造一个最长的串使得这个串不包含所有出现过的串,无解输出-1.首先把所有的点扔进自动机,因为出现过的串不能在我们构造的串中出现,所以事先把某些”坏点”标记,坏点指的就是每个串的结束节点以及沿着结束节点fail指针走下去的节点. 如果剩下的图中能够沿着根走出一个环那么必然就无解了, 判环可以用一遍拓扑确定. 排除无解情况剩下就是一个DAG了, 用dp[i][j

2016-11-17 20:18:26 983

原创 Kattis peaktram (树状数组 DP)

题目链接:点击这里题意:给出n个物体的高度以及将他们高度改变1单位的花费,一个观测点从最左端从0往上走,一直平视. 问至少能观测到k个物体的最小花费.因为高度比较大,所以需要将高度离散化,那么需要离散化哪些高度呢?容易发现对于每一个建筑,只要把它+-70范围内的高度离散化就好了,这样最多就是70*140种高度.然后用dp[i][j][k]dp[i][j][k]表示到i物体,最大高度是j,一共看到k个

2016-11-17 20:06:08 635 2

原创 codeforces 734F (数学)

题目链接:点击这里题意:给出两个数组b,c,构造a数组满足条件.首先需要知道一个推论:a AND b+a OR b=a+ba\ AND\ b+a\ OR \ b=a+b,这个按位比较很显然是相等的. 然后把原式的bib_i和cic_i加起来就得到了: ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪b.1+c1=na1+∑ab2+c2=na2+∑a⋮bn+cn=nan+∑a\begin{equation}

2016-11-17 09:42:47 595

原创 codeforces 734E (树的最大直径)

题目链接:点击这里题意:给出一个树,每个节点有一种颜色.每次能够选中一个节点,其他的点如果到它的路径上都是这种颜色那么可以一起改变颜色.问最少需要改变几次颜色.先按照颜色缩点, 然后答案就是缩点之后树的最大直径, 直接DP即可.#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <cma

2016-11-17 09:33:39 630

原创 BZOJ 3876 (流量有下界费用流)

题目链接:点击这里需要经过题目给出的边至少一次,也就是流量下界是1.另外有一类边:所有的点连向1,流量是无穷大费用是0. 对于有流量下界的点,就是经典的构造方法:对于#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <cmath>#include <algorithm>#inclu

2016-11-16 00:07:58 307

原创 HDU 5517 (二维树状数组)

题目链接:点击这里题意:给出一个pair(a,b)集合A,triple(c,d,e)集合B,然后如果b和e相等可以把新的triple(a,c,d)扔到集合C.求C中的(a,b,c)个数使得C中不存在(u,v,e)满足{(a,b,c)≠(u,v,e),a≤u,b≤v,c≤e}\left\{ (a,b,c)\neq (u,v,e) ,a \leq u,b \leq v, c \leq e \right

2016-11-09 15:30:27 304

原创 HDU 2888 (二维RMQ)

题目链接:点击这里题意:给出一个矩阵,每次询问一个子矩阵中的最大元素,以及最大元素是不是和子矩阵的某个角相等.二维RMQ的板子~#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <cmath>#include <algorithm>#define Clear(x,y) memset

2016-11-08 18:07:15 295

原创 POJ 3621 (最优比率环 二分+SPFA)

题目链接:点击这里题意:找出一个环, 最大化∑vi∑Ei\frac{\sum v_i}{\sum E_i}.假设答案是ans.那么有∑vi∑Ei=ans\frac{\sum v_i}{\sum E_i}=ans也就是∑vi−ans∑Ei=0\sum v_i-ans\sum E_i=0.因为是一个环,所以环上每个点都被算了两次,所以可以给每条边对应一个FiF_i表示边上两个节点权值和的一半,所以所求就

2016-11-08 15:32:59 411

原创 codeforces 519E (LCA)

题目链接:点击这里题意:给出一个树,q个询问,每次询问给出两个点#include <bits/stdc++.h>#define Clear(x,y) memset (x,y,sizeof(x))#define FOR(a,b,c) for (int a = b; a <= c; a++)#define REP(a,b,c) for (int a = b; a >= c; a--)#defin

2016-11-07 20:56:06 503

原创 HDU 4155 (博弈 记忆化搜索)

题目链接:点击这里题意:有1,2,3,4,5,6各四张牌,AB轮流出牌,谁先使得总和超过31就输.告诉你已经出牌的序列,求最优策略下谁赢.经典的博弈题了.先把游戏结束的状态挖出来,然后记忆化搜索一遍即可.#include <bits/stdc++.h>#define Clear(x,y) memset (x,y,sizeof(x))#define FOR(a,b,c) for (int a =

2016-11-07 15:30:28 412

原创 HDU 5970 (循环节)

题目链接:点击这里打个表可以发现对于给定的j,f(i,j)的循环节长度为j。有了这个性质以后可以处理不向下取整的。题目需要向下取整,谕示考虑f(i,j)的含义,它表示辗转相除次数c和gcd(i,j)的平方的乘积。因为(i+kj, j)和(i,j)的辗转次数相等,所以考虑延长循环节,把cj看成是循环节,这样的话就只需要求出循环节内部分,并且重复循环节就行了。在两个循环节之间是等差数列,瞎搞搞就出来了。

2016-11-06 18:36:54 982

原创 HDU 5964 (平面几何)

题目链接:点击这里 trick:卡常熟卡的蛋疼~~#include <bits/stdc++.h>#define Clear(x,y) memset (x,y,sizeof(x))#define FOR(a,b,c) for (int a = b; a <= c; a++)#define REP(a,b,c) for (int a = b; a >= c; a--)#define fi f

2016-11-06 18:05:31 972

原创 HDU 5963 (博弈)

题目链接:点击这里一个情况下的状态只和连接根的1的边数量有关。直接树上维护边。#include <bits/stdc++.h>using namespace std;#define maxn 40005long long n, m;struct node { int v, next, w;}edge[maxn<<1];int head[maxn], cnt;int scan ()

2016-11-06 16:25:41 317

原创 HDU 5961 (bitset)

题目链接:点击这里题意:给出两个图,他们的并是竞赛图。判断这两图是不是同时是传递的。直接忽略竞赛图的性质暴力bitset。#include <bits/stdc++.h>#define Clear(x,y) memset (x,y,sizeof(x))#define FOR(a,b,c) for (int a = b; a <= c; a++)#define REP(a,b,c) for (i

2016-11-06 16:14:45 752

原创 codeforces 733F (树链剖分 RMQ)

题目链接:点击这里题意:给出一个图,每条边有权值和花费c,每次花费c能使的权值-1。给出一个预算,求减完权值后的一个最小生成树。观察到最优的策略必然是只减少一条边的权值。于是首先先将初始权值做一次最小生成树。然后枚举所有的边,如果这条边是生成树的边,求出预算都花在这条边上的结果;如果非树边,就在这条边两个点到他们的LCA路径上求出树边的最大值,然后求出扣掉这个最大树边,加进去这条边的最终结果。中间过

2016-11-03 21:33:10 928

原创 codeforces 733E (数学)

题目链接:点击这里题意:n个台阶,每个台阶上有上或者下,每经过一次都会改变方向。求从每个台阶出发,从最下方或者最上方走出去的步数对于每一个开始的台阶,只有他下方的U和他上方的D会影响最后的步数。如果要从下方出去就需要把下面都变成D,同样的,要从上面出去就要把上面都变成U。观察一下发现交换初始台阶上下方的D和U的步数花费就是两者距离的一半,最后加上开始台阶从下方或者上方走出的步数。 trick:结果

2016-11-03 21:24:42 535

原创 codeforces 733D (水题)

题目链接:点击这里题意:给出n个长方体,两个长方体如果有一个面完全一样就能拼起来,或者只选择一个。求一个最佳的方案使得内接球直径最大。直接暴力把所有的面扔进一个数组,排序之后找到第三条边最大的,维护一下最大值就好了。#include <cmath>#include <iostream>#include <cstring>#include <algorithm>#include <vector

2016-11-03 21:13:16 330

原创 HDU 5923 (并查集)

题目链接:点击这里题意:给出一个树,每一个节点对应另一个图的一条边。每次询问给出一个集合,将集合中所有点以及这些点的所有祖先对应的边在图上添上(原本图上没有边),求此时的联通分量数。图上的点比较少,暗示着能够暴力处理。直接按照dfs顺序,记录下树上每一个点到根这些边加在图上时的并查集状态。然后询问的时候直接把所有并查集状态合并。#include <cstdio>#include <cmath>#

2016-10-30 22:50:42 252

原创 HDU 1125 (DP)

题目链接:点击这里题意:给出一个数每个数位数字的和,每个数位数字的平方和,求出符合条件的最小数字。这个数字的数位不能超过100位。乍一看像构造,其实存在最有策略。可以用dp[i][j]表示数位和为i,数位平方和为j的最短数字长度,这样就可以dp[i][j]=min{dp[i][j],dp[i−bit][j−bit∗bit]}dp[i][j]=min\left\{dp[i][j], dp[i-bit]

2016-10-27 20:58:51 320

原创 HDU 3292 (佩尔方程 矩阵快速幂)

题目链接:点击这里题意:求解佩尔方程x2−ny2=1x^2-ny^2=1的第k大解。首先暴力求出佩尔方程的最小特解,然后根据迭代式子 [xkyk]=[x1y1d×y1x1]k−1[x1y1]\begin{bmatrix} x_k \\y_k\\\end{bmatrix} =\begin{bmatrix}x_1 & d\times y_1\\y_1 & x_1 \\\end{bmatri

2016-10-27 14:55:32 313

原创 POJ 3304 (计算几何)

题目链接:点击这里题意:给出n个线段,能否找到一个直线使得所有线段在直线上的投影至少有一个交点。可以转化为找到与n个线段都相交的直线,那么所有的直线就是与这条垂直的直线。所以直接枚举任意两个直线的任意两个端点。 trick:当两个点的距离小于精度时认为他们是同一个点直接跳过。#include <cstdio>#include <cmath>#include <algorithm>#inclu

2016-10-27 00:21:19 373

原创 HDU 4604 (树状数组)

题目链接:点击这里题意:给出一个序列,从头到尾依次扔进一个双端队列或者直接不要,双端队列可以在任意时刻从头或者尾弹出元素。最大化最后的双端队列size。求出每个下标开头的最长递增序列和最长递减序列,然后扫一遍用树状数组维护即可。#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <ve

2016-10-26 21:09:30 210

原创 HDU 4605 (主席树)

题目链接:点击这里题意:有一棵树二叉,每个节点有一个数字。每次询问一个节点和一个数字,问这个数字经过这个节点的概率。一个数字从根开始往下走,如果走过的节点数字和他相同,就停在这里;如果节点数字比他大,向左向右的概率都是1/2;否则向左的概率是1/8,向右的概率是7/8。对于每个询问,需要统计他到根节点路径之间的信息。所以从根开始开主席数,线段数记录走向左儿子的某个数字的个数和走向右儿子的某个数字的个

2016-10-26 18:52:12 354

原创 HDU 1724 (simpson积分)

题目链接:点击这里题意:给出一个椭圆和[l,r],求椭圆横坐标在这个范围内的面积。根据椭圆公式可知y=b2−b2∗x2a2−−−−−−−−√y=\sqrt{ b^2-\frac{b^2*x^2}{a^2}},所以直接利用面积积分公式S=2∫rlydxS=2\int_{l}^{r}yd_x,套simpson积分即可。#include <bits/stdc++.h>using namespace st

2016-10-26 13:40:36 371

原创 CSU 1806 (simpson积分 最短路)

题目链接:点击这里题意:n个点m条有向边的图,每条边的花费是ci∗t+bic_i*t+b_i,设f(t)f(t)表示给定t的时候1-n的最小花费,求因为对于给定的t,f(t)f(t)就是1-n的花费最短路。所以直接套simpson积分,积分函数的结果就是当前t时的最短路。#include <bits/stdc++.h>using namespace std;const double eps =

2016-10-26 13:35:01 555

原创 codeforces 730J (01背包)

题目链接:点击这里题意:给出n个杯子的容量和杯内水的体积,问最少多少个杯子能够装下所有的水,以及在这个杯子数量下最少需要倒多少体积。需要的最少杯子数很好求,按照体积排个序扫一遍就能知道。然后选择某些杯子,倒水总体积就是水的总体积减去这些选中杯内的水。所以我们要在选中杯子的总容积大于等于水的总体积的前提下最大化选中的杯子中的水的总体积。考虑用dp[i][j]表示选择了i个杯子,一共j体积的水能够获得的

2016-10-25 20:28:37 1183

原创 codeforces 730I (费用流)

题目链接:点击这里题意:给出n个人每个人有一定的代码能力和运动能力,现在要求将n个人分成两堆,p个人写代码,q个人运动,最大化写代码人的代码能力总和和运动人的运动能力总和。很显然的费用流。源点到每个人流量为1,费用为0;每个人到p流量为1费用为代码值×-1;每个人到q流量为1费用为运动值×-1;p到汇点流量为p费用为0;q到汇点流量为q费用为0.这样跑一次最小费用最大流,费用负一下就是最大化的值。#

2016-10-25 20:16:39 620

原创 codeforces 730E (数学)

题目链接:点击这里题意:给出一个封榜时的榜单,按照封榜时的分数排序,每个队伍在封榜后分数会改变,名次也会对应的变化t名。现在要求一个揭晓的顺序最大化∑t\sum t。对于两个队伍i,j,考虑揭晓他们的相对顺序。如果这两个队在揭晓前和揭晓后相对排名不同,那么说明无论先揭晓哪个队伍,最后对答案的贡献总是1(画个图很容易看出来)。如果两个队揭晓前后相对排名不变,就分两种情况考虑: 1. 无论先后揭晓顺

2016-10-25 20:09:46 608

空空如也

空空如也

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

TA关注的人

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