目录 @description@ @solution@ @accepted code@ @details@ @description@ 在Byteland一共有n个城市,编号依次为1到n,形成一个n个点的竞赛图. 请写一个程序,帮助Byteasar计算有多少种道路修建方式,使得从1号点出发的最长简单路径经过点数恰好为k,由 于答案可能很大,请对P取模输出 Input 第一行包含两个正整数n,P,表示点数和模数. 2≤P≤1e9,N<=2000 Output 输出n行,第i行输出从1出发的最长简单…
题意: 做法来自 首先竞赛图缩点后是一条链,\(1\)号节点在开头的那个\(SCC\)中,因此从\(1\)号节点出发的最长链即为\(1\)号节点所在的\(SCC\)的大小\(+1\)号节点拓扑序之后的所有\(SCC\)的大小之和. 设\(f_i\)表示\(i\)个点的竞赛图数量,显然有\(f_i=2^{\frac{n*(n-1)}{2}}\). 设\(g_i\)表示大小为\(i\)的竞赛图且是\(SCC\)方案数,有: \(g_i=f_i-\sum\limits_{j=1}^{i-1}C_i^j…
[Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 93  Solved: 53[Submit][Status][Discuss] Description 在Byteland一共有n个城市,编号依次为1到n,它们之间计划修建m条双向道路,其中修建第i条道路的费用为ci.B yteasar作为Byteland公路建设项目的总工程师,他决定选定一个区间[l,r],仅使用编号在该区间内的道路.他希 望选择一些道路去修…
5216: [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 66  Solved: 37[Submit][Status][Discuss] Description 在Byteland一共有n个城市,编号依次为1到n,它们之间计划修建m条双向道路,其中修建第i条道路的费用为ci.B yteasar作为Byteland公路建设项目的总工程师,他决定选定一个区间[l,r],仅使用编号在该区间内的道路.他希 望选择…
题意: 这题显然直接tarjan是做不了的. 这里安利另一个求SCC的算法Kosaraju,学习的话可以见这篇博客 于是结合莫队,我们有了个暴力. 发现主要瓶颈是dfs过程中找最小的未经过的点,我们用bitset优化一下就过了. 注意有重边,不能直接在biset中删除,要开个邻接矩阵判一下. code: #include<bits/stdc++.h> using namespace std; #define re register typedef long long ll; const int…
Description Byteasar 组建了一支舰队!他们现在正在海洋上航行着.海洋可以抽象成一张n×m 的网格图,其中有些位置是" .",表示这一格是海水,可以通过:有些位置是"#",表示这一格是礁石,不可以通过:有些位置是"o",表 示这一格目前有一艘舰,且舰离开这一格之后,这一格将变为".".这些"o" 表示Byteasar 的舰队,他们每天 可以往上下左右中的一个方向移动一格,但不能有任何一艘舰…
裸题 注意+特判 #include<cstdio> using namespace std; const int mod=1e9+7; int F[1000005],mi[10000005],ni[10000005],G[1000005]; int pow(int a,int b){ int ans=1; while (b){ if (b&1) ans=1ll*ans*a%mod; a=1ll*a*a%mod; b=b>>1; } return ans; } int C(i…
5215: [Lydsy2017省队十连测]商店购物 可能FFT学傻了,第一反应是前面300*300背包,后面FFT... 实际上前面背包,后面组合数即可.只是这是一道卡常题,需要注意常数.. //Achen #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #incl…
题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列变为不下降数列的最小花费. 题解: 第一部分(上下界最小费用可行流): 设$h_0=-inf,h_{n+1}=inf$,令$a$为$h$的差分数组,即$a_i=h_{i}-h_{i-1}$.考虑当对于区间$[l,r]$操作时(比如+1),相当于$a_{r+1}$减少1,$a_{l}$增加1.若将$a$数组…
传送门 比较简单的一道回滚莫队吧. 每次询问用bitset优化kosaraju统计答案. 就是有点难调. 然后向dzyo学长学习了回滚莫队的一种简洁的实现方式,就是直接建立一个sqrt(m)∗sqrt(m)sqrt(m)*sqrt(m)sqrt(m)∗sqrt(m)的动态数组按块存储询问. 这样好写得多. 还有就是学习了korasaju用bitset优化的写法. 代码: #include<bits/stdc++.h> #define N 155 #define M 300005 #define…
传送门 由于没有考虑n<=1的情况T了很久啊. 这题很有意思啊. 考试的时候根本不会,骗了30分走人. 实际上变一个形就可以了. 推导过程有点繁杂. 直接粘题解上的请谅解. 不得不说这个推导很妙. 然后就可以矩阵快速幂优化了. 代码: #include<bits/stdc++.h> #define ll long long using namespace std; ll a,b,n,mod; struct Matrix{ ll a[3][3]; Matrix(){a[0][0]=a[0]…
被FFT的空间卡了半天 后来发现根本不用开那么大... 首先可以把包含舰艇的那个小矩形找出来 将它一行一行连接成一个串T 其中舰艇位置为1其他位置为0 将大矩形也连成串S 其中礁石为1其他为0 两个串匹配起来如果某一位两个串是1和1 则礁石与舰艇会在同一位置不可能到达 那么这个匹配所对应的图中的位置就不成立 因为要确定每个位置可以想到将T翻转后做FFT后每一位(每一位代表了一个小矩形的匹配情况)上结果是0就可以匹配上 为1不成立 选出为0的 做一遍BFS 求出可以到达的位置 可以发现可行的状态里…
https://www.lydsy.com/JudgeOnline/problem.php?id=5217 Byteasar 组建了一支舰队!他们现在正在海洋上航行着.海洋可以抽象成一张n×m 的网格图,其中有些位置是“.”,表示这一格是海水,可以通过:有些位置是“#”,表示这一格是礁石,不可以通过:有些位置是“o”,表示这一格目前有一艘舰,且舰离开这一格之后,这一格将变为“.”.这些“o” 表示Byteasar 的舰队,他们每天可以往上下左右中的一个方向移动一格,但不能有任何一艘舰驶出地图.特…
题目思路挺巧妙的. 感觉应该可以数据结构一波,发现n很小可以搞搞事啊.然后又发现给了512mb,顿时萌生大力线段树记录的念头 一开始想的是记录节点的fa,然后发现搞不动啊?? 但其实边肯定最多只有n-1条,那么就可以记录选择的边,然后用归并合并即可 没清空答案还wa可一次(lll¬ω¬),浪费时间写暴力和拍(lll¬ω¬) #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib&…
要找的就是这棵树的带权重心,以带权重心为根时每棵子树的权值和不超过总权值和的一半. 因此按$\frac{v[i]}{\sum v[i]}$的概率随机选取一个点$x$,则重心有$\frac{1}{2}$的概率落在$1$到$x$的路径上,期望随机次数为$O(1)$. 随机方式可以直接随机一个$1$到$\sum v[i]$之间的数,然后相当于找第$k$小值,线段树上二分可以做到$O(\log n)$定位. 设$sum[x]$表示$x$子树的权值和,可以用LCT打标记维护. 在表示$1$到$x$路径的S…
题目大意:给你一棵n个点的树,每个点有颜色,m次询问,每次询问一个点x的子树内深度不超过depth[x]+d的节点的颜色数量,强制在线.(n,m<=100000,多组数据,保证n,m总和不超过500000) 思路:若不考虑深度限制,我们可以先给每个点赋点权1,再把每种颜色的节点按dfs序排序后相邻的节点的LCA的点权减1,每次求子树和即可回答询问,若有限制深度,我们可以按深度顺序把点一个个加入树中,每种颜色用个set维护,强制在线只要把求子树和的线段树可持久化就可以了,总复杂度O(nlogn).…
听学长说有比赛就随便打一打. A.普通计算姬 题目大意:给出一棵带权树,支持一下两种操作:1.修改一个点的权值:2.给出l,r,询问以点l为根的子树和.点l+1为根的子树和.点l+2为根的子树和--点r为根的子树和的总和.(点数.操作数不超过10^5) 思路:感觉是三题中最难的.给出的[l,r]区间在树上没有实际意义,不好利用数据结构维护.考虑若不修改,可以一遍dfs算出每个点对应的dfs序,这样每棵子树都对应一个dfs序的区间,前缀和一下就能O(1)查子树和,再按点的编号顺序把子树和前缀和一下…
提高十连测day3 A 我们可以枚举两个 $ 1 $ 之间的相隔距离,然后计算形如 $ 00100100 \cdots $ 的串在原串中最⻓⼦序列匹配即可,复杂度 $ O(n^2) $ .寻找 $ S $ 在 $ T $ 中的最⻓⼦序列匹配直接贪⼼的扫⼀遍就⾏了. 我们可以考虑优化这个过程,快速匹配连续的 $ 0 $ .只要⼆分找出下⼀个 的匹配位置即可. 由于 $ 1 $ 的个数为调和级数 ,所以总复杂度 $ O(n \log n) $ . #include<iostream> #inclu…
额 掰手指头一数 特么又是第三年十连测了= = 2017一场没打 那时候好像一场比赛也就100人左右 2018前几场还都好好补了 后来开始放飞自我了 这时候一场有150人还多了 2019想让今年的Noip不留遗憾 好像一场有200人多 现在好的能冲进前十不好也就三四十 主要是把题解里可以借鉴的思路和代码罗列一下 一. A.(ZROI954) 考虑对这玩意dp pi=1等价于右括号 pi=2等价于左括号 pi=3等价于左右任选括号 我们需要让其括号匹配的代价尽量小 然后排序顺序按照能力值大小,相等…
思路:20%可以搜索.. #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<iostream> #include<time.h> #define ll long long ; ll jc[],jcny[]; int n,m; int read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar()…
出题人居然是个哲学家.. 26%的程序,太SB了...本来我的想法也是二分+贪心,但是贪心是个怪怪的SX贪心.. #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<iostream> #include<time.h> #define inf 0x7fffffff struct edge{ int u,v,id; }e[]; ]…
思路:首先考虑t=1的情况,t等于1,那么所有位置的颜色相同,我们不用考虑概率的问题,那么,k+d*x在模d下都相等,我们考虑预处理一个数组s[i][j],代表d为i,起始位置为j的等差数列的和,这个可以证明,当模小于等于sqrt(n)的时候可以完美解决,时间复杂度为N^1.5,对于d大于sqrt(n)的情况,只需要暴力枚举就可以了. 再考虑t>=2的情况,我们选的颜色一定是颜色数最少的那个,颜色数最少的颜色的期望绝对是最小的,然后,我们分k的左边和k的右边进行计算,我们这里称呼k+d*x的位置…
思路:看到这题,就感觉是一道很熟悉的题目: http://www.cnblogs.com/qzqzgfy/p/5535821.html 只不过这题的K最多可以到N,而且边权不再只是1,考试的时候yy了一下做法: 找k次直径,第一次把边取反,要是第二次再取到同样的边,那就把它变成0,毕竟每条边只经过2次嘛,YY的很好,实际上,交上去,5分TAT 后来听以为神犇说不是取0,而是继续取反,每条边取一次就取反一次,woc.. PS还有一点:一开始我是准备找出里面一点,然后bfs找最远和次远的点,然后把路…
抄自:http://blog.csdn.net/coldef/article/details/61412577 当时看了就不会,看了别人的题解不懂怎么维护,最后抄了个代码....... 给定一棵n个点的树,每个点有颜色.m次询问,每次询问一个节点子树中深度和这个点深度之差<=d的点的颜色数量.多组数据,每组n,m<=10^5,总共小于500000 题解:如果不考虑深度,我们可以把相同颜色的节点按照dfs序排序,然后相邻节点在lca处-1,这样求子树和就可以求出答案了.考虑深度,我们就用主席树以…
A.普通计算姬 题意:给丁一棵树,每个点有一个权值,用sum(x)表示以x为根的子树的权值和,要求支持两种操作: 1 u v  :修改点u的权值为v. 2 l  r   :  求∑sum[i] l<=i<=r n,m(操作数)<=10^5 题解:数据范围比较小,考虑分块重建的做法. 求出每个点的dfs序和子树的区间,这样就可以On建出所有节点的sum的前缀和. 然后每次修改操作都把操作存下来,每次查询先找出这段区间的和,再去操作里处理这些操作对这个查询的影响. 具体实现就是:把每个点的子…
主席树 #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define rd read() using namespace std; const int N = 1e5 + 5; int ls[N], tot, n, m, q; int a[N], ans; vector<int> ad[N], reduce[N]; struct que { int…
今天的题目一共拿了$180$分,感觉自己还是太菜了,二三两题只能骗到部分分 1.$String\ Master$ 题目大意:有两个字符串,在允许k次失配的情况下,求最长公共子串的长度 没什么好讲,直接一个$O(n^3)$的解法就过了,数据范围很小,枚举公共子串在两个字符串的起点,在大于当前字符串长度或在大于$k$次失配后退出,更新答案. 话说卡常后拿了全站$rank1$ $Code\ Below:$ #include <bits/stdc++.h> using namespace std; i…
首先看两条链怎么合并,贪心可得是从大到小取max,多条链同理 所以dfs合并子树的大根堆即可,注意为了保证复杂度,合并的时候要合并到最长链上,证明见长链剖分 #include<iostream> #include<cstdio> #include<queue> using namespace std; const int N=200005; int n,a[N],h[N],cnt,id[N],tot,p[N]; long long ans; priority_queue…
题意 略 分析 稍微yy一下可以感觉就是一个不同子树合并堆,然后考场上写了一发左偏树,以为100分美滋滋.然而发现自己傻逼了,两个堆一一对应合并后剩下的一坨直接一次合并进去就行了.然鹅我这个sb把所有元素pop一次再merge进去-然后就O(n2)O(n^2)O(n2) 60分滚粗了- 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 时间复杂度分析: 每个点只会被pop出去一次,pop的时候伴随了一次pop一次merge. 每一对父子关系merge了一次 所以时间复杂度是O(nlogn)O(nlogn)…
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #include <string.h> #include <time.h> #include <stdlib.h> #include <string> #include <bitset> #include <vector> #include <…