自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(178)
  • 收藏
  • 关注

原创 2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15)F

题意:给你F[1,i]和F[i,1] 接着有递推式F[i, j] = a ∗ F[i, j − 1] + b ∗ F[i − 1, j] + c.让你计算F[n,n]题解:这题F[1,i]的贡献很显然是,F(i,1)的贡献同理对于c的贡献我们每个点都计算很显然不好求我们可以做如下操作并且那么我们解得并且那么我们就可以得出以下式子然后打个表就可以O(n)计算每个点的贡献...

2019-05-03 08:05:10 523 1

原创 落谷P4728(最大二分匹配)

题解思路:我们把数组这些元素看成点然后两个点之间一条有向边的前提为i<j,a[i]<a[j],那么这样题目就变成了找两条路径把所有的点都盖上去那么就是有向图的最小路径覆盖问题,判断路径数是否小于2#include<bits/stdc++.h>using namespace std;const int mx = 2e3+5;const int inf = 0x3f...

2019-02-28 19:49:21 203

原创 洛谷P3322(思维题)

题解思路:因为可以看出互换顺序跟互换方法无关,所以我们找出一种方法答案就加上使用方法长度的阶乘。分析:最终要获得排列好的序列要么是以下两种形式或者1 2 3 ... 2^n2^(n-1)+1...2^n 1 2 .. 2^(n-1)然后往前推你会发现我们要得到能排列好的序列在第i次操作中必须能变出每段长度2^(i+1)序列都是连续递增的否则就不可能排列好那么我当有1段不满足...

2019-02-28 16:54:51 421

原创 zoj-4053(2018ICPC青岛网络赛K题)启发式分裂

题意:每次删除区间内的一个数导致这个区间不连续,让你求出连续区间的最大逆序对,因为这题是强制在线的,所以没办法莫队,而且卡常卡的比较斤也没办法分块,所以我们可以使用一个启发式分裂,每次分裂计算两段区间的逆序对然后插入一个multiset容器里面最后查询接着查询最大值,我每次选取比较小的一块区间计算我这个小区间有多少个逆序对,最后原本区间逆序对减去p对左区间和右区间的贡献加上比较小的区间和比较大的区...

2018-09-17 20:38:13 611

原创 hdu6430树上启发式合并

题解:因为这题我们只查询不做修改,那么在树上做启发式合并就会很方便并且时间复杂度做到查询万每课子树最后的时间复杂度是nlogn就可以查询每个结点为根的子树信息,每次标记一下0表示信息不保留,1表示信息保留,找最大公约数,我们用一个标记数组把每个结点的因子都加一,因为因子个数最多100个所以时间复杂度是100nlogn,#include<iostream>#include<...

2018-08-24 15:29:11 546

原创 hdu4609(FFT)

题意:选取3条边,然后选取三条边能构成三角形的概率题解:假设我们选取是有顺序的话,选取的总方案数是n*(n-1)*(n-2)然后我们考虑到可以的方案比较难算,我们算组成不了三角形的方案数,那么就是前两条的边之和小于等于第三边的方案数,那么我们可以用FFT计算出前两条边构成长度为x的方案数m,最后我们枚举第三条长度,然后求解,因为我们求解的时候是有顺序的所以我们求出来不行的方案数需要乘以3...

2018-08-07 16:04:25 530

原创 fjut3283(NTT快速数论变换)

题解:我们将B序列反转那么最后就会变成a0,a1,a2,.....an-1b0,a1,b2......bn-1那么答案将变成a0*bi+a1*bi-1+.....ai*b0+...+ai+1*bn-1+ai+2*bn-2+....an-1*bi+1然后你会发现答案就是多项式乘法,指数相加等于i的系数加上指数相加等于i+n的系数就是答案,因为这题数值较大用FFT可能会精度出现问题所以我们...

2018-08-06 18:15:44 293

原创 hdu6331(最短路)

