自定义博客皮肤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~

从爱好,到梦想

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

原创 HDU 5923 (并查集)

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

2016-10-30 22:50:42 263

原创 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 331

原创 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 340

原创 POJ 3304 (计算几何)

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

2016-10-27 00:21:19 382

原创 HDU 4604 (树状数组)

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

2016-10-26 21:09:30 228

原创 HDU 4605 (主席树)

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

2016-10-26 18:52:12 370

原创 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 383

原创 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 571

原创 codeforces 730J (01背包)

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

2016-10-25 20:28:37 1199

原创 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 640

原创 codeforces 730E (数学)

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

2016-10-25 20:09:46 619

原创 codeforces 730C (二分)

题目链接:点击这里题意:给出n个点m条边的图,有w个工厂,已知每个工厂的挖掘机数和挖掘机单价。给出q个询问,每次询问要在某一个点获得j个挖掘机并且花费不超过a的最少时间。经过一条边的时间花费是1.如果不考虑时间因素,那么直接按照单价排序从前往后买挖掘机即可。考虑到时间有二分性质,直接二分时间。首先对询问的点做一遍bfs获得其他点到它的时间,然后二分时间,每次check时从前往后将时间内的挖掘机都买进

2016-10-25 19:46:12 672

原创 codeforces 546E (最大流)

题目链接:点击这里题意:第ii个点本身有aia_i个士兵,最后要使得第ii个点有bib_i个士兵。给出一个图,士兵只能在图上不超过一次边的范围内转移。问能不能达到目标状态。显然的网络流了。给每个点拆成出点和入点。S到所有的入点,流量是aia_i;所有的出点到T流量是bib_i;所有的入点到范围1以内的出点流量是INF;入点到出点流量是INF。开心的跑一次最大流判断是不是慢流即可。方案数在残留网络通过

2016-10-21 12:08:18 366

原创 codeforces 546D (数学 水)

题目链接:点击这里题意:给出一个数字,每次用他除以一个因子。问最多可以除几次。一个数字要能够除最多的数显然每次都除以一个素因子。所以直接一边线性筛找出每一个数的最小质因子,然后像DP一遍统计每素因子数的前缀和就行了。#include <bits/stdc++.h>using namespace std;#define maxn 5000005bool vis[maxn];int prime[m

2016-10-21 11:58:28 318

原创 codeforces 546C (队列)

题目链接:点击这里题意:给出两堆数,每次两人都取堆顶的数字比大小,大的人得到这两个数,并把对方的数先放到自己的堆底,再把自己的数放到自己的堆底。最后没有数字的人输,求出结束的步数以及赢家。因为数字最多只有10个,所以大概不同的状态有400W次。直接用双端队列模拟400W次看有没有结束即可。#include <bits/stdc++.h>using namespace std;#define ma

2016-10-21 11:53:53 449

原创 codeforces 512C (最大流)

题目链接:点击这里题意:安排n个人在圆桌吃饭,每个人有一个值,任意相邻的两个人的值的和必须为质数,一张桌子至少坐3个人。然后求出任意的方案。每个数都大于2,要让相邻两个的和为质数,必须是一奇一偶。所以只需要每一个奇数左右两个偶数不相同就可以使得一张桌子至少3个人(3个人的桌子是不可能的,至少是4个人)。所以直接按照二分图建模,S到每一个奇数,流量为2,表示每个奇数相邻两个偶数;奇数到和他相加为质数的

2016-10-20 21:42:22 537

原创 codeforces 512B (map DP)

题目链接:点击这里题意:给出一堆数字,每个数字有一个花费和长度,表示花费多少钱就可以走这样的长度。初始在坐标原点,问能够走到所有的坐标的最少花费。考虑取两个数,那么能够走到所有的点是两者gcd的倍数。所以只需要选择花费最少的数使得这些数的gcd=1。由于gcd数字比较大但是最多不会超过nlgn,所以直接用map记录每一种gcd的下标然后DP即可。#include <bits/stdc++.h>us

2016-10-20 21:33:06 382

原创 codeforces 512A (拓扑排序)

