自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

倘若天下着雨。。。你还在

时间的广度在于规划,其深度在于能力。

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

原创 专题:有关容斥原理和子集枚举的一些问题

容斥原理意义:有些问题中经常会出现这样一些烦人的限制条件如: 每个物品有一个额外的权如11011101,10011001, 我们最终答案的状态种一定要满足所取的物品,它们的权或后为11111111。此时如果这个值的位数很大我们之前学习过的知识对其就没有办法了。此时我们不妨分析一下最终的答案是怎么得到的。只要最终四个位上都有11就满足了对吧,不难发现如果我们把条件放宽一点:即最终得到的答案是1

2017-07-10 15:04:49 1086

原创 专题:强大的运算工具——矩阵

什么是矩阵对于 矩阵的的初步认识这里有一些讲解。一开始我对矩阵奇葩的运算方式感到奇怪,它有什么用。。。 DPDP问题的加速可以利用矩阵的结合律来实现。同时一些图论问题,利用矩阵有关图的联通和边权问题我们又有了一个新招了。(讲道理,要用到矩阵的题目似乎都是为它专门设计的。)同时还有其他的作用可以参考大牛的博客十个利用矩阵乘法解决的经典题目,codecode矩阵乘法在图联通中的

2017-07-10 09:45:38 994

原创 专题:关于搜索优化——A*和双向广搜

..

2017-07-07 15:44:16 1479

原创 [青蛙的约会 ]拓展欧几里得解同余方程

青蛙的约会题目描述两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为...

2019-06-09 15:19:53 173

原创 NOIP2017_AFO记

作为一个爆破(爆0)专家。。没有爆0就是本次比赛的目标了。。。Day0Day 0辣鸡车子,开了5个小时,终于到衢州了,拿着一个高二不应该拿的复赛奖励名额,我gougou到了衢州二中。然后,然后开始drivedrive!这样有点不好。。。 草草看了一下以前写的题解。。。对同房的老金发表了所谓的长篇大论以后。然后,然后继续drivedrive!不知道觉从6点到了11点。。。开始虚了。。。

2017-11-18 23:00:36 365

原创 [NOIP2015]运输计划 树链剖分 二分 差分

运输计划关键字:树链剖分,二分,差分结果和评价得分:70时间:评价:不应该我的思路暴力直接60直接否定了二分,然后瞎搞,多水了10,没有什么思考。。。正确思路求最长路径最短,应该要先考虑考虑二分。二分一个答案之后,比答案小的routrout都无需考虑了 然后我们考虑一下要删什么边,显然要删边一定在到剩下routrout的交集里。而且一定要满足可以从中取出一条边满足Mxrou

2017-10-28 15:12:35 265

原创 [NOIP2012]开车旅行