题意:给你一个有向图让你,有q次查询让你求从u到v至少经过k条路径的最短路径。题解:这里注意到我们最大的环就是1->2->3->n....->1这样一个n条路径的环,所以当经过k~k+n条路径找不到答案的话就肯定没有结果,因为k最大10000所以我们根据分块思想分成,也就是每100分成一块,那么我们可以预处理f[i][j][k],表示走了i×100条路径j到k的最短路径...

2018-07-31 18:02:28 532 3

原创 2018 Multi-University Training Contest 3G-HDU6325(凸包)

题意:选取多个点从第一个点到达第n个点并且要求满足条件横坐标是递增的,相邻两点之间的权值是两个点的叉积然后从第一个点到达第n个点总权值最小。题解:因为凸包是求逆时针的时候面积包住所有点的面积最大,那么我们题目这样是顺时针,相反的就是面积最小,所以这题就是求顺时针的凸包,将中间的那些点按x从小到大,y从小到大,编号从小到大排序然后扫描法选取凸包即可,因为会有从点所以相同的点我们选取编号最小的点即...

2018-07-31 10:13:40 337

原创 牛客网暑期ACM多校训练营(第二场)-H(树形dp)

题意:让你找三条链权值总和最大题解:我们可以考虑一下在树上做dp用三维dp[u][i][j],u表示结点编号,i表示已经选取了i条链,j = 0表示没有选取该结点,j = 1表示选取了i条链里面包含u结点1条残链(即只有一头),j = 2表示选了i条链里面有一条包含i结点的完整链。现在我们开始考虑合并:如果不选择u结点那么我们就是选取所有儿子结点,链数总和为i的各种情况下最大值即可...

2018-07-27 18:19:26 226

原创 牛客网暑期ACM多校训练营(第二场)-G(双指针)

题解:我们可以考虑一下把对应位置所有物品都移动到i点最多能移动多少个,然后最后可能我还有左端点或者右端点能移动一部分的情况,那么这种情况我们只需要判断左边或者右边最多还能移动多少个即可,然后我们如果移动左右端点呢?如果我们再改变中心i的时候需要的代价超过T那么我们肯定先消掉花费代价更多的那一部分,这样我就满足代价小于T,然后代价小于T后还有一种情况特殊处理,因为我们中心向右移动了,所以可能出现右端...

2018-07-22 08:57:28 277

原创 牛客网暑期ACM多校训练营(第一场)F

题解:这里我们可以得知最后结果与a[i]摆放的位置顺序无关。那么假设我大于等于x的a有n个,小于x的有m个并且他们的积为y,那么我们得到x的方案数(不算y)再乘以x就是我们接着可以把上面式子转化为x*(x^n-(x-1)^n),然后因为a很大我们不可能枚举每点的x所以我们可以将大于等于某个数个数一样的合起来一起算那么假设区间长度是a~b那么我们可以大于他们的个数都是n个那么我们可以...

2018-07-20 13:00:22 284

原创 spoj-cot2(树上莫队)

题解:因为是树上查询,我们可以在树上做下分块然后莫队,至于怎么分看你的技巧,我是先去学了一下联盟王国的树上分块据说那个操作的分块查询一块是sq~3sq的时间复杂度而且还是比较正统,所以我选择用那个分块,然后接着r我怎么操作呢,我们按dfs序,你会很神奇的发现如果我r按dfs操作的话我这里的操作时间复杂度大约是O(2×siz*n),siz是块数,然后转移怎么转移呢?你可以多画几个树形图自己尝试多种情...

2018-07-18 16:59:29 595

原创 poj1741(树上点分治)

题解:树上分治就是一直找重心,然后计算经过重心点的答案有多少,接着再把重心这个点删除掉然后接着在对应子树上接着重复上面步骤直到没有孩子结点。我是根据下面这篇博客学习的https://blog.csdn.net/qq_31759205/article/details/75579558 #include<iostream>#include<cstring>...

2018-07-18 16:51:48 180

原创 hdu4348(主席树区间更新)

