bzoj

【题解】【BZOJ】4668 冷战

大城市里の小女人 提交于 2019-12-04 08:44:55
题外话: 你们知道想了半天思路提供给同学然后证明了半天时间复杂度然后考试结束的痛苦吗…… 看到连通性,我们会本能地想起并查集(想起LCT的说明您太强了orz) 题目要求输出的是 \((u,v)\) 这一点对最早在什么时候联通 考虑连边操作 显然,如果 \((u,v)\) 已经联通,那么连接它们两个是没有意义的 如果 \((u,v)\) 不连通,则必须连接它们两个 经过一番思考,我们思考出来以下思路: 若连接 \((u,v)\) ,则将 \(u\) 并查集合并到 \(v\) 并查集上 连出来的边设一个边权 \(val\) ,val为当前为第几个铁路 好像就没有了? 对于询问,我们直接往上一层层跳,跳出LCA,然后统计答案 在实际实现的时候,每个点会记录一个 \(v[i]\) ,表示i到fa[i]这条路径上的权值 同时,为了方便,我(在参考lzh的代码后)选取了另外一种更暴力的找LCA的方法 注意:不能路径压缩,为了保证时间复杂度我们使用按高度合并(学名不知道……) 期望?均摊?反正层数 \(O(logn)\) code: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=500010; const int inf

待补题目列表

故事扮演 提交于 2019-12-04 06:34:22
补是不可能补完的 哈理工软微2019新生赛(同步赛)——小乐乐与二段数【数论】 题目: https://ac.nowcoder.com/acm/contest/1877/T 题解: https://blog.csdn.net/Q_1849805767/article/details/102980620 BZOJ 2909——Bipartite Numbers【数论】 题目: https://anoxiacxy.github.io/more/bzoj/p/2909.html 来源: https://www.cnblogs.com/Guugle/p/11837890.html

2019.9.5 bzoj(1202,1004)

