摘要:n条线段m个点,对于每个点,求出控制他的所有线段中控制范围最大的长度:每条范围内线段控制范围=min(x-a[i].l,a[i].r-x)这个二分好难想到TUT按左端点从小到大,右端点从大到小排序,要知道在处理之后最大范围肯定出现在相邻两个区间内==thinking然后二分。。。。。二分后的两个区间...
阅读全文
摘要:刚打完三场训练赛,先补完(目前水平)第二场的大部分题,就先写第二场的总结吧不会找水题,这点区域赛有榜跟还好==后半场好像梦游了?应该去做进制转换那个的。还是国内赛好点,刚补了三维线段树和树上倍增,和后面要学习的专题之一概率dp。这一场还留了两个坑,一个三分和一个高斯消元,下面学习算法的时候回来补还是...
阅读全文
摘要:将n转化为黄金进制,注意到题目中所给fai进制公式:f[n-1]+f[n-2]=f[n],2*f[n]=f[n+1]+f[n+2]然后设a[50]为n,这样一遍一遍利用这两个公式变换,一直到无法变换。 1 #include 2 #include 3 int a[105]; 4 int main() ...
阅读全文
摘要:n个题目,每一道都有对应的分值,猴子做对每道题目概率为0.5,老虎要做多少分能使获胜概率达到p?dp[i][j]表示猴子在做完前i题得到j分的概率,则dp[n][i]表示做完n道题目得到j分的概率,这样求dp[n][i]的前缀和即为猴子得分在i及以下的概率了==老虎要获胜概率达到p,那么只要看i最少...
阅读全文
摘要:这是一道裸的二维线段树区间查询最大最小值+点修改,学习啦!二维线段树其实就是在一维线段树的每一个节点上增加一个一维线段树具体从x节点传到y节点还要看是区间还是节点,大部分操作都和一维线段树差不多 1 #include 2 #include 3 #include 4 using namespa...
阅读全文
摘要:题意这英语。。反正我是读不懂==题意:给定一个串,有多少M*L的子串,其中子串的M个子串不相同=(注:某一位不相同即为不相同)很明显要On的扫,但是似乎前一个与后一个没有关系?是的,前第x个(x MOD len==i MOD len)才有关系,如何判重?从cp那学来的黑科技字符串hash加一个map...
阅读全文
摘要:题意:从n个区间选一个数,求这n个数第二大的期望。这他妈就是题意,只怪自己渣渣花了近一个小时看懂题意。看懂题意就很明白了,就是枚举答案,然后算出选出这个答案的概率,当是开始打的时候还剩下20+分钟,打完发现样例不对,才知道有重复计算,第二天起来加了26和33行的判断轻松过了==还是自己渣,早点看明白...
阅读全文
摘要:首先如果是两个点那应该从中间切成两半,再判断所属所以必然需要使用树上倍增==继而如果是三个点,则需要仔细分情况讨论==参考别人的分类讨论写的,感觉那个type判断在哪条链很巧妙啊~ 1 #pragma comment(linker,"/STACK:16777216") 2 #include 3...
阅读全文
摘要:首先:可以利用加一个虚拟节点连向所有点,边权即为点权,求一遍最小生成树然后在这棵树上预处理一个倍增,在向上倍增的过程中开一个maxdis[x][j]记录从x开始向上2^j步最大线段这样就可以实现log的查询了== 1 #include 2 #include 3 #include 4 usin...
阅读全文
摘要:这是基于二分搜索的,这个感觉更好写,利用任何整数可以由多个2^x次方数相加得到来进行向上路径倍增。代码和思路一样,相比较RMQ更为简单== 1 #pragma comment(linker,"/STACK:16777216") 2 #include 3 #include 4 #include 5 u...
阅读全文
摘要:杭电这题在线rmq用C++交会RE,G++才能过,但是手动开个栈C++就能AC了。。在线RMQ用的一种倍增思想,还是很常见的,必然要熟练运用数组具体功能代码里面都有:dis[N] 距离根节点距离id[N] 节点映射到dfs时间序上doit[X] 时间点对应的原节点depth[X] 该时间点深度RMQ...
阅读全文
摘要:一个串切成两个,左边如果是回文串加上左边价值,右边如果是回文串加上右边价值,求切一次得到的最大价值扩展KMP:for (i=1;i 2 #include 3 #include 4 using namespace std; 5 int next[500005]; 6 void EKMP(char *s...
阅读全文
摘要:end数组表示id,开一个used数组记录哪些被匹配过 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 int used[505]; 7 struct AC 8 { 9 int next[...
阅读全文
摘要:裸ac自动机,end数组表示以其结尾的数目 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 struct AC 7 { 8 int next[500020][26],fail[500020],end[500...
阅读全文
摘要:一次将第一个数放到最后一个,求所有不同的数中比原串小的个数,等于个数,大于个数思路:将原串贴在后面,求一遍与原串的EXKMP,然后利用extendif extend[i]>=len 等于原串else if s[i+extend[i]]>s[i] 大于原串else 小于原串然后利用KMPdenext数...
阅读全文
摘要:题意好难懂==给定26个是a-z的密文,然后将给定的字符串符合密文+对应明文的最短串输出注意到前(len+1)/2肯定是密文,然后翻译成明文与后面进行EXKMP只要extend[i]可以到达末尾即为最小,再加上后面翻译即可 1 #include 2 #include 3 #include 4 usi...
阅读全文
摘要:扩展kmp求得是:S,Tentend[i]表示S中i开始的后缀与T最长公共前缀暂时没用从1下标开始的扩展KMP,下次补坑== 1 void EKMP(char s[],char t[],int lens,int lent) 2 { 3 int i,j,p,l,a; 4 next[0]=len...
阅读全文
摘要:来自matrix67,很好用很好理解 1 int find(char *A,char *B,int n,int m) 2 { 3 int i,j=0; 4 for (i=1;i0&&B[j+1]!=A[i]) j=next[j]; 7 if (B[j+1]==A[i]) j++; 8...
阅读全文
摘要:1.大的包含小的,求kmp即可2.一个串的前缀是另一个串的后缀,合并利用next数组 1 #include 2 #include 3 char s1[1000005],s2[1000005],t1[1000005],t2[1000005]; 4 char s[2000005]; 5 int next...
阅读全文
摘要:还是没能熟练掌握巧妙的next数组,把s2接到s1后面,求next数组当next[n]>a||next[b]>b继续求next直到为0或者不满足这两种此时next[n]值就是最大重复串 1 #include 2 #include 3 int next[100005]; 4 char s1[10000...
阅读全文
摘要:if (i%(i-next[i])==0&&i/(i-next[i])>1)循环次方=i/(i-next[i]) 1 #include 2 #include 3 int n,next[1000005]; 4 char s[1000005]; 5 void getnext() 6 { 7 int ...
阅读全文
摘要:dp[i]=dp[next[i]]+1;//dp[i]表示以i结尾能和前面多少前缀匹配,思考ans=sum{dp[i]} 1 #include 2 #include 3 #include 4 using namespace std; 5 int m,dp[200005],next[200005]; ...
阅读全文