开车旅行关键字:链表,倍增结果和评价得分:70时间:40+60 评价 :代码功底很一般。我的思路量化我们需要处理的就是两个东西。 怎么快速的求出每个点对于的tA[i]tA[i],tB[i]tB[i]表示在i点不同的人开车会到达的点。然后就是怎么高效的模拟出开车过程了。分析70对于第一个问题。我们可以O(n2)O(n^2)扫一下void init(){ For(x,1,n)

2017-10-20 11:46:38 242

原创 [NOIP2011day2]观光公交 贪心

观光公交题目描述 风景迷人的小城 Y 市,拥有 n 个美丽的景点。由于慕名而来的游客越来越多,Y 市特 意安排了一辆观光公交车,为游客提供更便捷的交通服务。观光公交车在第 0 分钟出现在 1 号景点,随后依次前往 2、3、4……n 号景点。从第 i 号景点开到第 i+1 号景点需要 Di 分钟。 任意时刻,公交车只能往前开,或在景点处等待。 设共有 m 个游客,每位游客需要乘车 1 次从一

2017-10-18 10:52:31 210

原创 17.7.26离线赛比赛总结

A结果和评价得分:7070基本分。时间:1010+6060思路和方向7070很容易。之后就在想怎么优化这个O(n4)O(n^4)的DPDP可是一直在想如果把一个点的答案贡献到其他的点,想到了许多没有什么用的东西。。。例如差分前缀和之类的。最终我们想出来还浪费的大量的时间。思路更正见CDQ专题。反思思考方向上有两个致命的错误: DpDp的转移方向太过单一,我可能是思维定型了。。一直在

2017-07-28 11:28:10 328

原创 20170723离线赛比赛总结

A结果和评价爆零!!(sum=1)时间:6060评价:非常差。。。我的思路直接想到了单调栈也想到了单调栈的重建,没有深入挖掘到性质导致想到了二分这条歪路。。但讲道理二分也可以ACAC的,可是却因为一些细节迷之爆零。思路更正既然已经想到先建一次单调栈,处理出每个点第一个比它大的点在哪里。并保存它再下一次的时候处理出来。却没用发现本质的东西。我们完全没用必要二分。例如下面的一个序列15

2017-07-24 15:57:02 238

原创 20170715离线赛比赛总结

A结果和评价结果100100,时间3030+1010我的想法与思路直接暴力,然后造数据跑跑发现没有问题就没有想这么多了。B结果和评价结果1010,时间3030+3030评价:非常不应该我的想法与思路我们通过一些不必要的复杂方法得到了三个关系又暂时没有想到正解打算切点分之后可以过85分。可是作死切了一个暴力,同时调试的时候代码没有还原,结果只有10分。。QAQ反思时间安排要好,我

2017-07-16 18:00:37 227

原创 对拍

@echo off:p data.exe pro.exe std.exefc pro.txt std.txtif not errorlevel 1 goto ppausegoto p@echo off:p//自己命名 循环的名称 data.exe pro.exe std.exe fc pro.txt std.txt//比较函数if not

2017-07-16 09:44:57 231

原创 记忆宫殿

思路我们此时需要判断出那些点的地位是等价的。即如果AA发生BB一定发生。通过寻找规律可以发现 对于这样的A,BA,B两点是等价的。#include<bits/stdc++.h>using namespace std;const int M=1e3+5;bool to[M][M],son[M],same[M][M],vis[M];vector<int>G[M];int n,m,k,x,

2017-07-12 21:12:12 471

原创 对弈(把九角距离转换为曼哈顿距离)

首先,可以知道,棋盘上A,B两点之间的距离(九向联通)等于max(|xA−xB|,|yA−yB|) max( \left| x_A-x_B \right| , \left| y_A-y_B \right| )。但是这个东西不好求和,需要对它做一个变形。设x′A=xA+yA2,y′A=xA−yA2x_A'= \frac {x_A+y_A}{2}, y_A'= \frac {x_A-y_A}{2}于

2017-07-12 18:35:03 262

原创 20170712训练赛比赛总结

A反思虽然ACAC却花了7070多分钟。我没有把问题想得透彻就开始敲代码∗2*2 没有意义的二分思考流程发现题目的限制条件和提示条件 限制条件 两点间的边权为三维坐标中的最小值。求最小生成树。提示条件 我们可以把边都找出来有3∗n∗n3*n*n条边分析一下有些的边是无效的我们可以从这样一维的情况考虑分析一下我们发现对于一维的情况考虑,有效的边即为按XX排序后每个相邻的两个点

2017-07-12 17:05:16 272

原创 20170711训练赛比赛总结

A20分钟写完,没有什么好说的。。B反思没有明确方向,乱想乱写,仅仅推出了计算出两个三角形重合部分的方法后就没有什么质的突破了。思路没有打开,什么都没有联系到,枚举都没有想到,不要说容斥了。心态很有问题∗3*3。。。太着急没有仔细思考。 思考流程firstfirst先量化出题目的限制条件和提示信息。 限制条件: 如何求出三角形的重复部分。如何把重复的面积减掉如何把空白部分无效的

2017-07-11 20:46:56 240

原创 20170709训练赛比赛总结

B反思由于C比较简单,我后写了B,写了一个多小时才发现我DPDP的状态定义臭(错)了。 思路我们发现对于一个区间[l,r][l,r],我们需要从两端消去它,于是我们可以记录[l,r][l,r]的右边还需要几个才可以消去A[r]A[r];于是DPDP的转移就很简单了,对于一个[l,r][l,r]我们可以补充它需要的个数把它变成[l,r−1][l,r-1]同时,我们可以把[i,r−1][i,r

2017-07-09 18:54:11 248

原创 城市网络——可持久化栈

思路我们发现对于树上[l,r][l,r]的路径一定是包含在从根节点出发的某条链中的。而DFSDFS的过程中恰好便利了所有的这样的链于是我们可以用一个单调栈来维护有关链的答案。有了单调栈以后我们可以通过二分以o(logn)o(log_n)的复杂度来求解了。可是此时我们发现DFSDFS的过程中每次我们加入新的节点之后单调栈就发生了变化,在添加下一个节点的时候就不可用了。举一个简单的例子 可此

2017-07-08 20:30:59 680

原创 专题:后缀数组——维护后缀排名的强大工具

什么是后缀数组我们有时会需要判断多个字符串后缀的的字典序大小,此时我们可以用后缀数组维护。原理我们利用倍增的思想,先比较长度为lenlen的字符串的字典序排名,之后在把他们合并起来。具体的合并操作和基数排序是类似的,由于基数排序的稳定性,我们先以第一关键字排序再以第二关键字排序会得到一个”稳定”的序列。所以我们可以把[l,len+l][l,len+l]的字典序排名为第一关键字把[len+l+

2017-07-08 09:35:51 270

原创 马里奥派对

思路由于障碍物都在一个很小的区间内我们可以分开处理。 由于路径是可逆的,我们可以算每个点到原点的距离先处理区间的边框后再处理边框外的点(可以用公式计算的复杂度)/* 先用BFS计算出原地到边框的最距离 之后把图像分成了上下左右和四个角 上下左右的点直接走到边上即可 四个角点区域,先到达顶点,再走向原点即可。 因为四个边框外没有障碍物故到任何点都是一样的

2017-07-04 21:52:24 303

原创 20170702练习赛比赛总结

A思路&反思发现人只有在接受到声音后才会进入咆哮,所以不可以通过二分一个时间后把每个人独立开算仔细思考发现对于一个人一个人分析过来的他们只有一个最优的情况可以使时间最短,于是可以直接模拟#include<bits/stdc++.h>using namespace std;typedef long long ll;const int M=1e5+5;bool mark[M];int n

2017-07-04 20:54:29 230

原创 20170703练习赛比赛总结

C思路我们发现对于max直接暴力即可可是对于最小值就没有办法了我们可以思考一下终态 一定会有一定数量(c)(c)的党派有一定(x)(x)数量席位想到这里,我们可以通过枚举c c 二分x x 来模拟终态而此时我蒙了,如何二分?/* 思路:对于最大值,我们只需要把多的票都给它即可 对于最小值,我们可以先枚举有多少个党派可以有席位之后二分

2017-07-04 19:13:21 222

原创 一九八四

Tarjan算法我们发现对于一些在图上操作和查询的问题,有时我们可以通过Tarjan来的实现。这里我们针对利用Tarjan解决有关图的联通的问题思路我们发现把一个图转换成一个树的时候,点的联通情况是不变的。流程我们先把图建成树,并且把每个点在那棵树记录下来对于删边的操作有以下的条件要判断 S和T不在一棵树 falsefalse边不是树上的边 truetrue如果S,TS,T都不在

2017-07-02 09:49:58 278

原创 20170606组队赛比赛总结

B思路我们发现对于每个数只有 1<<101<<10 种状态,直接DpDp 即可没有想该题(甩锅)C思路同时由于题意,我们发现每个循环的上下界只会有一个被其他循环限制很容易发现每个循环可以形成一个拓扑序(或者树形的结构)那么,我们可以用DpDp对状态进行量化,我们用DpDp记录第ii层(循环)次数(循环的次数)为jj时的状态为了提高效率,我们可以用前缀和优化即用Dp[i][j]Dp[i]

2017-06-11 22:33:43 237

原创 有关子集枚举和容斥的一些问题

子集枚举对于每一个二进制集合我们希望枚举它所有的子集要怎么办呢?复杂度:3^m 的做法for(int i=(1<<m)-1;i;--i)//复杂度:3^m for(int j=(i-1)&i;j;j=(j-1)&i)//枚举所有的子集 collect(i,j);//把子集j的信息收集给i复杂度 m*2^m的做法for(int i=0;i<m;i++)for(int

2017-06-06 11:10:40 628 1

原创 20170531练习赛比赛总结

A比较明显的斜率Dp题却被这一题卡死了反思对于Dp的状态转移一定要仔细的思考,一定要写出准确的表达式, 例如该题:dp[i]=dp[j]+∑ia=j(T[i]−T[a])∗P[a]dp[i]=dp[j]+\sum^i_{a=j} (T[i]-T[a])*P[a]把表达式写得越规范越清晰,成功发现性质,优化Dp复杂度的可能越大。对于数据范围的分析不够,没有读好题比赛心态有问题*3(之前也

2017-06-06 10:31:06 269

原创 KMP

应用范围对于一个匹配串(S)和单个或多个母串(B)的问题流程先对匹配串造fail数组和AC自动机中的fail类似,即以失败的节点为右端点的复杂度约为O(n+m)O(n+m)void pre(){ fail[1]=0;fail[2]=1; for(int i=1;i<=m;i++){ int j=fail[i]; while(j&&S[i]!=S[j

2017-06-06 08:38:52 186

原创 斜率优化专题

应用范围对于一些问题我们可以化成k∗x+yk*x+y最值的问题我们可以通过凸包的制造是最优解满足单调性质(当kk有序是此时我们用到的节点以后一定不会用到)流程寻找表达式,并判断是取最大还是最小值(虽然是相对的)造凸包(上下凸包)查询答案凸包的制造和查询我们先处理xx和kk都有序的情况(不递减) 根据它的单调性我们可以用双端队列维护bool delt(P a,P b,P c){

2017-06-05 15:54:27 241

原创 专题:迷之消维——CDQ分治

CDQ分治的用途我们可能一些问题,每个状态和操作有先后的关系(即ii的信息要从[1,i−1][1,i-1]转移或者调用)此时我们可以用CDQ分治以loglog的复杂度来降掉一个维度。 CDQ的基本流程对于[1,8]这一个需要从小到大操作的区间我们可以给它造一个树 之后我们按先序遍历依次地遍历并更新答案 void CDQ(int l,int r){ if(l==r)return;

2017-05-29 09:36:47 246

原创 AC自动机

使用场景在现实生活中有这样一个问题,如何把一篇文章中禁用的句子或单词(例如某些脏话)删去。如果把库(我们把禁用的句子或单词造成一个库)中的 每个串都和待配串(文章)进行判断子串的操作的话,效率也太低了。基本流程<1> build_trievoid build_tri(int x){//trie树:单词查找树 scanf("%s",str); int cur=0; for(

2017-05-22 22:38:14 194

原创 2017.05.21练习赛赛后总结

B 离散之后变量名打错了没有想到利用线段树维护信息没有深入挖掘题目的信息,没有想到可以通过排序得到圆的关系而在奇思妙想通过一些玄学的东西来解题比赛的其他过程 在B题90分后,自暴自弃没有好好Debug之后就一直抱着水分的心态乱写,浪费了许多时间受到他人的影响太大,太在意没有用的东西(排名)在B90分后做题的策略出现严重问题:不知道继续写还是Debug

2017-05-21 22:36:17 187

原创 2017.05.14练习赛赛后总结

D存在的问题这题想歪了,已经分析出枚举4个顶点后用G[x][y]计算却在如何判断重复边的情况上面没有理清思路同时在该题卡了30分钟后就有了消极的情绪,没有专心思考导致思路不清晰 /* 如图 枚举一个没有相同边四边形即可 */ #include<bits/stdc++.h>#define For(a) for(int a=0;a<26;++a)using namespace std

2017-05-21 22:22:15 205

原创 CodeForces 148D Bag of mice

/* 不妨把王妃取一次和龙取一次作为一次操作 有三种情况 1.王妃取到w 2.王妃取到b龙取w,b 3.王妃取到b龙取b,b */#include<bits/stdc++.h>using namespace std;double e[1010][1010];int main(){ int w,b; sc

2017-05-12 22:15:13 192

原创 POJ 2151 Check the difficulty of problems

/* 我们很容易得到e[i][j]表示做了前i题A了j题的概率 于是我们可以用s[i][j]记录e[m][(0~j)]的前缀和即表示第i队的 A(0~j)题的概率 */ #include<stdio.h>#include<string.h>using namespace std;const int M=55;double e[M][M],p[1005][M],s[1005

2017-05-12 21:39:43 194

原创 CodeForces 768F Barrels and boxes

#include<bits/stdc++.h>using namespace std;const int N=2e5+5,P=1e9+7;int fac[N],ifac[N],inv[N],f,w,h;void pre() { fac[0]=ifac[0]=inv[1]=1; for(int i=1;i<N;++i)fac[i]=1ll*i*fac[i-1]%P; f

2017-05-12 16:28:51 235

原创 线段树的合并

原理和思路思路我们常常会遇到一些问题对于每一个点都有它的一些信息 然后我们需要查询一段区间 或者是树上一个点的子树信息此时我们便可以通过线段树的合并来解决这些问题原理我们通过把信息合并以后,利用合并后的线段树来实现lognlog_n的查询有时候我们也可以事先预处理好以方便查询 基本流程就像建主席树一样,对每一个点我们为它造一个树之后我们对不同的节点进行合并为了使合并可持久化我们

2017-05-11 19:25:48 336

原创 赛后总结(Codeforces Round #399 Div. 1)

C.没有什么好说的直接计数排序即可D.好好复习一下概率DP(白学了)我们好好看看想想:对于每一天会随机等概率产生一个魔法球:我们可以想到什么 概率Dp没错吧: e[i][j]=e[i][j−1]∗i/n+e[i−1][j−1]∗(n−i+1)/ne[i][j]=e[i][j-1]*i/n+e[i-1][j-1]*(n-i+1)/ndp[0] = 1; for(int n = 1; d

2017-05-07 20:00:57 192

原创 SRM 562 Div1 500 CheckerFreeness

/* 通过枚举一对黑点(l,r)。 我们可以计算出其他所有白点和他们的相对位置(用叉积表示) 我们把剩余的白点以和直线(l,r)的左右位置分成两部分 我们用pos表示在线段l -> r左侧的点,其相对于l,相对于r,分别是顺时针第pos[i].fr, pos[i].sc个点。 lim表示在l -> r右侧的点,与它,选中的l,r,能形成凸多边形的

2017-05-04 20:13:03 389

原创 判断一个点与直线的相对位置

定义:平面上的三点P1(x1,y1),P2(x2,y2),P3(x3,y3) S(P1,P2,P3)= (x1-x3)* (y2-y3) - (y1-y3)*(x2-x3) 令矢量的起点为A,终点为B,判断的点为C, 如果S(A,B,C)为正数,则C在矢量AB的左侧; 如果S(A,B,C)为负数,则C在矢量AB的右侧; 如果S(A,B,C)为 0,则C在直线AB上。double s(

2017-05-03 19:34:56 3038

原创 SRM 559 Div1 500 HatRack

/* 计算出每个节点对应子树的方法相乘即可 */ #include<bits/stdc++.h>using namespace std;typedef long long ll;#define M 55int n,ch[M][M];vector<int>G[M];ll dfs(int x,int f=0,int p=1){ ch[x][0]=0; for(in

2017-04-30 19:26:39 258

空空如也

空空如也

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

TA关注的人

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