自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 cf734D

#include<iostream>#include<cstdlib>#include<algorithm>#include<cmath>#include<cstring>#include<cstdio>using namespace std;struct rec{ int x,y,biao;}poi...

2018-05-28 19:44:28 152

原创 【bitset】hdu5782

循环相等,就相当于前缀循环了一遍然后找相等串然后就是分为一部分正向,一部分反向,然后bitset优化一下#include#include#include#include#include#include#include#includeusing namespace std;const int maxn=10050;bitset dp[2][maxn];

2016-08-05 18:07:02 516

原创 【网络流】hdu4940

每个点单独放到T集合,那么的话值就相当于∑(Bout+Dout)-∑Bin;也就是说,出边可以看做一定要出去的流量,入边看做可以进入的流量,那么只要出边的流量都能进入入边也就ok了所以,对于每条边,设置一个下界是b,上界是b+d.直接跑无源汇有上下界最大流就行了。#include#include#include#include#include#includeusing na

2016-07-03 20:15:25 444

原创 [图论] zoj1015

如何判断一个图是不是弦图mcs算法找出当前度数最大节点然后标号然后所有与此节点相连的节点(未标号的)度数加1;然后我们的到一个有序队列然后对队列中的一个点vi  找到 它后面的和它相连的vj1 vj2 vj3......vjk然后判断vj1和vj2 vj3 ....vjk是不是相连就可以朴素算法是n^2,现在只想到怎么优化到nlogn...#include#inc

2016-05-18 22:20:09 463

原创 [dp+数论]bzoj1004

具体解法关键的就两句话每个置换的核染色方案数相加/置换数=总染色方案数每个置换的核染色方案数=缩环后的染色方案数#include#include#include#include#include#includeusing namespace std;int f[31][31][31];int cg[71];bool flag[71];int sum[7

2016-05-16 19:52:34 404

原创 [dp+图论] poj1112

#include#include#include#include#includeusing namespace std;int f[110][110];int sum[110][3];int dp[105][105][105];int de[105][105][105];int col[110][3];int ans0[120],ans1[120];int n;bool

2016-05-12 20:22:22 492

转载 【DP】bzoj1002

