codeforces
文章平均质量分 61
johsnows
正在静下心来学算法的acmer
展开
-
cf1101 D GCD Counting (树dp)
挺简单的树dp,两个点之间的公共素因子不会超过7个,枚举和子节点之间的公共素因子情况,有公共素因子就可以转移,长谷ide树dp去做就行了。代码:#include <bits/stdc++.h>#define ps push_backusing namespace std;const int maxn=2e5+5;int a[maxn], ans;int d[maxn][8];int cnt[maxn];int dp[3][8][maxn];int s[30], m.原创 2020-07-31 10:46:21 · 162 阅读 · 0 评论 -
cf1262D2 Optimal Subsequences (Hard Version)(二分答案+bit)
解法:转换题意后,这题就是给定一个序列a,给出m个询问,问[0,k]的第pos小的数.特殊就特殊在是从0开始的。可以保存询问,我们让不同的询问ki从小到大排列,从小到大枚举k,将前ki个数存入树状数组,这时候可以通过二分答案来枚举答案mid,查询小于等于mid的数num,找出num=pos的最小的mid,就是第pos小的数了。时间复杂度是O(nlog^2n)应该能更快...还没...原创 2019-11-29 19:37:19 · 236 阅读 · 0 评论 -
codeforces 831 E Cards Sorting(bit+stl)
题意:n个牌,牌上有数,每次从牌顶取出一张牌,如果这张牌是当前的最小值那么就把它扔掉,不然放到牌堆底,问需要多少次操作把牌扔光。解题思路:将牌记录下初始位置,按大小排序,然后按顺序取出,用树状数组查询扔牌的时候前面访问了多少张牌。但是需要注意个问题,从一个最小值取完的时候,下一个最小值的牌的选择应该要从上一次扔牌的右边第一张开始。比如32 1 2这组数据,扔原创 2017-07-14 15:25:47 · 554 阅读 · 0 评论 -
codeforces 828 c String Reconstruction(扫描线+string)
题意:给出一个字符串的n个子串,并且给出这n个子串在原串里出现的位置,现在让构造出一个字符串符合题目的给定的条件,并且字典序最小。解题思路:直接xjb填子串的话肯定是超时的,所以要想办法避免重复的填。其实很简单,在每个位置上都放一个标记,标记这里有一个长度为len的子串,然后我们o(n)扫一遍就可以了,标记的时候可能有重复,我们留下len最长的那一个就可以。然后原创 2017-07-13 11:11:48 · 422 阅读 · 0 评论 -
coderforces 814 D. An overnight dance in discotheque(贪心)
题意:一个坐标系上有若干个不相交的圆,可以将其中的一下圆放到第二个坐标系中去,问两个坐标系中被覆盖奇数次的区域的面积的最大值。解题思路:首先没有被包含的圆的面积是最大的,是一定要取的,直接放到第二个坐标系就好了,然后就可以直接两个坐标系分别求面积就好了,因为你会发现第一个坐标系的圆再往第二个移的话总面积也是不会变或者变小。主要的原因大概是第一个坐标系剩余的圆如果是嵌套的话,移动原创 2017-06-09 20:30:25 · 562 阅读 · 0 评论 -
codeforces 382 B Number Busters(推公式)
给出 a, b, w, x, cc每秒c--;a的话,if(b>=x)b-=x;else {a--;b=w-(x-b);}问最少经过多少秒后c解题思路:最少多少秒的话,最后一个状态一定是处于一个a没变,c--的过程。然后具体分析,最好的情况是经过c-a秒,就达到了,这样验证一下就好。b=w-(x-b);转换一下,就是b=b-x+w.其实对于b来说,每次都是要-x原创 2017-06-21 11:54:35 · 432 阅读 · 0 评论 -
codeforces 814 C. An impassioned circulation of affection(暴力)
题意:给出一个长度不超过1500的字符串(小写字母),询问不超过20000次,每次询问有一个数字x和字母y,x代表你可以改变字符串里x个字符为任意小写字母,y时询问你能得到的最大的连续为y的子串。解题思路:预处理出26个字母替换n次的答案,每种情况,去暴力枚举左端点,然后二分右端点,先预处理出一个每个字母在字符串中出现次数的前缀和,然后二分中的check直接利用这这个前缀和原创 2017-06-08 17:00:30 · 347 阅读 · 0 评论 -
codeforces 812 E. Sagheer and Apple Tree(树上博弈)
题意:a和b在玩游戏,一棵树有n个节点,每个叶子节点的深度的奇偶性相同,每个人每次可以有两次操作,第一种是将一个非叶子节点的苹果移动到儿子节点上,第二种是将叶子节点的苹果吃掉。a先手,b每次游戏开始前可以进行一次交换,把u,v两个节点的苹果数量交换,问有多少队u,v,使最后b获胜解题思路:考虑在普通的nim上增加一个操作,就是可以增加一堆石子。那么这个操作实际上是没有用的,原创 2017-06-02 17:12:31 · 791 阅读 · 0 评论 -
codeforces 812 C. Sagheer and Nubian Market(二分答案)
题意:n个商品,有s块钱,买第i件商品的价格为a[i]+i*k,a[i]为商品的基础价格,k为总共要买的商品数量,问最多能买多少件商品,在买相同数量的商品情况下,尽量让花的钱最少。解题思路:二分枚举要买的商品数量,然后排序一下价格,check是否能买到当前答案数量的商品,求出一个最大值即可。代码:#include using namespace std;c原创 2017-06-02 17:20:35 · 607 阅读 · 0 评论 -
codeforces 812 B Sagheer, the Hausmeister(枚举)
题意:有n层楼,小明需要从一层楼的左边开始去关n层楼种还未关灯的房间的灯,其中一层中最左边和最右边都是楼梯,问小明关完所有灯的时间,不需要计算返回的时间解题思路:小明到达一层楼只有从左边和右边楼梯上来两种情况,离开也一样,所以一旦确定当前这一层楼小明是从哪边上来,要从哪边离开,那么这层楼要怎么走就已经确定下来了。这里n只有15,所以我们只需要2^x(有灯亮的最顶层)去枚举每一层原创 2017-06-02 17:28:56 · 406 阅读 · 0 评论 -
codeforces 617 E. XOR and Favorite Number(莫队)
题意:n个数,m个区间,问区间内有多少对(i,j)a[i]^a[i+1]^......a[j-1]^a[j]==k,k已给出。解题思路:离线的查询,用莫队最好了。第一次写莫队,所以理解还比较浅。莫队算法的原理是基于由已知[l,r]的答案推到[l,r-1],[l-1, r],[l, r+1], [l+1, r]的答案是o(1)的,所以我们可以先算出一个区间的答案,然后再逐原创 2017-06-02 21:48:29 · 448 阅读 · 0 评论 -
codeforces 27 E. Number With The Given Amount Of Divisors(反素数)
题意:求最小的约数个数为n的数解题思路:反素数经典问题。这题要求的就是反素数,因为反素数的质因子一定是连续的,所以可以dfs枚举在连续几个质因子上的个数,即枚举种t1,t2,t3,每一个素因子的幂,来算出当前的数的因子个数,对于等于n的我们更新一下答案,使答案更小即可。更形象一点的还是看acdreamers的博客吧,看到搜索树的图就很好理解了。代码:原创 2017-06-05 11:39:50 · 321 阅读 · 0 评论 -
codeforces 831 D Office Keys(dp)
题意:n个人要去一个地方p,给出每个人的一维坐标a[i],去这个地方需要一把钥匙,总共有k把钥匙,给出每把钥匙的坐标b[i],问n个人最后都到达了这个地方需要多少经过多少时间,每个人走一个单位距离需要一个单位时间。解题思路:看起来很复杂的题,有目的地坐标还有钥匙坐标,其实仔细想想,取到钥匙后,接下来还需要的时间也随之确定下来了,所以只需要考虑人和钥匙的关系即可。可以原创 2017-07-14 16:36:01 · 792 阅读 · 0 评论 -
codeforces 200 c Football Championship(枚举)
这题真的是有点毒,没说数据范围,我怕数太大分两次去二分,但是二元关系分两次二分还是错了。然后看了qls代码发现,数据范围其实很小。。那直接枚举check就ok了啊这一场题的顺序全是乱的,第一次打这样的cf,心累。。代码:#include using namespace std;struct node{ int point; string原创 2017-07-06 10:00:22 · 328 阅读 · 0 评论 -
gym 101137 L Lazy Coordinator(概率)
题意:对题库有两种操作,一种是在ti时刻加一道题,一种是在ti时刻减一道题拿来比赛,问每道题待在题库里的期望时间。思路:从后往前考虑,当前项i为减一道题时,之前的题在这一时刻被取出的概率是1/k,k表示之前还剩多少道题,而在这之后取出的概率就是1-1/k,用sum表示从n到i+1之间某一刻取出的期望时间,那么从n到i某一刻取出的期望时间就是sum*(1-1/k)+1/k*tim原创 2017-11-25 20:14:32 · 488 阅读 · 0 评论 -
codeforces 897 D Ithea Plays With Chtholly(交互)
题意:每次给你一个数,让你放到一个长度为n 的数组里,直到这个数组填满并且是不递减函数为止。需要 在m步内完成c是给出的数的范围。解题思路:一种显然的暴力方法就是从1开始扫描,遇到第一个大于x的或是a[i]==0的就放。但是还有显然的卡掉这种暴力的做法,就是把数n-1逐个给出,就每次要替换,这样的话就需要n^2次,显然不行。所以应该能想到从两边,开始扫描,让大于c...原创 2017-12-03 15:51:41 · 579 阅读 · 2 评论 -
codeforces 449 D Jzzhu and Numbers(容斥+dp)
这题真的爆炸难懂...待补。代码:#include using namespace std;const int mod=1e9+7;const int maxn=1e6+5;int dp[maxn];long long p[maxn];int main(){ int n, i, j, x; cin>>n; for(i=1, p[0]=1; i<原创 2017-08-23 20:29:12 · 331 阅读 · 0 评论 -
Gym - 101334E Exploring Pyramids(dp+分治)
题意:给出一个多叉树先序遍历序列,问有多少种不同的树的结构能跑出这样的序列,答案对1e9取模。解题思路:可以考虑一颗树在什么位置进行了怎样的分叉决定了它的情况,所以我们在不同的位置枚举不同的分叉, 统计情况就可以了。对于一个没有分叉的一条到叶子节点的链,它的先序遍历一定是一个回文串。所以一条链能产生一个分叉关键条件是否由两个及以上不重叠子串组成。这个过程可以递归分治得到。原创 2017-08-28 10:03:30 · 312 阅读 · 0 评论 -
codeforces 839 D Winter is here
最后johsnows做jonsnow的题tle在了39...大概是因为我是假的snow吧。这个题的想法挺套路的。想法就是去枚举倍数,看有多少个数是当前这个数的倍数,这些数的gcd一定是当前这个数的倍数,假设有n个数,题目所求为gcd*k,枚举1注意求1-n的i*C(i,n)需要求一下公式,不能暴力求。先把C(i,n)拆成阶乘的形式,就可以看出来i*C(i,n)就是n*(i-原创 2017-08-13 17:36:42 · 498 阅读 · 0 评论 -
codeforces 832 D Misha, Grisha and Underground(倍增)
题意:给出n个点的树,q个询问,每次询问给出3个数x,y,z问选两个点作为起点,到第三个点的路径有多少个点重合。解题 思路:distance(x,y)=distance(x,root)+distance(y, root)-2*distance(lca(x,y),root).x,y为起点时,答案就是(dis(x,z)+dis(y,z)-dis(x,y))/2 。重原创 2017-07-26 20:22:42 · 589 阅读 · 0 评论 -
codeforces 707 D Persistent Bookcase(dfs+bitset)
题意:对一个n*m的01矩阵进行操作。第一种操作是将x行y列的数置1.第二种操作是将x行y列的数置0.第三种操作是将x行的数取反。第四种操作是将矩阵回到第x次操作后的矩阵。解题思路:说是可持久化数据结构,我最近又刚刚学了主席树,就真的被骗去写可持久化了,然后还没有写出来QAQ。其实这个题目由于n,m小于1000,本身操作消耗的时间很短,所以不需要可持原创 2017-07-20 16:26:52 · 256 阅读 · 0 评论 -
codeforces 287 C. Lucky Permutation
题意: ppi = n - i + 1.构造一个1到n的序列满足该式子。解题思路:观察一下可以发现四个为一组。如:2 4 1 3Pp1=P2=4-1+1=4Pp2=P4=4-2+1=3Pp3=P1=4-3+1=2;Pp4=P3=4-4+1=1;1和4的位置对应到3和2的位置,满足四个为一组的能构成,如果多一个也可以,放在最中间Ppi正好等于自己也原创 2017-06-15 15:21:18 · 314 阅读 · 0 评论 -
codeforces D 287 Shifting
题意:看示例吧。解题思路:一开始打了个表,找了找也没规律。后来一想,这题在动的只有每块的第一个数,其它的都是往前移,如果用stl模拟下岂不是美滋滋,然而我想vector和set去了,然后时间也不多,就gg了。感觉还是太蠢,用队列不是就完美实现坐标前移了。然后这个题还需要发现一个一个特性就是,每次移动就相当于所有的每块的一个数形成的序列循环右移,然后整个序列左移,就相原创 2017-06-14 22:22:51 · 368 阅读 · 0 评论 -
codeforces 200 D Programming Language(stl)
题意:给出若干个函数声明,再给出若干变量定义,然后给出若干个函数调用,问每个调用有多少个声明的函数是符合这个调用的。解题思路:直接把非法字符变成空格然后用stringstream再读入一遍,这样处理字符串简直不能更方便,然后接下来的比较其实就很暴力了。代码:#include #define ps push_backusing namespace std;s原创 2017-07-06 11:36:17 · 302 阅读 · 0 评论 -
codeforces 794 D Labelling Cities(脑洞)
题意:一个图有n个点,m条边,保证整个图连通,问能否构造出一种权值,使得两个点之间权值差小于等于1当且仅当两个点有边相连。解题思路:其实感觉想法应该都是有的,但是很难整合出来,在几个点之间不互相连接的前提下,一个点如果连接其中超过2个点,肯定就不能构造出这样的权值。然后比较难想的就是可以把相邻的点集合(包括自己)相同的点的权值都赋值为相同,但是知道了这个后是很容易想通的,因为他原创 2017-05-16 11:32:55 · 801 阅读 · 0 评论 -
codeforces 794C Naming Company(贪心)
题意:x,y两人轮流从各自的字符串a,b(长度都为n)里选择字符,形象的来说就是往一个长度为n里的容器里放所选择的字符,x先手,x想最后的字典序越小越好,y想最后的字典序越大越好,问他们两都采取最优的策略,问最后获得的字符串是什么解题思路:首先我们容易想到,x只能取出前n/2小的字符来投放,并且,最后字符的位置一定是字典序递增的,因为想最后的字典序最小,而y是只能取出前n/2大原创 2017-05-16 11:04:24 · 1051 阅读 · 0 评论 -
codeforeces 792 C. Divide by Three (dp || 贪心)
题意:一个1e5长度的数字,去掉几个数字后让它是三的倍数,要求去掉的数最少,而且要去掉前导零解题思路:一开始瞎贪心,面向数据编程后终于搞出来了。其实总结起来只要注意五种情况1.sum%3==0,直接输出就行2.sum%3==1.去掉一个1。3.sum%3==1.去掉两个2.24.sum%3==2.去掉一个2.5.sum%3==2.去掉两个1对于s原创 2017-03-28 21:57:13 · 411 阅读 · 0 评论 -
codeforces 498 A Crazy Town
A. Crazy Towntime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputCrazy Town is a plane on which there are n inf原创 2016-12-04 14:11:15 · 349 阅读 · 0 评论 -
codeforces 755 d PolandBall and Polygon(找规律)
题意:给一个凸n边形,给定一个数字k,保证gcd(n,k)等于1,每隔k个点连一条线,问每连一条线凸多边形被划成多少块。思路:容易得出,每次画一条线,它所多划分出来的块数就是它穿过的线数加一,而它所穿过的线的数量就是这条线连接的两个点之间,已经有线连接的点的数量乘2.例如在2和4之间连 一条线,2和4之间3已经被连接了,所以2和4这条线穿过的线的数量就是1*2。但是原创 2017-01-16 13:19:18 · 726 阅读 · 1 评论 -
codeforces 768 B Code For 1 (数学)
题意:一个集合里一开始只有n这个数,每次操作把集合里大于1的数分为,,,三个数,它们的位置在原位置,知道集合里所有的数都是0和1.现在循环l到r区间内有多少个1,保证r-l例如:解题思路:一开始用链表去模拟做,内存炸了.然后开始想去计算的办法.我们可以发现原创 2017-02-21 09:39:22 · 656 阅读 · 1 评论 -
codeforces 768 D Jon and Orbs(概率dp)
题意:琼恩要派遣游骑兵去鬼影森林获取龙晶,共有k种龙晶,鬼影森林每天产生一种龙晶,由于长城以北过于危险,所有琼恩想知道让每种龙晶都至少有一件的概率大于p/2000至少需要多少天.共有q次询问,琼恩忙于和山姆讨论战术,这些问题就交给你啦.解题思路:概率题不会啊,QAQ,好不容想懂了题意,但是不会.不能理解题意的同学可以考虑,因为每天可能产生之前出现过的龙晶种类,所以即使k天也原创 2017-02-21 17:21:29 · 1067 阅读 · 0 评论 -
codeforces 768 C Jon Snow and his Favourite Number(循环节)
题意:有一个长度n的数列,琼恩有一个喜爱的数x,琼恩每次去隔一个 数对数列里的数异或,请问k次操作后数列里最大的数和最小的数分别是什么解题思路:这种题一般来说操作后的数列是有循环节的,然后看到群里qc爸爸问有没有循环节不是2的例子的时候就更确定了。先去模拟下操作,然后每次操作出来的数列都去和之前得到的数列比较,看看是否有相同的数列,如果有就找到循环节了,只要让k对应到这个循环节原创 2017-02-21 09:53:30 · 1235 阅读 · 0 评论 -
codeforces 763 C Timofey and remoduling(数学)
题意:给出序列a,质数m,序列长n,序列a是对m取模后的序列,问是否能找到一个原序列是等差数列,输出首项和公比。否则输出-1。解题思路:首先需要知道两个公式:1.等差数列各项和公式变形:a1=(Sn-n*(n-1)/2*d)/n2.等差数列各项的平方的和的公式:Sn^2=n(a1)^2+n(n-1)(2n-1)d^2/6+n(n-1)*d*a1(以前不知道这公式。。)原创 2017-02-10 16:36:16 · 939 阅读 · 0 评论 -
codeforces 767 c Garland(dfs)
C. Garlandtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputOnce at New Year Dima had a dream in which he was presente原创 2017-02-19 19:53:55 · 1125 阅读 · 0 评论 -
codeforces 767 b The Queue(模拟)
题意:n个人排队去办理通行证,给出办公室开始办理的时间s和停止办理的时间d,以及办理一个人的通行证需要花费的时间t,小明也想去办理通行证,在知道n个人都是什么时间(a[i])来的情况下,小明想知道自己什么时候去自己能够办理到通行证且等待的时间最少,另外小明如果和别人同时到,他会排在这个人后面思路:模拟.我们模拟经过第i个人后,办公室要在什么时间才能办理,用变量记录,一开始就原创 2017-02-19 19:34:09 · 511 阅读 · 0 评论 -
codeforces 766 c Mahmoud and a Message(dp)
题意:给一串字符串,只包含26个字母,可以把这串字符串分成若干个子串,但是限定每个字母只能出现在长度Ax的子串里,问最多有多少种分割方案,方案数对1e9+7取膜,以及分割子串最大长度,和最少分割子串数量。解题思路:设dp[i]为从0到i这段字符串的分割方案数,为了满足字符a[i]的限定条件,我们只能在i-Ai+1到i之间划分,设len=i-A[i]+1, 但是i-A[i]+1并原创 2017-02-08 17:04:34 · 633 阅读 · 0 评论 -
cf 766 d Mahmoud and a Dictionary(带权并查集)
题意:给一些单词,它们可能是同义或者反义,给出一些关系定义,从前面的定义开始建立关系,如果有的关系定义和之前的冲突输出NO,否则输出YES。然后查询q次单词x和单词y的关系。解题思路:很明显就是带权并查集,但是我不太会用,去网上找了食物链的代码,改了下代码,但是每改公式,强行把关系差为2和3的都当做反义关系,结果错了。结束后去学习了下带权并查集,然后直接把公式改了改就过了,发现原创 2017-02-08 10:34:19 · 339 阅读 · 0 评论 -
codeforces 735 D Taxes(数学)
题意:给你一个数,可以将它拆成n个数加和(n大于等于1),求这几个数最大因子(不包括自己)加和的最小值。思路:给这道题跪了,没有想到用哥德巴赫猜想,就当做是学姿势吧。对于一个素数来说,它最大因子就是1,所以答案明显是1.对于合素,分奇数偶数两种情况,对于一个大于6的偶数,可以拆成两个素数的和,所以它的最小值就是2,然后奇数可以通过减去一个非偶质数得到一个偶数,所以答案是原创 2016-11-28 19:34:50 · 408 阅读 · 0 评论 -
codefoces 724 c Ray Tracing (扩展欧几里德)
题意:给定一个矩形,长n宽m, 一束光从矩形的一个顶点发射,角度为45度,遇到墙壁则反射, 只有遇到顶点时被吸收, 给你k个光传感器,光传播的速度是根号二m/s,问经过多少时间,光经过这个传感器, 若不能经过,则输出-1。思路:将矩形对称展开,把所有反射当做穿过看待,容易想到光在横纵坐标都为maxnx= m*n/gcd(m,n)(m,n的最小公倍数) 处吸收,因为光总是沿着y原创 2016-10-11 09:02:08 · 452 阅读 · 0 评论 -
cf 721 d(优先队列+贪心)
题意:给一个数列,一种操作,操作是:给定X,可以对数列里的数加x或者减去x。给定数字k,允许操作k次,求经过k次操作后,使数列的乘积最小,输出操作后的数列。思路:看示例后发现这个题应该把最小的数尽量往小了减,直到出现负数,是最终结果值为负,然后去找绝对值最小的值,不管它们正负,去把绝对值加大。这样子想只想对了一部分,没有考虑一开始数列有可能就存在负数,使值为负,也有可能一开始有负数原创 2016-10-02 22:22:37 · 408 阅读 · 0 评论