自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 hzoi2015(ntt+组合数学)

首先,对于行和列我们可以分别考虑,且行列式等价的,那么我们可以考虑将行的方案和列的方案求个卷积。#include#include#include#include#includeusing namespace std;typedef long long ll;const int N=800005;const ll E=3;const ll mod=998244353;

2017-04-01 11:01:15 911

原创 最大密度子图poj3155

#include#include#include#include#include#includeusing namespace std;const int N=3105;const int inf=0x3f3f3f3f;const double eps=1e-8;int n,m,S,T;int x[N],y[N];int head[N],tot;struct aa{

2017-01-24 22:20:48 555

原创 bzoj2683

自己的方法写的有点长#include#include#include#include#include#includeusing namespace std;const int N=500005;int n,m;struct query{ int x,y,xx,yy; int id,ans;}Q[N];queue q1,q2;int tmp[N];inlin

2017-01-24 10:25:35 565

原创 bzoj3124(树形dp)

求有多少条边:满足所有直径都经过该边。 两边树形dp,一遍以点做dp求出直径的个数,再以边做dp判断在直径上边的个数。 #include#include#include#include#includeusing namespace std;const int N=200005;const int inf=0x3f3f3f3f;typedef long long ll

2017-01-17 09:55:53 430

原创 tyvj1864(概率dp初步)

#include#include#include#include#includeusing namespace std;double f[205][205][205];int n,l,k;struct aa{ int a; double p; bool operator <(const aa &b) const { return a

2016-11-21 21:57:23 446

原创 洛谷 P1268 树的重量()

