codeforces 217E 【Alien DNA】】的更多相关文章

倒序考虑每一个操作,对于一个操作$[l, r]$,他产生的影响区间将是$[r+1,r + r + l - 1]$,如果$r+l-1>K$的话,$K$之后的区间我们是不关心的. 暴力扫描这个区间 然后对于每一个位置,维护一个类似于并查集的东西. 扫到位置$i$,定义数组$f$ 表示$i$这个位置上的字符是由$f_i$这个位置上的字符填充得到的.然后删除$i$. 这个东西具体怎么搞?我们可以弄一个长度为K,初始化为1的序列.获得第$i$个位置就是这个序列上第$i$个1,然后删除这个位置上的字符,就是…
题意: 给你两个串s1,s2和一个K, 有一种操作是在一个串切开然后交换位置, 问s1有多少种方法经过K次这样的操作变成s2: 思路: (从来没接触过计数DP...还是太菜...参考了[大牛blog] 首先呢,不管怎么切怎么换,都是原串自己转来转去有没有???看到这个其实我还是不懂.... 然后呢,我们搞一个DP数组记下数,纯粹就是计数的: dp[now][0]代表到第i步变成原串的方案数: dp[now][1]代表到第i步变成非原串的方案数: 从哪里变成原串啊?一个原串可以变成len-1个非原…
题意: 给你一个方程,方程太变态不打,给你一个p一个k,p保证是大于等于3的质数,k保证在0~p-1之间的整数.要求对应函数的定义域在0~p-1值域为0~p-1的子集,求这样的函数有多少个... 分析: [今天刚迷迷糊糊听了节集合论,做着做着就发现好像是循环群还是啥==] k=0时,不难发现f(0)=0,其他任意. k=1时,f(0)=f(0) mod p,发现除了其他任意外f(0)也任意. 当k>=2时,发现某规律... 不难发现假如k=2,则f(2)根据f(1),f(4)根据f(2)...以…
题意: 给你n个数,m次询问,每次询问给l和r代表l和r中间所有子区间中特征值的和. 特征值的定义是在这个区间中找i和j使得|tmp[i]-tmp[j]|/|j-i|最大. 思路: 首先是特征值的定义,这个东西其实是斜率~不知道从哪里看到的证明,这个只有相邻的点才可能最大.所以给定区间找到最大值其实是在相邻的中找.这是这题第一个关键点. 如果一个一个加寻找每一个区间那么复杂度应该是n^2,这里的n大小是1e5,还是不行.然后这个时候思路就是通过单调队列来解决啦~[个人认为更像是个DP]找到某个点…
题意: 有两个点喷水,有很多个点有花,给出坐标. 求使得每个花都可以被喷到,两个喷水的半径的平方的和最小是多少. 思路: 枚举其中一个喷水的最大半径. 坑: 这题我贪心的思路有很大问题.一开始也是想这样枚举的,但是思路超级混乱,按照r2进行贪心但是最后想想想法很荒谬. 顺序和题意一定要搞的很透彻才可以== #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struc…
题意:有n个人进行m次比赛,每次比赛有一个排名,最后的排名是把所有排名都加起来然后找到比自己的分数绝对小的人数加一就是最终排名. 给了其中一个人的所有比赛的名次.求这个人最终排名的期望. 思路: 渣渣的第一道概率DP...弱渣. dp[i][j]代表进行了i轮比赛之后得分为j的人数的期望,可以知道dp[i][j]来自于dp[i-1][j-m...j-1]的期望的人数乘以概率.这里就是前缀和,用树状数组进行优化... 但是要注意,转移的时候一定要排除已经知道的名次的影响,不能用已知名次来转移...…
这道题其实难度应该小于紫题...除了一点小特判以外没什么难度...\(\leq50\)行代码即可\(AC\)此题 题目大意:给定两个数\(a,b(1\leq a,b\leq 10^{14})\)分别表示红色方格个数和蓝色方格个数,求这\(a\)个红色方格和\(b\)个蓝色方格构成的矩形周长的最小值,且满足在所构成的矩形中至少有一种颜色的所有方块也能构成一个矩形,数据保证存在至少一种合法的染色方案. 这道题本质是数学题,根据矩形周长一定时长与宽的差越小矩形面积越大可以反推出矩形面积一定时长与宽的差…
题目大意:给定一个\(n(1\leq n\leq 2\cdot10^5)\)个节点的树的\(n-1\)条边和这棵树的一个\(BFS\)序\(a_1,a_2,\dots,a_n\),判断这个\(BFS\)序是否是一个从节点\(1\)开始的合法\(BFS\)序,若合法则输出\(Yes\),否则输出\(No\) 题目核心问题是判断给出的\(BFS\)序的合法性,根据\(BFS\)的定义,每个节点的所有子节点在加入队列时应当是连续的,且同深度的节点的子节点入队顺序应该整体与父节点入队顺序相同,不妨把每个…
论Div3出这样巨水的送分题竟然还没多少人AC(虽说当时我也没A...其实我A了D...逃) 这个题其实一点都不麻烦,排序都可以免掉(如果用\(priority \_ queue\)的话) 先考虑不删除区间的情况,那么答案应该由所有区间中左端点坐标最大的区间和右端点坐标最小的区间决定(手动模拟一下加入新的区间造成的更严格的约束即得),所以想在删掉一个区间后使得剩余的区间的交尽可能大只需要考虑删去左端点最大的区间和右端点最小的区间即可 一定有人会问如果左端点最大且坐标相同的区间不是一个的时候删哪一…
\(qwq\)昨天晚上\(Div.3\)过了这道题...早上交了\(1A\)...看在\(CF\)上\(hack\)的情况并不乐观而且也没人来交这题的份上...我决定发一篇题解帮\((zhuang)\)助\((yi)\)大\((bo)\)家\((x)\) 题目大意:给出\(n\)个数\(a_1,a_2,\dots,a_n\)和\(k\),求对于任意的两个数\(a_i,a_j(i\neq j)\),使得两数连接起来组成的新数(如\(12\)与\(3456\)连接组成\(123456\))是\(k\…
LINK 题目大意: 给你n个物品,每一个物品有一个位置p和一个权值w,移动一个物品的代价是移动距离*物品权值 有q个询问: 把第i个物品的权值变成j 问把第l到第r个物品移动到一个相邻的区间中\([x,x+r-l]\),问你最小的代价 思路 首先我们很显然地发现一定是可以固定一个位置不动的,然后把剩下的移动到这个位置附近 接下来我们考虑怎么找到这个位置 我们设\(S_{(l,r)}=\sum_{i=l}^r w_i\) 假设我们现在要固定移动\([l,r]\)这个区间,且区间中的第k个位置不变…
LINK 题目大意:给你n个数,你可以交换一个数的任意二进制位,问你可以选出多少区间经过操作后异或和是0 思路 充分必要条件: 区间中二进制1的个数是偶数 区间中二进制位最多的一个数的二进制个数小于等于和的一半 然后因为每个数最少会贡献1,所以直接暴力向前跳128位,再之前的就直接前缀和做掉就可以了 #include<bits/stdc++.h> using namespace std; #define LL long long #define IL inline #define fu(a,b…
[题目][https://www.lydsy.com/JudgeOnline/problem.php?id=4892] 好像用\(SAM\)做的都是\(dfs\)啊 其实这里也是搜索 如果用\(SAM\)来做非常好理解,就是从\(SAM\)上匹配这个字符串,允许有不超过三条转移边不一样 于是\(dfs\)做法非常显然了,就是爆搜这三条不一样的转移边在哪里,但是复杂度看起来好像很迷,可能是\(\binom{n}{3}\)也就是\(O(n^3)\)级别 但是由于很多情况下选择某一条转移甚至都无法在\…
这种区间的贪心好像都出"烂"了? 不过还是想写一下... 先按照区间左端点排序一下,然后搞个优先队列维护当前最小的右端点. #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e5+10; struct asd{ int x,y; }q[N]; bool cmp(asd a, asd b) { if(a.x==b.x) return a.y<b.y; retu…
思路: a素数->b合数 c素数->b合数 a,c属于一类 so,预处理相同的,并且计数.1000怎么搞都无压力: 我这里也预处理了字母个数,从集合大的枚举下来,每次拿字母个数最多的去匹配. #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e3+10; bool isprime(int x) { if(x==1) return false; int q=sqrt(x);…
思路: 暴力..我不会呀.. YY一个二分匹配嘛,然后数组开小了.GG for an hour. #include <bits/stdc++.h> using namespace std; typedef long long LL; int cy[110]; int cx[110]; int n,m; char ma[15][15]; int g[15][15]; int mma[110][110]; int dx[4]={1,-1,0,0}; int dy[4]={0,0,-1,1}; bo…
思路: 原来string类能sort 和 swap....太强了.... 注意:字典序最小输出,因为某个地方写挫了,sort了n发,代码挫. #include <bits/stdc++.h> using namespace std; typedef long long LL; int tol; map<string,int>id; map<int,string>xs; string ss[20],sss[20]; bool ma[20][20]; int main()…
题意: 判断这副图是否满足根是一个环的缩点,然后其余点都是一个点,满足树特性. 思路: 一开始就像无向图缩点乱搞,然后实在太烦搞不下去.... 一副图是满足结点和边数量相等,且连通,则一定有一个环. so...实际代码只有判连通= = #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e2+10; int ma[N][N]; bool vis[N]; int n,m; void DF…
题意: 有一个长度为n的序列,序列有长度为1...n的连续子序列, 一个连续子序列里面最小的值称作这个子序列的子序列的strength, 要求出每种长度的连续子序列的最大的strength. 思路: 以当前位置为最小值,向两边延伸. 那我就能知道这个位置作为最小值时长度. 具体思路忘了... 给出几组数据希望能有启发? /* 10 1 2 3 4 5 4 3 2 1 6 10 100000 99999 99998 99997 99996 99995 99994 99993 99992 99991…
题意: 给你一个串只有小写字母和点,让你构造前缀是1-8,后缀是1-3长度的文件名: 思路: 那么以"."作为分割点,把字符串都拿出来,然后 首段长度<=8 OK; 中间<=11 OK; 尾段<=3 OK; 否则都不行: 啊,水题啊,wa了一次,T了一次,神TM都是数据开小了, 一个是4e5写成5e4... 一个是不满足的情况可能会很长,才开了...25... #include <bits/stdc++.h> using namespace std; ty…
思路: 一开始是没有办法贪心的,但是答案是可以二分的,因为窝能买k辆车的话,窝就一定能买k-1辆车:而且我最好就是拿手上钱较多的那些人去买价格便宜的车,这样肯定是能买到最多的车,而且花的少,因为对于要买的车公共钱的话够得话,那就直接公共钱付了就行,而要付出的钱是一定要付的. 所以直接二分答案. 然后人的总花费=最有钱的那些人去买最便宜的那些车的情况: #include <bits/stdc++.h> using namespace std; typedef long long LL; type…
题意: 给出n,a,b以及n个整数a1,a2-an, 可以对数组进行以下两种操作: (1)花费len*a的代价删除连续的len个数,len<|S| (2)花费b的代价将某一个a[i]加一或减一,每个数最多执行一次这样的操作: 使得这个数组所有数的GCD>1: 求最小花费 思路: 因为删除操作不能一下子删完,所以肯定会剩下一个,那么就会是头一个或者最后一个.所以剩下的数可能有a[1]-1,a[1]+1,a[1],a[n],a[n]-1,a[n]+1.预处理出所有数的质因子,枚举每个质因子之间默认…
题意(来自网络): 现在有k件商品,每个商品的位置已经告诉你了 现在有n个人,每个人有m个需求,每个需求就是要把第a[i][j]个物品拿到第一个位置来 他的代价是pos[a[i][j]] 问你所有代价是多少 思路: 就是每次+,每次调整,还有滚动数组这种不错欸~ #include <bits/stdc++.h> using namespace std; typedef __int64 LL; int pos[2][110]; int main() { int n,m,k; scanf(&quo…
题意: 给你一副图,给出的点两两之间的距离是abs(pos1-pos2),然后给你n个数是表示该pos到x的距离是1. 思路: 直接建边,跑spfa就好了.虽然说似乎题意说边很多,其实只要建一下相邻的点的边就好了,这样的图的性质还是得到了: // d*##$. // zP"""""$e. $" $o //4$ '$ $" $ //'$ '$ J$ $F // 'b $k $> $ // $k $r J$ d$ // '$ $ $&…
题意: 给一颗树,根节点深度为1,每一个节点都代表一个子母. 数据输入: 节点数 询问数 从编号为2的节点开始依次输入其父节点的编号(共有节点数减1个数字输入) 字符串有节点数个小写字母 接下来询问 a b 代表以a为根节点的子树在深度为b(包含)的范围内所有节点的字母能否组成回文串. 能输出Yes,不能输出No 思路: 1.dfs序,对于每个节点,我们在深度和字母组成的二维数组里边记录进入节点和离开节点的时间戳. 2.用到upper_bound和lower_bound函数对该深度之下各个时间的…
题目链接: https://www.luogu.org/problemnew/show/P3763 思路: 首先我们要用到Rabin-Karp哈希,其实就是这个: 若\(w_{str}\)=(\(a_0\) \(p^{n-1}\)+\(a_1\) \(p^{n-2}\)+...+\(a_{n-1}\) \(p^0\)) 所以 \(w_{pre_{i-1}}\) \(=(\) \(a_0\) \(p^{i-1}\)+\(a_1\) \(p^{i-2}\)+...+\(a_{i-1}\) \(p^0…
B. Complete The Graph time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output ZS the Coder has drawn an undirected graph of n vertices numbered from 0 to n - 1 and m edges between them. Each edge…
C. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output ZS the Coder is playing a game. There is a number displayed on the screen and there are two buttons, ' + ' (plus) an…
题目链接: http://codeforces.com/gym/100825 题目大意: N(N<=600)个点,每个点有个名字Si,R(R<=200)个生产商在R个点上,F(F<=200)个工厂在F个点上,不会有一个点既有生产商又有工厂 有T(T<=1000)个公司,每个公司能够到达Ci个点,并且一个只能运输一个生产商的货物.比如生产商1给工厂1运输货物需要用到公司1,那么其余生产商就不能用公司1 一个工厂需要任意一个生产商供应货物,求最多能够给多少个工厂供应货物. 题目思路:…
题目链接: http://codeforces.com/gym/100825 题目大意: 给你一张N*N(N<=100)的图表示一个树桩,'T'为年轮,'.'为空,求每个'T'属于哪一圈年轮,空的为'.',如果最内圈<10,每个格子用两位表示,否则用三位,不足的用'.'补足. 题目思路: [宽搜] 初始所有点标记为INF,先将图上所有的'.'标记为0,边缘如果有'T'记为1,并把'.'和边缘所有的点加入队列,接下来一个一个上下左右扩展并更新答案,没进队的进队.最后输出. // //by coo…