题解:因为该题涉及到线段树要还原回去,那么肯定用主席树的区间修改区间查询,我们更新的时候直接将该点的总和加上一个(r-l)*v;然后查询的时候上面的lazy传递下来,然后再补上(R-L+1)*x,x = 传递下来的lazy总和#include<iostream>#include<cstring>#include<algorithm>#includ...

2018-07-18 10:53:18 795

原创 hdu5405(dfs序+树链剖分+线段树)

题解:因为我要查询有多少,i到j的路径上有与u到v路径上的公共点,那么我们可以先求没有经过u到v路径的上点的平方的总和然后再用所有点权值的总和的平方减去他,那么就是答案。然后我们怎么操作能?因为用树链剖分的话不会经过的点的对应的轻儿子的结点,所以我们记录一些对应轻儿子的权值平方的总和,然后我们如果某链往另外一条链上跳的话说明我这个点是那个点的轻链,我们再补回去就好了,然后还有一种情况是我重儿子没有...

2018-07-18 10:49:35 284

原创 hdu4436(后缀自动机)

题解:求多个字符串能够构成多少种数然后把这些数去重后加起来,后缀自动机有个性质就是路径数就等于不同子串个数,然后怎么把多个字符串拼接呢,两个字符串中间加入一个你不会用的字符,因为这样可以保证我到时候路径不会走这条#include<iostream>#include<cstring>#include<algorithm>#include<queu...

2018-07-18 10:36:03 522

原创 poj3376(manachar+字典树)

题解:两个字符串要拼凑成一个回文串a串长度小于b串长度时候a反串是b的前缀,并且b剩余的后缀是回文串,要么就是a是b反串的前缀,并且b剩余的后缀是回文串,当a串长度等于b时候,a反串是等于b。那么我们先用manachar求出到达每个串的长度哪个位置能构成回文串,并且全部插入字典树中然后查询每个串跟其他串能够构成回文串的个数是多少这样我们就求出所有|a|<=|b|的满足是b的前...

2018-07-18 10:34:01 922 1

原创 poj3415(后缀数组)

题解:找两个串公共子串长度大于等于k的总长度和,那么我们怎么操作呢,我们可以在两个串之间插入一个这辈子不可能用的数值,这样就不会出现字符串越界的操作,然后跑一下后缀数组,接着我们怎么计算大于k的公共子串呢?我们从该sa[i]位置往前搜搜到不是我这个串的所有然后求出方案数,那么问题来了,如果这样搜肯定会超时我们怎么办呢?我们可以把串目前能匹配到的长度从大到小放进队列里面,每次更新的时候我们只要把该串...

2018-07-18 10:32:43 757

原创 男人8题A题(后缀自动机+SG函数)

题解:因为要多个串到达尾部把T串,我们可以在某点到达的状态建成一个图然后 ,就是多个有向图的SG函数#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define me

2018-04-25 19:05:51 580

原创 CF962F- Simple Cycles Edges (点双连通分量)

题解:我们判断是否是一个简单环,我们可以判断缩点然后之间经过了哪些边判断一下即可,注意一个很特殊的就是边如果点只有一个的话不是环,并且要求边数和点数相同才是一个环。#include<iostream>#include<cstring>#include<algorithm>#include<queue>#include<vector&gt...

2018-04-12 21:52:15 996

原创 CF962E- Byteland, Berland and Disputed Cities (贪心)

题意:让你给点连线,再去除所有R点,或B点后都可以实现任意两点互相可达,并且代价最小,两点连线的代码为两点间的距离题解:我只需要当到达P点的时候要么与前一个p点相连3次然后减取之前R点B点的最大两点距离,或者就直接与前面一个点连接两次取两者最小值即可,其他情况直接与前面一个点相连即可#include<iostream>#include<cstring>#include&...

2018-04-12 19:26:15 368

原创 HDU - 5919(主席树)