构造法。锻炼思维的好题,需要运用一些树的性质。以下用g(i,j)表示点i与点j之间的距离。首先,我们考虑n=2时的情况,很显然答案就是g(1,2)。接下来考虑n=3时的情况。由于所有点均为叶子节点,很显然点3是从点1到点2的路径上分叉出来的,就像下图。设蓝色部分长度为len,那么答案就是g(1,2)+len。len怎么求呢?显然,len = (g(1,3)+

2016-11-16 18:44:58 391

原创 bzoj1619(搜索)

给出一个二维平面,以及在每一个位置上的高度求有多少个山顶。(山顶可能大小不为1)基本思想是,枚举每一个点,然后判断是否是山顶,对于每一个山顶dfs标记所有的相邻的矮的位置。但是直接从1,1枚举到n,m。会出bug。关键是需要先按高度排序,从高到矮做才不会有bug!!思路需回顾#include#include#include#include#inclu

2016-11-11 19:26:42 327

原创 bzoj3585(线段树)

细节好恶心#include#include#include#include#includeusing namespace std;const int N=200005;const int inf=0x3f3f3f3f;inline int read(){ int ans,f=1;char ch; while ((ch=getchar())'9') if (ch=='-')

2016-09-22 20:35:15 590 1

原创 bzoj3339(线段树)

这一题在线似乎比较麻烦至于离线。。首先按照左端点将询问排序然后一般可以这样考虑首先如何得到1-i的sg值呢这个可以一开始扫一遍完成接着考虑l-r和l+1-r的答案有何不同显然是l-next[l]-1这一段所有sg值大于a[l]的变为a[l]这一步如果暴力修改的话只有30分但是修改区间我们可以想到线段树,这样就能a了#include#include

2016-09-21 20:11:45 605

原创 bzoj1593(线段树)

线段树一种新见的询问方式。1.询问连续长度为x的空的区间的最左端点,并将这段覆盖(通过最长子序列来做,先判断左边有没有这样的区间,再判断相连接的地方有没有,再判断右边有没有)2.区间覆盖为空或有  #include#include#include#include#includeusing namespace std;int n,ans;struc

2016-09-20 19:50:40 715

原创 bzoj1616(搜索)

随便一搜 #include#include#include#include#includeusing namespace std;int mp[105][105],n,m,ans,r1,c1,r2,c2,t;char s[105];bool pan(int x,int y){ if (mp[x][y]==1||x==0||y==0||x>n||y

2016-09-19 19:50:18 459

原创 bzoj3038(线段树开根)

开根,直接搞 #include#include#include#include#includeusing namespace std;typedef long long ll;inline ll read(){ ll ans,f=1;char ch; while ((ch=getchar())'9') if (ch=='-') f=-1;ans=ch

2016-09-18 21:08:49 432

原创 bzoj3282(lct)

lct模板 感觉这几天的模板写的差不多了。之后就是上思路了。#include#include#include#include#includeusing namespace std;const int N=300005;inline int read(){ int ans,f=1;char ch; while ((ch=getchar())'9

2016-09-18 19:29:37 305

原创 bzoj2631(lct)

lct模板题。很长时间没有这么错了。。。#include#include#include#include#include#includeusing namespace std;const int N=100005;const int mod=51061;typedef unsigned int ll;inline ll read(){ ll

2016-09-17 22:00:31 307

原创 bzoj2002(lct)

算是自己做的第一个lct吧。 都是基本操作没有,练摸版了,不过lct当中也是有很多很灵活的地方。 #include#include#include#include#include#includeusing namespace std;const int N=200005;inline int read(){ int ans,f=1;char ch; while

2016-09-16 23:51:36 445

原创 bzoj2049(lct)

连接两个点,断开两个点,询问两个点是否联通。 lct第一道,基本的access函数,move_to_rt函数,link函数都在里面了,但是cut函数还不是特别理解。#include#include#include#include#include#includeusing namespace std;inline int read(){ int ans,f=1;ch

2016-09-16 21:22:16 296

原创 bzoj3697(点分治)

采药人的药田是一个树状结构,每条路径上都种植着同种药材。采药人以自己对药材独到的见解,对每种药材进行了分类。大致分为两类,一种是阴性的,一种是阳性的。采药人每天都要进行采药活动。他选择的路径是很有讲究的,他认为阴阳平衡是很重要的,所以他走的一定是两种药材数目相等的路径。采药工作是很辛苦的,所以他希望他选出的路径中有一个可以作为休息站的节点(不包括起点和终点),满足起点到休息站和休息站到终点

2016-09-16 13:01:42 398

原创 bzoj2152(树形dp或点分治)

算是点分治模板题。用的一位神奔的模板,思路还是很清晰的。不过这道题状态数(余数)只有0,1,2,所以其实树形dp就能搞,并且复杂度还低。算是点分治练手了。#include#include#include#include#includeusing namespace std;const int N=20005;const int inf=0x3f3f3f3f;int n,

2016-09-16 09:15:26 382

原创 bzoj2599

第一道点分治。给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 开一个100W的数组t,t[i]表示权值为i的路径最少边数找到重心分成若干子树后, 得出一棵子树的所有点到根的权值和x,到根a条边,用t[k-x]+a更新答案,全部查询完后然后再用所有a更新t[x]这样可以保证不出现点分治中的不合法情况把一棵树的所有子树搞完后再遍历所有子树恢复T数组,如果用

2016-09-15 22:40:07 338

原创 vijos1196(博弈论)

桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作。在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆(可以不相等)留给对方操作。游戏如此进行下去,糖果数会越来越少,最后必将出现这样一种情况:某人吃掉一堆糖果后发现另一堆里只剩一块糖果不能再分了。游戏规定此时该操作者吃掉最后这一块糖果从而取胜。这个游戏是不公平的。对于任意一种初始状态,总有一方有必胜策略。

2016-09-15 10:36:52 573

原创 bzoj2388(凸包+分块)

真心好难,代码不好写。最后算是抄的clairs的代码。考虑分块,每块维护两个标记ts,tdts,td。那么对于块中一个位置ii,它的实际值为i×td+ts+vii×td+ts+vi。修改的时候,对于整块,直接打标记,对于零散的暴力修改,然后重构凸壳,时间复杂度O(n√)O(n)。查询的时候在凸壳上二分即可,时间复杂度O(n√logn)O(nlog⁡n)。 #includ

2016-09-15 00:35:50 553

原创 bzoj1612(dfs)

FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:)。在赛场上,奶牛们按1..N依次编号。每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平不相上下,也就是说,奶牛们的编程能力有明确的排名。 整个比赛被分成了若干轮,每一轮是两头指定编号的奶牛的对决。如果编号为A的奶牛的编程能力强于编号为B的奶牛(1 第一直觉:拓扑排序乱搞改一改。然而好像不行。我们知

2016-09-13 17:55:57 487

原创 bzoj2453/2120(分块)

给出一个数列,求一个区间不相同数字的个数,包含修改操作——最多1000次修改;数字最大是100W 用pre[i]记录前一个和i相同颜色的球的所在位置询问l到r时,如果pre[i]利用这种思路我们可以。。。分块每一块内按pre[i]排序,然后分块做就行了 不过正解是树套树,主流的思路还是一样,就是通过pre来做,只不过用不同数据结构维护罢了。 #include#

2016-09-11 16:25:45 268

原创 bzoj3343(第一道分块)

第1行为两个整数N、Q。Q为问题数与教主的施法数总和。       第2行有N个正整数,第i个数代表第i个英雄的身高。       第3到第Q+2行每行有一个操作:(1)       若第一个字母为“M”,则紧接着有三个数字L、R、W。表示对闭区间 [L, R] 内所有英雄的身高加上W。(2)       若第一个字母为“A”,则紧接着有三个数字L、R、C。询问闭区间 [L, R]

2016-09-11 11:31:34 301

原创 tyvj模拟赛

待填坑。

2016-09-11 08:50:01 1105 2

原创 bzoj1610(代码实现技巧+stl的一点运用)

n个点,求最多有多少个经过两点的直线,他们互相是不平行的。实际上就是要求有多少个不相同的斜率。double害怕被卡精度,所以这里通过排序,处理正反相同的情况,再gcd用pair最简比斜率来表示。 主要这里用最简比表示斜率,排序,和pair在这里灵活的使用,方法值得积累。 #include#include#include#include#include#includ

2016-09-10 22:57:00 392

原创 bzoj1609(dp)

f[i][j]表示到第i头牛数字为j的最少修改次数(转移方程详见代码),正反各来一次,计算出所有方案的最小值。 #include #include #include #include #include using namespace std; const int inf=0x3f3f3f3f; int n,a[30005],f[30005][4];

2016-09-10 09:16:54 294

原创 bzoj1606(背包)

水。。背包可行性问题。。#include#include#include#include#includeusing namespace std;int n,m;bool b[50050];int main(){ scanf("%d%d",&m,&n); b[0]=true; int v; for (int i=1;i<=n;i++

2016-09-09 21:03:15 575

原创 BZOJ1603(分点并差集)

Farmer John有一个过时的打谷机(收割小麦),它需要带子来带动。发动机驱动轮1总是顺时针旋转的,用来带动转轮2,转轮2来带动转轮3,等等。一共有n(2 #include#include#include#include#includeusing namespace std;int n,fa[5005];int getfa(int x){ ret

2016-09-09 20:34:32 323

原创 bzoj1602(倍增裸题)

裸倍增。#include#include#include#include#includeusing namespace std;const int N=1005;int n,q;int head[N],tot,fa[N][25],dis[N][25],dep[N];struct aa{ int to,pre,dis;}edge[N*2];vo

2016-09-09 20:07:47 472

原创 bzoj1601(MST+优秀建图==好题)

Farmer John已经决定把水灌到他的n(1 刚开始并没有想到是最小生成树,尽管曾经考虑过,但是感觉无法描述整个题目的所需决策。并没有多想。实际上,就是每个水库要么选择自己这里建造水库,要么选择连一条边。我们想如果所有的水库最终都选择好了一个决策的话,那么整个图就是,分成m块,每一块有一个点是自己建造水库的。其他都是顺着边连到这个点的。也就是在这个子图当中做最小生成树。这之后就

2016-09-09 18:54:52 877

原创 bzoj1600(排列组合)

勤奋的Farmer John想要建造一个四面的栅栏来关住牛们。他有一块长为n(4 #include#include#include#include#includeusing namespace std;typedef long long ll;const int N=2505;ll C[N][5];int n;void init(){ C

2016-09-08 19:25:13 476

原创 bzoj1648(水)

算回忆一下dfs吧。第7页题好水。。。#include#include#include#include#includeusing namespace std;const int N=1005;int n,m,k;int ans[N],a[N];bool b[N];int pre[N*10],to[N*10],head[N],tot;void adde

2016-09-08 19:04:14 291

原创 bzoj1901(动态区间第k大,树套树)

表示主席树+树状数组懒得打了,学了树套树水过。。。 线段树套平衡树#include#include#include#include#includeusing namespace std;const int N=12005;const int inf=0x3f3f3f3f;int n,m,tmp;int c[N];inline int read()

2016-09-08 18:46:22 554

原创 二逼平衡树(树套树)

树套树编程技巧。1.tmp,这个答案的中间变量,便于解题。2.用splay结构体来写树套树。 #include#include#include#include#includeusing namespace std;const int N=60005;const int inf=0x3f3f3f3f;int n,m,tmp;int c[N];

2016-09-07 20:09:05 627

原创 noip复赛准备

先是对历年题目的分析(12年之前)【动态规划】共15题此项为历届NOIP考察次数最多的知识点。主要有 1.区间模型 2.子序列模型3.资源分配模型(多) 以及一些简单的多维状态设计技巧(多)等。NOIP的动态规划,一般不需要多少优化,所以只需要能在题目中找到动态规划的思路即可。【模拟】共14题平均每届NOIP都会出现1个模拟题。这种题一般算法很简单,需要选手细心理解题目意思

2016-09-06 13:09:46 1144

原创 poj1511(spfa)

题目大意:给出n个点和n条有向边,求所有点到源点1的最短路之和,加上源点1到所有点的最短路之和。到其他点的最短路之和,只需要跑最短路就行,这是个有向图,其他点到这个点的最短路和前面的是不一样的。关于第二问,显然的方法是,每一个点都跑一次最短路。复杂度也是显然不能接受。很巧妙的是,只要我们将所有的边反向连,再跑spfa就是第二问的最短路了。 #include#include#

2016-09-04 16:50:16 385

原创 poj1236(强连通分量)

POJ1236一些学校通过网络连接在一起,每个学校手中有一份名单,即它所指向的点。学校A的名单中有学校B,并不能保证学校B的名单里有学校A。现在有一软件。1.问至少发给几个学校才能保证所有的学校都可以得到该软件。2.至少加几条边才能使将软件发给任何一个学校后,其他所有学校都可以得到软件。N 第一个是求缩点后,入度为0的点数;第二问是求max(入度为0

2016-09-04 15:35:50 365

原创 bzoj1179(缩点+乱搞)

很显然这道就是需要先求出强连通分量,然后缩点。缩点之后就是有向无环图了。实际上这之后,各种方法就都可以了。已知的dp:1.通过拓扑序用一个队列来进行dp,图是原先的图                  2.缩点后建新图时,将图反向建。然后对于每一个酒吧,记忆话搜索,到市中心的最短路(我用的这种方法)spfa:缩点后跑spfa,求出到每一个酒吧的最长路(我不敢确定这样的复杂度,就没写这个

2016-09-04 13:08:10 309

原创 c++ random_shuffle()

random_shuflle( a,a+n+1);生成一个前闭右开区间的随机序列,注意这里序列是需要附初始值的。并且并不只是数字,字母等也是可以的。 random_shuffle()定义在标准的头文件

2016-09-03 18:35:31 7167

空空如也

空空如也

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

TA关注的人

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