题目链接:点击这里题意:给出n个字符串,问有没有一种字符的替换方案使得所有的字符串按照字典序递增排列。只要使得任意连续的两个有序即可,如果字符a必须比字符b字典序小就建一条a到b的有向边,然后通过一边拓扑排序输出结果即可。#include <bits/stdc++.h>using namespace std;#define maxn 33int in[maxn];int g[maxn][max

2016-10-20 21:24:10 396

原创 codeforces 510B (dfs 水)

题目链接:点击这里题意:给出一个图,问能不能找到一个同样颜色的环路径。直接从没搜过的点搜,如果在搜的过程中搜到一个不是从父亲节点转移过来的已经搜过的节点,那么就说明存在一个环。#include <cstdio>#include <cmath>#include <algorithm>#include <iostream>#include <vector>#include <cstring>

2016-10-20 21:19:31 372

原创 codeforces 732F (桥)

题目链接:点击这里题意:给出一个无向图,定义有向图的瓶颈点是能到达的点数最少的点,瓶颈值就是瓶颈点最少的点数。现在要给每个边定一个方向最大化瓶颈值。显然如果是一个环,那么能够构造出一种最右情况:每个边按照环的顺序定义方向,这样每一个点都能到达其他的点。所以按照环缩点,容易发现最大值就是最大的联通分量(其他的联通分量都连向他)。所以就是找出所有的桥,每次dfs一个联通分量设置方向,最后联通分量直接bf

2016-10-18 21:01:27 721

原创 codeforces 732E (贪心)

题目链接:点击这里题意:给出n个电脑,m个电源,电脑有一个值aia_i,电源有一个值bib_i,电脑和电源能够配对当且仅当ai=bia_i=b_i。有无穷多个适配器,每对电源用一个适配器bib_i就减少一半(向上取整)。一个电源可以用很多次适配器。求最多配对多少电脑和电源,以及在最多配对下用的最少的适配器。还要输出方案。将电源按照从小到大依次尝试和电脑配对,如果能够配对成功就配对。可以反证,假设按照

2016-10-18 20:55:53 616

原创 codeforces 732D (二分 贪心)

题目链接:点击这里题意:给出n天,以及每天能考的科目,给出每个科目需要备考的天数。每一天可以选择备考某一门科目或者考试通过某一门科目(备考天数足够)。求通过所有科目的最少天数。二分天数mid,然后对于前mid天贪心check。具体就是从mid往前扫,如果有没有考试过的科目就选择在这一天考,否则用来备考。 最后从前往后依次判断备考是否足够即可。#include <cstdio>#include <

2016-10-18 20:41:51 541

原创 codeforces 731F (暴力)

题目链接:点击这里题意:给出n个数字,可以选中一个数字,然后把其他的数都减成这个数字的倍数。求所有数字的和最大值。假设选中数字a,容易发现在区间[a∗k,a∗(k+1)−1][a*k,a*(k+1)-1]中的数字对答案的贡献是一样的。所以只需要维护一个统计数字的前缀和,每次暴力枚举选中的数字(注意不要重复枚举),然后暴力按照按照相同的区间网上跳即可。因为每次跳的步长等于a,容易证明复杂度是Max1+

2016-10-18 20:37:19 327

原创 codeforces 731E (优先队列 DP)