女生的网名这么多〃 提交于 2019-12-03 15:22:02
2019.9.5晚刷题记录 \(1.bzoj\) \(1202\) 狡猾的商人 (类似3714 Kuglarz) 做法:带权并查集 错误原因:快读写错了 用时:40min 分析: 还是利用前缀和的思想, \(num[i,j]=sum [j]-sum [i-1]\) . 如果暴力维护,不能维护到所有的信息,例: \(num[1,3]=4 ,num[1,2]=2 ,num[2,3]=5\) 是错误的,但无法判断出来,但是从这里我们发现了它们之间的关系是具有传递性的,所以我们可以考虑使用并查集。 我们记 \(d[x]\) 表示 \(sum[x]-sum[ fa [x]]\) . 首先要注意的是输入 \(s,t\) 时, \(--s\) 。 其次是需要在每次 \(find\) 的时候增加一些新的操作 int find(int x) { if(x==fa[x]) return fa[x]; int t=find(fa[x]); d[x]+=d[fa[x]];//不能写为d[x]+=d[t],因为这样中间跳过了许多步骤,我们的到新的d[x]的正确过程 fa[x]=t; //应该是sum[x]-sum[fa[x]]+ return fa[x]; //sum[fa[x]]-sum[fa[fa[x]]]+...+sum[son[t]]-sum[t] } 另外要注意的就是在每次输入关系时,若s

[BZOJ 3160] 万径人踪灭

旧时模样 提交于 2019-12-03 09:56:42
3160: 万径人踪灭 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2662 Solved: 1447 [ Submit ][ Status ][ Discuss ] Description Input Output Sample Input Sample Output HINT 考虑用总回文序列数减去回文串数 对于每个对称轴,只需要知道有多少对关于它对称然后计算 先把$a$置为$1$,$b$置为$0$做一次卷积,然后$a$置为$0$,$b$置为$1$做一次卷积 两次加起来再稍微处理一下就行了 回文串数用马拉车求 #include <bits/stdc++.h> using namespace std; const int maxn = 262144, mod = 1e9 + 7; const double PI = acos(-1.0); struct comp{ double x, y; comp(double _x = 0, double _y = 0){ x = _x; y = _y; } friend comp operator * (const comp &a, const comp &b){ return comp(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x); }

[BZOJ 4259] 残缺的字符串

一个人想着一个人 提交于 2019-12-03 07:17:34
4259: 残缺的字符串 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2023 Solved: 481 [ Submit ][ Status ][ Discuss ] Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n。可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同程度的残缺。 你想对这两个串重新进行匹配,其中A为模板串,那么现在问题来了,请回答,对于B的每一个位置i,从这个位置开始连续m个字符形成的子串是否可能与A串完全匹配? Input 第一行包含两个正整数m,n(1<=m<=n<=300000),分别表示A串和B串的长度。 第二行为一个长度为m的字符串A。 第三行为一个长度为n的字符串B。 两个串均仅由小写字母和*号组成,其中*号表示相应位置已经残缺。 Output 第一行包含一个整数k,表示B串中可以完全匹配A串的位置个数。 若k>0,则第二行输出k个正整数,从小到大依次输出每个可以匹配的开头位置(下标从1开始)。 Sample Input 3 7 a*b aebr*ob Sample Output 2 1 5 两个字符串都含通配符 求A在B中出现的所有位置 先把通配符出现的位置赋值为0 然后构造式子$f_i=\sum_

bzoj 4816 [Sdoi2017]数字表格

匿名 (未验证) 提交于 2019-12-03 00:43:02
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4816 题解 显然是莫比乌斯反演 首先得出 然后发现 我们要把d提出去 这样就好做了 跟SDOI2015的一道题类似 因为 $\left \lfloor \frac{n}{p} \right \rfloor \left \lfloor \frac{m}{p} \right \rfloor$只有$(\sqrt n +\sqrt m)$种取值 并且$\prod_{k|p} f[k]^{\mu(\frac{p}{k})}$对于每个p都是固定的 所以我们可以预处理$\prod_{k|p} f[k]^{\mu(\frac{p}{k})}$的前缀积 以及前缀积的逆元 这样可以方便的算出区间的乘积 然后对于每一组询问 我们枚举$(\sqrt n +\sqrt m)$种取值 就可以得出结果 Code 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 ll read(){ 6 ll x= 0 ,f= 1 ; char c= getchar(); 7 while (c< ‘ 0 ‘ || c> ‘ 9 ‘ ){ if (c== ‘ - ‘ )f=- 1 ;c= getchar();} 8

bzoj 1791: [Ioi2008]Island 岛屿【基环树+单调队列优化dp】

匿名 (未验证) 提交于 2019-12-03 00:40:02
我太菜了居然调了一上午…… 这个题就是要求基环树森林的基环树直径和 大概步骤就是找环―>dp找每个环点最远能到达距离作为点权―>复制一倍环,单调队列dp 找环是可以拓扑的,但是利用性质有更快 好写 的做法,就是像朱刘算法找环那样,按照输入的方向(i―>to_i)打一圈标记,如果碰到同样标记就说明有环,这里注意 我一开始没注意到的 ,从i点进入找到环不代表i点在环上,因为可能是6字形的,所以一定是环点的是找到的有同样标记的那个点,然后顺着这个点把环点都放进一个栈(其实不用,但是这样好写一些),顺着每个点向非环点dfs找到最远点,这里注意!非常坑的是一棵基环树的直径不一定经过环,所以在dfs过程中,把每个点向下的最长和次长路径的和都和一个全局变量mx取max。把每个点向下最长当做点权va[i] 这样就只剩一个环长为len的环了,把这个环复制一遍,sum表示长度前缀和,答案就是max(va[i]+va[j]+sum[j]-sum[i])(j-i<len),这个可以用单调队列实现,能得到答案ans 这样,max(ans,mx)就是当前这棵基环树的直径了 把每次找到的环的答案加起来即可 #include<iostream> #include<cstdio> using namespace std; const int N=1000005; int n,ne[N],le[N],h[N],cnt

bzoj 2243(大学ACM恢复训练)

匿名 (未验证) 提交于 2019-12-03 00:38:01
2243: [SDOI2011]Ⱦɫ [ Submit ][ Status ][ Discuss ] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221”由3段组成:“11”、“222”和“1”。 请你写一个程序依次完成这m个操作。 裸的链剖,写加调55分钟,代码能力太差。不要有畏惧心理,多写来提高。 注意把函数模块化,更新统一写 注意区间合并的先后顺序,深度小的在上,相当于左区间。链顶合并相当于左左合并,要特判。 维护左右端点颜色即可 链剖中链查询可以对每条链建线段树,应该快些,但因为线段树太丑反而更慢。 所以留坑,优化线段树。。。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define maxn 100020 7 8 struct node{ 9 int next,to; 10 }e[maxn * 2 ]; 11 struct data{ 12 int lc,rc,num; 13 data(){ lc = rc = num = 0 ; } 14

bzoj 4650[Noi2016]优秀的拆分

匿名 (未验证) 提交于 2019-12-03 00:38:01
http://www.elijahqi.win/archives/3894 Description 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串,则我们称该字符串的这种拆 分是优秀的。例如,对于字符串 aabaabaa,如果令 A=aabA=aab,B=aB=a,我们就找到了这个字符串拆分成 AABBA ABB 的一种方式。一个字符串可能没有优秀的拆分,也可能存在不止一种优秀的拆分。比如我们令 A=aA=a,B=baa B=baa,也可以用 AABBAABB 表示出上述字符串;但是,字符串 abaabaa 就没有优秀的拆分。现在给出一个长度为 nn 的字符串 SS,我们需要求出,在它所有子串的所有拆分方式中,优秀拆分的总个数。这里的子串是指字符串 中连续的一段。以下事项需要注意:出现在不同位置的相同子串,我们认为是不同的子串,它们的优秀拆分均会被 记入答案。在一个拆分中,允许出现 A=BA=B。例如 cccc 存在拆分 A=B=cA=B=c。字符串本身也是它的一个子串。 Input 每个输入文件包含多组数据。输入文件的第一行只有一个整数 TT,表示数据的组数。保证 1≤T≤101≤T≤10。接 下来 TT 行,每行包含一个仅由英文小写字母构成的字符串 SS,意义如题所述。 Output 输出 TT 行,每行包含一个整数,表示字符串

BZOJ 4805: 欧拉函数求和 杜教筛

匿名 (未验证) 提交于 2019-12-03 00:37:01
https://www.lydsy.com/JudgeOnline/problem.php?id=4805 https://blog.csdn.net/popoqqq/article/details/45023331 杜教筛用来求积性函数前缀和,本题同bzoj 3944,bzoj 3944多了一个求sigma( μ ( i ) ) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 #define LL long long 9 const int maxn= 5000010 ; 10 LL n; 11 LL phi[maxn]= {}; 12 LL pri[maxn/ 10 ]={},tot= 0 ; 13 bool v[maxn]= {}; 14 void get_phi( int m){ 15 phi[ 1 ]= 1 ; 16 for ( int i= 2 ;i<=m;++ i){ 17 if (!v[i]){pri[++tot]=i;phi[i]=i- 1 ;}