摘要: /* 依旧考虑新增 2^20 个点。 i 只需要向 i 去掉某一位的 1 的点连边。 这样一来图的边数就被压缩到了 20 · 2^20 + 2n + m,然后 BFS 求出 1 到每个点的最短路即可。 时间复杂度 O(20 · 2^20 + n + m) */ #include const int N=1300000,M=700010; int n,m,i,x,y,cnt,g0[N],g1[... 阅读全文
posted @ 2016-10-02 22:11 ACforever 阅读(319) 评论(3) 推荐(0) 编辑
摘要: /* 假设路径是 a − b − c − d,考虑枚举中间这条边 b − c,计 算有多少可行的 a 和 d。 设 degx 表示点 x 的度数,那么边 b − c 对答案的贡献为 (degb − 1)(degc − 1)− 经过 b − c 这条边的三元环个数。 计算三元环的个数只需要枚举除 b; c 之外的另一个点即可。 位运算优化 */ #include const int N=151... 阅读全文
posted @ 2016-10-02 22:05 ACforever 阅读(252) 评论(0) 推荐(0) 编辑
摘要: /* 暴力枚举两个后缀,计算最长能匹配多少前缀。 最优策略一定是贪心改掉前 k 个失配的字符。 时间复杂度 O(n3)。 */ #include int n,m,i,j,k,x,y,ans;char a[310],b[310]; int main(){ freopen("master.in","r",stdin);freopen("master.out","w",stdout); s... 阅读全文
posted @ 2016-10-02 22:01 ACforever 阅读(299) 评论(0) 推荐(0) 编辑
摘要: /* 弃坑 */ #include #include using namespace std; const int N=70010,M=N*20; int n,m,i,g[N],v[Nsize[son[x]])son[x]=v[i]; } } void dfs2(int x,int y){ top[x]=y; if(son[x])dfs2(son[x],y); for(int... 阅读全文
posted @ 2016-10-02 21:55 ACforever 阅读(249) 评论(0) 推荐(0) 编辑
摘要: /* orz claris,这个题的解法非常巧妙,首先是时间问题,其实这个问题只要离线处理一下就可以了,把物品和询问都按照时间排序,然后看一下能不能满足。然后,因为容量 #include using namespace std; const int N=305,M=100010,inf=1000000010; int n,m,lim,i,j,f[M],ans[M]; struct P{int... 阅读全文
posted @ 2016-10-02 21:08 ACforever 阅读(247) 评论(0) 推荐(0) 编辑
摘要: /* 注意分解质因数,如果i是,那么n/i也是,这样就可以解决分解质因数的时间问题了 当 k ≥ 1 时,只有这些数的约数才会对答案产生贡献。 求出 m 个数的所有不超过 n 的约数,去重后统计即可。 求出 k = 1 到 m 的所有答案后,剩下的数字个数就是 k = 0 的答案。 时间复杂度 O(m2√a) */ #include #include const int N=205; int ... 阅读全文
posted @ 2016-10-02 20:34 ACforever 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复。 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行。 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间。 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车 阅读全文
posted @ 2016-10-02 00:37 ACforever 阅读(250) 评论(0) 推荐(0) 编辑