题解:我们可以倒序插入,然后我们查询的时候查询区间有多少个不同的数,接着查询之后假设有k个不同的数,接着我们可以根据区间有多少不同的数然后查询第(k+1)/2个数的第一个位置,加入我主席树左子树大于等于(k+1)/2个不同的数那么第一个位置肯定在左子树,否则在右子树,我们到最后L==R那么肯定是位置在L了#include<iostream>#include<cstring&gt...

2018-03-29 18:43:47 551

原创 ZOJ - 3954 (模拟+思维)

题意:给你一个序列判断是否存在一种方案改成a~g的顺序最后变成输入的序列题解:我们可以根据题目给的01打个表,然后我们输入值得时候每一列的数用一个字符串保存下来,并且同时保存下来它应该对应的一列01字符,最后查看两段的01字符是否相等即可。#include<iostream>#include<cstring>#include<algorithm>#incl...

2018-03-27 21:29:52 272

原创 ZOJ - 3949(树形dp)

题解:我们先求出所有根到所有树上路径的总值,最后我们需要求的是加到哪条边上面的值后权值最小,假设根是第0层,u是第n层,求第i层会开始变少那么,数值应该是 n-i+1-i<0  =》 (n+1)/2 < i那么如果当n是奇数的话那么应该从(n+1)/2+1层开始他的子树的路径要都要减去2,4,6,8。。。2*m,,如果当n是偶数的话i应该从第(n+1)/2层开始他的子树路径减少1,3,...

2018-03-27 21:25:15 282

原创 wannafly挑战赛12E题

题解:因为gcd(a,b)最大就只有1W所以我们可以维护一下到达0~gcd(a,b)-1需要的最小代价,我们可以用spfa求最短路径那样求因为我们加一个s[i]就变到另外一个值就相当于路径的权值是v[i],接着我们跑完之后,当然我们同时维护如果代价相等的时候我们要取小子序列,最后维护完之后我们呢查找出来所有能到达的状态并且(i*10+v)%m==0的最小代价,然后我们从中选择子序列最小的一个串输出...

2018-03-27 21:08:14 131

原创 第十四届浙江财经大学程序设计竞赛重现赛B-数论

题意:让你根据公式l到r取模k的累乘,根据辗转相除法,可得如果a>k的话 gcd(a,k) = gcd(a%k,k)那么f(a,k)%k = f(a%k,k)%k了然后我们先暴力求出1~k的f(a,k)的累乘ret,假设我们求l到r里面有m个取余k相当于1~k的区间然后这个区间的答案就是ret^m%k,接着我们还剩下l%k~k-1还有1~r%k这段区间的f(a,k)没算上去,因为k最大就10...

2018-03-27 21:03:00 124

原创 牛客练习赛13

A:找一下4的个数还是7的个数多,如果7多就输出7否则输入4,两者都没有就输出-1#include<iostream>#include<cstring>#include<algorithm>#include<queue>#include<vector>#include<cstdio>#include<cmat...

2018-03-18 19:08:04 143

原创 ZOJ - 4012(KDTree)

题意:给你n个坐标点,m个查询,每个查询有直线与x轴,y轴的交点坐标,然后让你求这 条直线经过几个坐标点题解:用kdtree对n个点进行切割,然后如果直线与能包围该子树点的最小矩形没有交点那么这条直线肯定没有经过该子树任何一点#include<iostream>#include<cstring>#include<algorithm>#include<...

2018-03-15 21:49:39 206

原创 ZOJ - 4010(哈希表)