题干:轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示  N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示  现给定n(N网上看了很多行列式的解法,觉

2016-05-11 15:39:19 443

原创 【dancing links】hust1017

存个dancing links的板子,万分#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;const int maxn=1000*100*2+30;struct rec{ int L[

2016-04-02 19:21:42 384

原创 【DP】poj1722

每次取出两个数相减,其实就是给整个数列标加减号,想明白这一点这个题就好做了,一眼看上去很像一个区间DP啊,然后第二个数一定是只能减的。。#include#include#include#include#include#includeusing namespace std;int T,n,a[101000],f[110][20100],biao[110];int main(){

2016-04-02 19:18:21 475

原创 【博弈论】poj1704

相邻两个绑成一组,它就变成了一个#include#include#include#include#include#include#include#includeusing namespace std;int a[201000];int n,t;int main(){ //freopen("test.in","r",stdin); scanf("%d",&t); whi

2016-03-30 14:22:26 393

原创 【splay】poj3468

存个splay的板子,建树的姿势非常巧妙#include#include#include#include#include#include#define lc(x) tree[x].c[0]#define rc(x) tree[x].c[1]#define sum(x) tree[x].sum#define num(x) tree[x].num#define biao(x)

2016-03-30 14:17:15 373

原创 【主席树】CF650D

主席树维护l_LCS[i]和r_LCS[i]每次询问都是有两部分取个最大值l_LCS[i]+r_RCS[i]+1;和不经过 i 的最长上升子序列,再用count[i]记录是不是最长上升子序列一定经过i

2016-03-21 09:14:33 368

原创 【网络流】poj1087

题意 n个插座, m个硬件,k种转化器,每种转化器有无限个!!问最少有多少个插不上。单纯的网络流,处理字符串那一段有点烦,然后poj的数据好像有点大。要开大一点不然会坑,源点向每个插座连一个容量的边,每个硬件向汇点连一条容量为1的边,然后转换器之间连容量为无穷的边#include#include#include#include#include#includeusing na

2016-03-06 22:40:34 361

原创 【DP】scu4441

枚举10000所在位置然后,先预处理出来10000右边的情况,然后再处理左边,算法很好像,但是细节很繁琐,因为数组开小了wa了很多炮。。。#include#include#include#include#include#include#includeusing namespace std;int n,tail,ans;int c[20100],a[200100],dp[20010

2016-02-21 03:38:25 623

原创 【DP】AIM Tech Round (Div. 2) D

让你删一个连续区间,然后剩下的数可以加一减一,然后让他们的最大公约数不为0,很显然最大公约数一定是a1-1,a1+1,a1,an+1,an-1,an这六个数的质因子,所以就枚举这六个数的质因子来dp,很明显最后的结果是三个区间,那么dp也设立三个状态 f[i][0]代表在第一段里,f[i][1]代表在中间删除的那段里,f[i][2]代表在第二段没有删除的区间里#include#inclu

2016-02-16 11:56:03 430

原创 【树状数组】2016 BUPT Winter Training #2 D

这个题可以理解是求一个区间有多少个不同的数,离线来做从后往前做,每来一个数,更新这个数的位置,然后用树状数组维护前缀和。#include#include#include#include#include#include#includeusing namespace std;int n,m;int c[200100],loc[300100];bool flag[

2016-02-10 05:05:55 313

原创 【题解】2016 BUPT Winter Training #2

A题我只能说我tm居然连多个数的最小公倍数都不会求!!!!每次短除的数一定要除完!每个数都要除短除的那个数!正解暴力容斥。#include#include#include#include#include#includebool flag[20],exist[20];int n,a[20],tail;long long m;long long ans;using

2016-02-06 01:22:42 324

原创 【题解】BUPT 2015 freshman contest 2

A题裸的求最大连续字串和,我的做法是先求一个前缀和,然后我要求的就是所有s[j]-min(s[i]) i#include#include#include#includeusing namespace std;int s[200100];int ans;int main(){ int t,ci,ansl,ansr,k,n,x; scanf("%d",&t);

2016-02-04 00:56:42 516

原创 【XJBG】UESTCdp练习场 D 温泉旅馆

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103468#problem/D想了想什么算法都不算,于是分个类叫XJBG吧(瞎鸡巴搞)好吧我承认我一开始没看到ai但是。。。因此发现好像不用这个条件也能做(笑)发现如果ai不限定范围的话,标程DP是做不了了。。。。hhhhhhh,爽

2016-02-02 23:13:08 756

原创 【DP】Codeforces Round #341 (Div. 2) E

问你用1-9拼一个mod x余k的数有多少种方法,一开始脑抽了,从低位到高位做了(虽然这样做后发现是有循环规律的),但是发现异常难做,然后看了下题解原来是从高位往低位做了之后然后每次相当于余数乘十再加上1-9,所以构建余数矩阵f[i][(10*i)+x] += sum[x] 然后f矩阵做快速幂好了。。。#include#include#include#include#inc

2016-02-02 22:18:14 377

原创 【贪心】Codeforces Round #339 (Div. 2) D

给出一个数列,你每次可以讲其中任意一个数加一,但是你最多只可以操作m次,给出一个最大值A,每个数最多能加到A然后所求的值是(最大值A的个数suma*cf加上整个数列最小值minf*cm)的最大值cf的题基本上都是脑筋急转弯,首先我们可以枚举操作完后的最大值的个数,然后我们就会发现,如果你要一个值达到最大值的话,一定是从大到小来做,假设 aj如果你将aj操作为最大值,就相当用ak到了

2016-01-28 22:54:31 483

原创 Codeforces Round #339 (Div. 2) C.cpp

题目的意思是一个多边形绕着多边形外一点旋转,扫过的面积是多少,设距离旋转点最远的点的距离是r1(一定在多边形顶点),最近的点(可能在多边形边上)。最远的点很好写吗,最近的点需要讨论一下来写,不过也不难写,题目精度的话,都用double就可以过了。#include#include#include#include#include#includeusing namespace s

2016-01-27 15:00:00 473

原创 【DP】good bye 2015 D

当时忽略了相等如果重复的话暴力判的话效率是n^3的,然后发现只要预处理一下lcp就好了。想问题还是会忽略细节啊。#include#include#include#include#include#includeusing namespace std;int f[5002][5002];int n;int lcp[5002][5002];char s[100100];int ma

2016-01-01 20:10:35 289

原创 【DP】Codeforces Round #336 (Div. 2) C

我只是觉得人云亦云的写二分不好,这个题看了看数据范围,果然最快的方法还是暴力枚举吧。#include#include#include#include#include#includeint n;int f[1001000],next[1001000];bool flag[1001000];using namespace std;int main(){ freopen("tes

2015-12-30 18:25:56 264

原创 【图论】Codeforces Round #334 (Div. 2) D.cpp

让你构造一个图,然后最小生成树的边要是给定的边第一次没靠题解做出来d题然后按照克鲁斯卡尔的思路想了一发发现构造成一条链就好了。。。。#include#include#include#include#include#includeusing namespace std;struct rec{ int x,y,v,biao,wei;}bian[301000];bool

2015-12-21 20:20:48 433

原创 【字符串】poj1961

重新理解了一下next数组是失配的之后前一个在哪然后又理解了一下改进算法然后记住一个结论吧,就是循环节=i-next[i]&&next[i]!=0 (i%(i-next[i])==0)i是当前字符减一的长度#include#include#include#include#include#includeusing namespace std;char s[100

2015-12-21 13:46:24 371

原创 【树状数组】poj1794

两组士兵把绳子扔向城墙每组士兵绳子之间相互不交叉两组之间可能会交叉问交叉数目先整体按照农民升序然后城墙降序排序再用树状数组求逆序对数就好了#include#include#include#include#include#includeusing namespace std;int n,m,ans,c[200100];struct rec{ int x,y;

2015-12-21 11:09:58 414

原创 【博弈论】Codeforces Round #334 (Div. 2) E

又一个nim游戏的变形我现在姑且把sg函数理解成一个整数值就好了,f(x)代表一个状态的sg值代表着这个节点不能连到的点的最小值。于是把k按照奇偶来分类nim游戏意味着一堆石子的sg值等于这堆石子求亦或所以我们来分析一下,k=奇数的时候f[2n]->f[n]^f[n]^f[n].....^f[n]=f[n]f[0]=0,f[1]=1,f[2]=0,f[3]=1,f[

2015-12-10 20:17:04 382

原创 【数论】Codeforces Round #334 (Div. 2) D

什么也不说了。。纯纯的数学题。。首先考虑k=0和k=1两种情况,k=0的时候f(0)=0然后其他的都随意了(题目不要求一定是满射)k=1的时候f(x)=f(x) 连x=0都随意了。然后考虑k>=2f(kx1 mod p)=k(f(x1)) mod p让我们来假设kx1=x2那么f(x2)=kf(x1) mod pf(x3)=kf(x2) mod pf

2015-12-10 19:58:24 302

原创 【DP】poj1037

有点麻烦的一个DP一开始已经想到只跟顺序有关系,但是忘记了只要维护一个上升一个下降就可以解决转移的问题了然后还有一个点就是其实把任意一个数拿出去的话剩下序列跟拿出的数的关系是能推导出的。#include#include#include#include#include#includeusing namespace std;long long f[31][31][3];bool

2015-12-04 23:39:49 485

原创 【DP】hdu3507

提议就是给出一个非负的序列,然后割成几段,每段的代价是那个公式。然后dp式很好推也能一眼看出是斜率优化。(d[i]-d[j]+sum[i]^2-sum[j]^2)/2(sum[i]-sum[j])j被玮神喷基本功不好了,于是打算多写几个斜率优化练一下,然后1,起始项是q[1]=0不是q[1]=1;2.传参的时候一定要对应,不要传值当做标号用3.一定要注意队头出队时候

2015-12-02 10:31:35 341

转载 【图论】spoj two famous companies

duang神给的一道题,感觉还是很有思考。题中给出两类边求恰好包含k条a类边的最小生成树一开始没什么头绪但是结果可以这样考虑ans=min(∑e(a)+∑e(b));如此一来假设给所有e(a)减去一个值d那么ans=Min(∑(e(a)-d)+∑e(b));也就是ans=min(∑(e(a))+∑e(b)-kd);并不影响最小生成树的性质所以就可以借

2015-10-18 18:00:21 402

原创 【DP】hdu4111

题意:有N堆石子,每堆石子有一个数目,现有两个人博弈,每个人每次可以进行两个操作中的一个:1、从某堆拿掉一个石子(若某堆石子为0了,那么这堆就不存在了);2、合并两堆石子没有操作的就输。问是哪个赢难点:1.想到如果多个堆多于1那么胜利的一方一定会想尽办法合并,又因为每堆都多余1所以无法阻止合并            2.如果有一就单独考虑所以解法就是用f[i][

2015-09-24 12:33:34 460

原创 【贪心】hdu5236

题意DRD经常使用一个文本处理软件,这个软件每输入一个字符就有一定的概率(p)崩溃,并且丢失上次保存之后的所有数据。执行一次保存需要x字符的代价(但是不会崩溃)问在最优策略下,输入字符的期望是多少做法一开始想到了分段应该是相同的,但是忽略的当最后还剩下一段的时候不是直接接上去,而是做成一些是x的段,一些是x+1的段。。。。这样会更优,所以最后算答案的时候姿势那么

2015-09-23 12:00:18 519

原创 【树分治】poj1741

题目的意思让求树上点对距离小于等于k的数量每次找到重心然后找有多少符合条件的过重心的点对然后对于子树递归的做因为最多是log层所以每个点最多被遍历logn次最后输出的时候虽然输出了long long但定义ans的时候定的int。。。。wa了好久真是手残#include#include#include#include#include#includeusing namesp

2015-09-05 11:40:35 356

原创 【字符串】hdu5384

裸的ac自动机居然没有看出来。。。于是乎手撕了一发,话说果然还是不喜欢用模板,这篇挂出来就当是以后自己ac自动机的写法了。挺好看的。。。#include#include#include#include#include#includeusing namespace std;char s[200100],w_s[200100],tmp_s[200100];int q[2

2015-08-14 13:36:40 502

原创 【DP】poj1947

题目大意:给出一棵树,让你隔断一些边,使得割完后剩下的联通块里有某个联通块刚好包含k个节点,然后隔断的边尽量少也是一道典型的树形dp然后很明显能看出要以每个节点i及其子树中保留j个节点最少割多少次来作为状态这个题大概难点在初始化吧。。想了好久。。。我当时的初始化是f[i][1]=vec[i].size()-1,也就是i节点的总儿子数然后转移分两种一种是选了某个儿子那就是no

2015-08-14 13:26:33 396

原创 【DP】poj2486

多校训练的树形dp就没有做出来过,所以最近也是网上把树形dp的题扒出来做一遍。其实跟普通的dp一样,树形dp也是需要找状态,确定状态转移方程,只不过状态转移的过程比较明确,就是从父亲向儿子转移或者儿子向父亲转移,只不过怎么转移通常是很难的问题。。。这个题的难点在于走向某一个节点之后还可能回来,然而也因此,状态就非常明显了,明显要分两类,一类是经过当前节点后回到当前节点,另一种是经过当前节点

2015-08-12 21:14:43 368

原创 【DP】poj1692

题意:对两个数列找一些匹配满足对于任意一个匹配有且仅有一个与其数字不同的匹配与之交叉。一开始觉得应该是个n^4的,结果想一想发现每次更新的时候,如果a[i]!=b[j]那每次在b里找最近的一个数等于a[i]然后在a里找最近的一个等于b[j]就好,也算是一种贪心的思想,想想,如果再往前找的话肯定不如最近的优于是就是n^3了#include#include#include#include#

2015-08-10 13:00:36 540

原创 【DP】coderforces 567F

正式开始刷cf的题。。。cf的题真是厉害,随便找一道都这么变态,真的是做过最麻烦的DP了。。。状态很好想f[i][j][k]表示从前往后填了i个从后往前填了j个最大数为k的概率。然后就是暴力枚举每一个限制条件然后看能否转移。就是暴力的话需要分类分的很清楚。对于相等的情况,如果当前要转移状态一个被限制,而另一个没有限制,那么说明是不能转移的对于大于的情况,如果当前要转

2015-08-07 16:14:54 721

空空如也

空空如也

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

TA关注的人

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