题目链接:点击这里题意:给出n个数字,A和B两个人依次选中1−k(k≥2)1-k(k \geq2),把他们合并之后自己分数加上这些数的和。求两个人在最右策略下A最多领先B多少。当数字只剩下一个之后游戏马上结束。用dp[i][0/1]dp[i][0/1]表示前i个数字被合并,现在是A/B先手到最后游戏结束最多领先多少。故A要最大化后继状态的值,B要最小化后继状态的值,转移就很显然了: dp[i][0

2016-10-18 20:29:36 539

原创 codeforces 731D (水前缀)

题目链接:点击这里题意:给出n个串,一共有c中字母编号为1-c。然后描述每一个串。每一次可以使得所有串的所有字母编号+1(编号为c的变成1).问最少多少次吼能够使得所有的串按照字典序递增。考虑归并两堆字母,如果第一堆字母在[l1,r1][l_1,r_1]次数范围内有序,第二堆字母在[l2,r2][l_2,r_2]次数范围内有序,那么只需要考虑使得前一堆字母的尾和后一堆字母的头有序的范围,然后和前面两

2016-10-18 20:14:14 526

原创 codeforces 731C (并查集 水)

题目链接:点击这里题意:给出n只袜子的颜色,每天选择两只袜子,每次能把一只袜子染色。问最少染色几只袜子能使的每天的袜子颜色一样。给每天穿的两只袜子连边,很显然一个分量的袜子要一起考虑,并查集维护分量就好了。然后搜出最多的颜色,把分量的点都染成这个颜色即可。#include <cstdio>#include <cmath>#include <algorithm>#include <iostrea

2016-10-18 20:06:29 502

原创 HDU 5649 (二分 线段树)

题目链接:点击这里题意:给出一个排列,每次操作[l,r]区间的数原地升序或者降序,询问最后k下标的数。二分最后的结果mid,然后把比mid大的换成1,小于等于mid的换成0,那么升序降序相当于求出区间中0的个数然后把前半段和后半段分别用0\1覆盖。这样只需要维护一个区间查询,区间修改的线段树即可。#include <cstdio>#include <cmath>#include <algorit

2016-10-18 19:56:38 525

原创 codeforces 28C (概率DP)

题目链接:点击这里题意:m个房间n个人,每个人随机走进一个房间,每个房间排aia_i个队伍,走进这个房间的人平均排队,问最长的一个队伍的长度期望。用dp[i][j][k]dp[i][j][k]表示i个房间剩下j个人最长队伍是k的概率。转移的时候就枚举当前房间的人数,概率乘上所有剩下的人中选择这么多人并且他们都进这个房间的概率.期望就是∑ni=1dp[m][0][i]∗i\sum_{i=1}^{n}d

2016-10-15 21:45:54 583

原创 HDU 5915 (二分 主席树)

题目链接:点击这里题意:给出一个序列,每次询问一个区间[l,r][l,r],假设里面有kk个数字,求第⌈k/2⌉\lceil k/2 \rceil个出现的数字的下标.区间出现的不同数字的个数就是这个题,用主席树写好一套函数以后二分位置每次主席树上query来check一下就好了。#include <bits/stdc++.h>using namespace std;#define maxn 20

2016-10-15 12:30:24 618

原创 POJ 3597 (DP)

题目链接:点击这里题意:一个多边形剖分成三角形或者四边形的方案数。先定下一条边,然后枚举它所在的图形的最左边那条线和最右边那条线,这两条边和图形的交点再连边,相当于把图形分成三份。这样直接枚举最左边的线和最右边的线是n3n^3的复杂度。 考虑枚举右边那条边,这样先连同定下的那条边构成一个三角形,另一个顶点是和这个三角形去分左边的图案,所以记录下拿三角形分一个多边形的方案就可以做到n2n^2了。#i

2016-10-13 16:21:35 289

原创 POJ 3731 (组合数学)

题目链接:点击这里题意:给出一个n*m的图,起点在(0,0)(0,0),终点在(x,y)(x,y),只能往前走或者右拐并且不能经过重复的点。求到达终点的方案。考虑从左右上下四个方向到达终点。假设考虑从左走到达终点,那么已经存在的是一根横线和一根竖线,然后每次的路径上下左右的线都是相等的,所以处理出来上下左右最多能够提供几根线然后拿组合数乘一下就好了。 如下图: 1,2表示出发时的直线(从左边

2016-10-13 16:12:24 411

原创 hihocoder 1388 (中国剩余定理 NTT)

题目链接:点击这里题意:求min{∑n−10(Ai−B(i+k) mod n)2∥∥k=0,1…n−1}min \left\{ \sum_{0}^{n-1}(A_i-B_{(i+k) \space mod \space n})^2 \big\|k=0,1\dots n-1 \right\}.把A数组逆置过来倍增一倍的长度,显然结果就是卷积的某一项。结果比较比,所以NTT时取两个10910^9左右的模

2016-10-11 19:00:08 866

原创 HDU 5520 (费用流)

题目链接:点击这里参考自这里 题意:给出一个网格图,要把奇数和偶数连起来,然后所有剩下的空格子连城若干个环(两个点可以重复走构成一个环)。已知每一对格子之间连边的花费,求最小费用。把每一个格子拆成入点和出点,然后这样建模: 1. S到奇数入点建边,流量为1费用为0; 2. 偶数出点到T建边,流量为1费用为0; 3. S到空点入点建边,空点出点到T建边,流量为1费用为0; 4. 每一

2016-10-11 18:19:32 733

原创 UVALive 7264 (最小割)

题目链接:点击这里题意:给出n个技能,m个关系(学某个技能前必须先学会某一个技能)。可以直接通过氪金花费一定的钱学习一个技能(不需要考虑任何关系),可以花费一定的钱删掉某一种关系,以及正常学一个技能需要花费一定的钱。问学习目标技能最少花费多少。把每个点i拆成i个i+n: 1. S到i,流量为正常花费; 2. i到i+n,流量为氪金; 3. 每一个关系<u,v,w><u,v,w>,u+n到

2016-10-10 16:25:13 393

原创 HDU 5917 (图论)

题目链接:点击这里题意:给出一个图,求稳定子图的个数。稳定子图定义为包含三元环子图或者三个点独立集子图的图。直接特判3,4,5个点的子图。大于等于6个点的子图都符合。现场赛的时候读懂题目马上就觉得当子图的点很多的时候必然是稳定子图。然后枚举了一下所有的五元图,发现五个点以上就是稳定子图(然后智障的连五元环这个反例也没发现)。结果一直wa到死,就这样和金牌擦肩而过T.T。#include <cstdi

2016-10-06 21:23:56 769

原创 2016四川省赛H (组合数学)

题目链接:点击这里题意:给出一个树,每一个树边都有2∗ci2*c_i条,求从1出发回到1的欧拉回路个数。按照每一条边以及边之间的相对次序计算对答案的贡献。对于父亲节点u,他到某一个儿子节点的边数如果是cic_i,那么ans∗(2ci)!ans*(2c_i)!。然后所有的这些儿子节点的路径经历的相对次序又对答案产生一部分贡献,所以假设某个节点有nownow对出去的路径(包括通向他父亲的路径对数-1),

2016-10-06 20:44:53 485

原创 JAG2016 (凸包)

题目连接:点击这里题意:给出n个点,用一条x=ix=i将点分成≤i\leq i和>i>i,求两边凸包面积和的最小值。先把点按照x,y值排序,然后从左往右维护一个上凸壳和下凸壳的面积即可。因为有同一竖线上的多点情况,所以在计算某条竖线左侧的凸包面积的时候还要加上由竖线最上面的点,竖线最下面的点和最左边的起点构成的三角形的面积。从右往左维护也类似的维护凸壳面积。trick:用叉积计算面积的两倍来避免精度

2016-10-06 01:12:27 337

原创 Asia Hong Kong Online Preliminary A (FFT)

题目链接:点击这里题意:给出n个数字(∈[−50000,50000]\in[-50000, 50000]),求有多少(i,j,k)满足ai+aj=aka_i+a_j=a_k(要求i,j,k互不相同)。0比较麻烦直接拎出来记录个数,其他的加一个50000避免负数直接存起来。然后开一个数组记录每一个数字出现多少次,这个数组和自己做一次卷积即可。答案分成几部分: 1. i+j=k: 直接遍历扔掉0的

2016-10-05 16:15:52 1103

原创 HDU 5117 (DP)

题目链接:点击这里题意:n个灯,m个开关,一共有2m2^m种开关的状态,每一个开关可以将某些灯泡的状态异或。求出每一种开关状态下X3X^3的和,X表示开关状态下亮的灯泡假设一种开关状态下的灯泡状态是x1,x2,…xnx_1,x_2,\dots x_n,那么对答案的贡献就是(x1+x2+⋯+xn)3=∑ni=1∑nj=1∑nk=1(xi∗xj∗xk)(x_1+x_2+\dots +x_n)^3=\su

2016-10-01 00:40:03 343

空空如也

空空如也

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

TA关注的人

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