题意:给你一个长度为n的字符串然后让你求是否可以删除连续的0~n-1个字符使得字符串中的所有相邻字符不相等,包括头尾,这是因为字符串是形成一个环题解:首先我们从第i个字符开始可以向右延伸最长的不包括头尾相邻字符不相等的字符到哪里,因为如果两个相邻字符相等的话要么截去前面一段要么截去后面一段所以我们呢延伸到这里后,接着从后面一个相等字符继续延伸,假设我们延伸的长度为l那么我们从2到l(l<=n...

2018-03-15 21:40:00 287

原创 ZOJ - 4009(线段树)

题解:打表一下到99971你会发现循环节的最小公倍数为48,因为是区间修改那么用线段树,接着我们在更新的时候只需要把该区间的标记一下被更新加一,合并区间的时候要加 上子区间被更新的次数,最后我们查询的时候要增加一个d表示上面的区间被更新几次,最后的答案就是T[(x+lazy[rt])%48][rt]即可#include<iostream>#include<cstring>...

2018-03-15 21:29:24 235

原创 ZOJ - 4007 (树形dp)

题意:给你一颗树然后,树上的点有权值1,0,-1,-1可以换成0或者1,然后每条变连接的两个点权值如果不一样那么答案加一,让你求把1怎么变使得最后的答案最小题解:树形dp,分为几种情况如果树上的权值如果为0的话转移方程为:dp[0][u] += min(dp[1][v]+1,dp[0][v]),如果为1的话转移方程为:dp[1][u] += min(dp[1][v],dp[0][v]+1),如果为...

2018-03-15 21:24:38 214

原创 ZOJ - 4008离线+树状数组)

题解:先求加1-n点后的路径数用树状数组保存即可,接着保存下q个查询安装l从小到达排序一下接着删除点从1删除到l-1然后求出结果sum[r]的前驱就是答案删点的时候只接修改领结的点对应的值即可那么更改后因为前面的点已经没用了所以我们只要更改后面的数值即可#include<iostream>#include<cstring>#include<algorithm&gt...

2018-03-13 23:25:49 389

原创 ZOJ - 4006(数论逆元)

题解: 求从0点向m走i步那么就得返回i- m步最后原地停留了n+m-2*i步最后用排列组合就是c[n][i]*c[n-i][i-m]*A*B*CA,B,C分别表示走了i步,i-m步,n+m-2*i步的概率C[n][i] = n!/i!/(n-i)!因为要取膜求一下逆元最后枚举所有可能的i即可#include<iostream>#include<cstring>#inc...

2018-03-13 23:20:49 517

原创 ZOJ - 4011(DP)

题解:dp[i][j]表示放了i个数最后一个数字是j然后 转移方程就是dp[i][j] = dp[i][j] + dp[i-1][k] k是j的所有因数#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<vector>usi...

2018-03-13 23:15:20 257 1

原创 ZOJ - 4013(二分)

题解:给a数组排序一下然后b中用二分查找看哪个相等即可#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int mx = 1e6+5;int a[mx];int main(){ int t...

2018-03-13 23:10:59 254

原创 ZOJ - 4004(贪心)

直接排序然后从i = 0开始选择i,i+m选m组相乘相加即可#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;typedef long long int ll;const int mx = 1e5+5;int...

2018-03-13 23:07:37 304

原创 hdu2668

题解:用两个指针移动判断右指针移动到r位置,l位置最小能在哪里然后就是r-l+1,取其中最大值即可#include<iostream>#include<cstring>#include<algorithm>#include<queue>#include<vector>#include<cstdio>#include...

2018-02-11 14:59:21 172

原创 hdu1134(数学+大数)

题意:给你2×n个点然后连起来,每个点只连了一个线并且这些线不能相交题解:以第一个点为标准,接着和2、4、6。。。2×n点相连然后分成上下两边,上面有2×i-2个点下面有n-2×i个点然后方案数就是f[n] += f[2*i-2]*[n-2*i];因为数很大要用大数模板#include<iostream>#include<cstring>#include<algo...

2018-02-11 14:57:01 250

原创 HDU3365(几何计算)

题解:以A0与A1,B0与B1两条直线为标准判断选择的几度,变长了几倍,最后用根据这个求A0与Ai变了几度几倍移动到B0即可#include<iostream>#include<cstring>#include<algorithm>#include<queue>#include<vector>#include<cstdio...

2018-02-11 14:50:31 274

空空如也

空空如也

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

TA关注的人

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