cf
~无相~
这个作者很懒,什么都没留下…
展开
-
Greg and Graph
题目思路这题利用Floyd的逆操作,不断删除,倒过来就相当与不断的加入点,每次加入一个点再Floyd里面就相当于更新了这个点对于其他点最短路的影响,如果只计算已加入的点的最短路,那么此时发现已加入的点只被已加入的点更新过最短路了(有点绕),此时这些点的最短路就是只有这几个点的最短路,记录下每一次新加入点所有已加入的最短路的和即可。代码#include <cstring>#include <iostream>#include <algorithm>usin原创 2020-07-30 09:49:17 · 135 阅读 · 0 评论 -
cf-B GameGame
题目思路位数从高往低取,先记录下每个位数有几个为1的数字,如果最高位为1的数字有num个①:如果num%4==1,那么只要先手的人第一步先选一个最高位为1的数,那么后面的人只要取一个,那么先手的人跟着取一个,那么最后肯定是先手的人拿了奇数个最高位为1的数,后手的人拿了偶数个最高位为1的数,这样第一个人必胜②:如果num%2==0,那么无论num个数字怎么分配,最高位两个人都是相同的,所以直接判断下一个位即可③:如果num%4==3,那么如果第一个人和①一样先手取一个num中的数字,那么第二个人只原创 2020-07-28 10:09:50 · 224 阅读 · 0 评论 -
Prefix Flip (Easy Version)/(Hard Version)
题目思路做法:先把a全部变为1,或者变为0,做法是从前完后遍历,如果an和an+1不相同,就把前an做一次反转,这样就和an+1相同了,这样最多做n次,然后再从后往前遍历b和a,如果bi≠ai,就把ai前缀反转即可,这样最多n次,所以总共2n次代码#include<stdlib.h>#include<iostream>#include<stdio.h>#include<string.h>using namespace std;char a原创 2020-07-28 10:01:57 · 330 阅读 · 1 评论 -
Element Extermination
题目思路找到第一个大于a1的点,设为ak,那么a1和ak之间的都可以消掉,再去掉ak,继续找小于a1的第一个数,由此可以通过最后an是否大于a1判断能否全部消掉只留下a1代码#include <iostream>using namespace std; int main() { int tcase; std::ios::sync_with_stdio(false); cin >> tcase; while(tcase--) { int n; cin原创 2020-07-28 09:58:49 · 165 阅读 · 0 评论 -
Sequential Nim
题目思路如果要赢,那么一定要在最后一堆的时候是先手,这样全部拿走就赢了①:如果在中间有一堆为n的石堆且n>1,那么先手的人,可以决定下一个石堆是谁先手,如果想要自己先手,就取当前堆的n-1个石头即可,如果不想,就取全部,所以如果一个人在一个石头个数大于1的石堆先手,那么他就可以决定下面是谁先手②:如果中间有1,那么先手的人在下一堆必然变成后手,所以遇到1,先后手改变总结:如果中间遇到了一个大于1的石堆,因为可以决定下一步先后手,那么先手的人必胜,如果一直遇到了1,那么就先后手改变即可做法原创 2020-07-28 09:54:35 · 161 阅读 · 0 评论 -
cf D - Task On The Board
思路首先如果b中有两个位置是数值相同的,那么这两个数字肯定是对应同一个字符,这样的话,我们从b[i]等于0的开始想,b中为0的肯定是同一个字符我们用round记录一下这是第几次取出字符,例如如果b为 3 1 0 0,那么第三个和第四个索引就是round=1,表明这是第一个字符那么我们再去掉这个字符对其他字符的影响,由于这个字符b的值为0,那么这个数对应的字符肯定比剩下的字符大,也就是在其他字符的字母表的后面,那么对其他值都有影响,我们只要让其他字符(假设索引为j)都减掉abs(i-j)就可以了。每原创 2020-06-17 18:45:28 · 178 阅读 · 0 评论 -
cf- Social Distance
思路把每一个能放1的区间的长度求出来,这个区间可以放的最多1就是(len-1)/(k+1)+1,len为区间长度代码#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;struct point{ int l,r; bool operator < (const point& b)原创 2020-06-17 18:37:02 · 225 阅读 · 0 评论 -
B. Most socially-distanced subsequence
思路做法:其实这题目只要找到几个斜率变化的节点即可,起点和终点一定存下来。代码#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;const int N=1e5+5;int a[N];int main(){ int T; cin >> T; while(T--){原创 2020-06-14 12:18:35 · 1252 阅读 · 1 评论 -
cf:A. XXXXX
思路题意:从a取一段最长子序列使得子序列的和不是k的倍数做法:如果a中所有数字的和不是k的倍数,自然输出a就可以了,如果是k的倍数,那么只要减去一个不是k的倍数的数字即可,也就是说找到从左边开始第一个k的倍数,和从右边开始第一个k的倍数,判断一下那个减去后长即可。代码#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N=1e5+5原创 2020-06-14 12:16:27 · 3903 阅读 · 0 评论 -
cf:C. Ehab and Prefix MEXs
思路吐槽自己:首先这是一道思维题,如果想出来的话,几行代码就搞定了,但是昨天晚上愣是1小时做出了,菜鸡一个,下面讲一下思路做法:①:我们先找一下规律,首先明确,如果要在b[i]位置放一个数字,那么这个数字必然不可能是a[i]~a[n]出现过的数,因为如果是的话,讨论到后面的某个j位置时候,会发现a[j]这个数被用过了,那MEX就不可能是a[j]了。②:那么我们就用一个set,把所有从i位置以后(包括i)没有在a中出现过的数字存下来,每一次必然从这个set中取出一个数字,存入b数组中,之后每次取出s原创 2020-06-14 12:12:21 · 261 阅读 · 0 评论 -
cf:E. Two Arrays
题目思路做法:找到每一个b中每一个值的最后一个所在的索引,b中每一个值的最后一个索引必须在第i个区间,也就是如果a中有多个b[i],那么这些b[i]的最后一个b[i]必须在第i个区间,因为b是升序的,如果不在同一个区间会影响后面的区间的最小值,那么从b[i]的最后一个索引位置一直到最后一个小于b[i-1]的位置,这个区间的数字是可以变化的,也就是可以存入b[i-1]的区间,也可以留在b[i]区间,就是下图把所有每个区间这些数的个数相乘即可,当然,还要判断一下区间能所有的点是不是满足大于这个区间的最原创 2020-06-12 15:34:28 · 345 阅读 · 0 评论 -
cf:D. Two Divisors
题目思路定理:所有的数都可以分解成几个不同质数的若干次的乘积结论:只要一个数字能拆成两个及以上不同质数(不包括本身和1)的乘积,那么一定存在两个除数满足题目要求。推理:首先先把该数字拆成几个不同质数乘积的形式,x=ak1 * bk2 * ck3 …,如果只存在一个质数(不包括本身和1)或者x是质数,那么这个数是一定找不到题目要求的约数的,这个很容易想出来,如果存在两个及以上质数,那么取出一个质数 ak1 ,剩下的取出约数 x/ak1,ak1+ x/ak1和x不可能有公约数,因为x的约数只能由a,原创 2020-06-12 15:12:17 · 263 阅读 · 0 评论 -
cf:C. Palindromic Paths
题目思路我们很容易想到,如果一个点再一条路径的前半段上,距离起点的距离为x,那么,我们找到和终点距离也为x的点,观察一下两者关系由此得出,其实两种点相等,那么这时候只有两种可能,要么全为1,要么全为0,我们判断一下哪个改变次数小就行代码#include <bits/stdc++.h>#define MOD 998244353#define pb push_back#define ll long long int#define con 1000000007using na原创 2020-06-12 15:01:51 · 122 阅读 · 0 评论 -
cf:B. Shuffle
题目思路我们可以很容易想到,这题应该是先找到第一个包含x这个点的区间,然后后面的区间如果和这个区间有交集的话,就并在一起,不断扩展,最后这个区间的长度就是k可能的取值,当然,最后要判断一下有没有区间包含这个点,如果没有就输出1.代码#include <stack>#include <iostream>#include <cstring>#include <algorithm>using namespace std;int main(){原创 2020-06-12 14:47:53 · 203 阅读 · 0 评论 -
cf:Shovels and Swords
题目AC代码#include <stack>#include <iostream>#include <cstring>#include <algorithm>using namespace std;int main(){ int T; cin >> T; while(T--){ int n,m; cin >> n >> m; cout &l原创 2020-06-12 14:44:29 · 148 阅读 · 0 评论 -
Mike and distribution(思维)
思路题意:给你两个数组a和b,从其中取出n/2+1个索引,使得对于两个数组来说,这n/2+1个数的和的两倍大于整个数组的和做法:首先把题目转化为去除n/2+1个数字,使得比数组中剩下的数的和大,然后讲所有数字的索引按照a数组中值的大小从大到小进行排序。去第一个索引,之后每两个数字一组,取其中b值大的那个索引,下面来证明这个做法的正确性①:如果n是奇数,对于a数组来说,取完第一个数,也就是最大的数字,剩下偶数个数字,每次取相邻两个索引中b数组中值大的索引,假设我们按照最坏的打算去看,每次取到的索引在a原创 2020-05-27 13:46:59 · 129 阅读 · 0 评论 -
Special Permutation
思路题意:就是给你一个数字n,让你把所有1~n的n个数字按照某个顺序排成序列,使得相邻的两个数字差值在2 ~ 4之间(包括2和4)我们可以尝试一下分类,把所有奇数分成一组,偶数分成一组,如果n是偶数,我们把所有的偶数按照从小到大的顺序从序列开头开始排好,例如2,4,6,8……,最后一个数字是n,剩下n/2个奇数,我们可以把n-3放在n后面,然后把n-1放在n-3后面,之后就是按照顺序从大到小放置n-5,n-7……,例如2,4,6,8,5,7,3,1.如果n是奇数,就先把奇数从小到大放在前面,后面放原创 2020-05-10 10:59:23 · 651 阅读 · 0 评论 -
Alice, Bob and Candies
思路题意:就是一个人a从左边开始吃糖,一个人b从右边开始吃糖,每次吃的时候吃的糖必须比上一个人吃的多,求要几步才能吃完所有糖,并且输出每个人吃的糖的数量就是一个简单模拟代码#include <cstring>#include <algorithm>#include <iostream>#include <cmath>using namespace std;const int maxn=1e9+7;int v[1010];int mai原创 2020-05-10 10:52:40 · 431 阅读 · 0 评论 -
K-th Not Divisible by n
思路题意:就是让你求对于n这个数字,第k个不能整除n的数字是哪一个这题目扫描时肯定不行的,其实这题目是可以算出来的,如果把数轴分为长度为n的一段一段,那么每一段里面肯定有n-1个数字不能整除n,我们只要查一下第k个数字在那一段即可。代码#include <cstring>#include <algorithm>#include <iostream>#include <cmath>using namespace std;const int原创 2020-05-10 10:49:41 · 640 阅读 · 0 评论 -
Same Parity Summands
思路题意:让你从1~n内的数字中选出k个数字,使得所有k个数字和为n,并且这k个数字要么是奇数,要么是偶数。我们可以观察一下题目要求,进行分类讨论1.如果n是偶数,要分成k个偶数,我们可以令k-1数字都是2,这样可以分的偶数最多,最多可以分成n/2个2,那么k一定要小于等于n/2,这样我们令其中k-1个数字都是2,剩下一个数字就是n-(k-1)*2.2.如果n是偶数,分成k个奇数,那么前提是k为偶数,不然奇数个奇数不可能为偶数,我们可以令其中k-1个数字都是1,这样可以分成的奇数最多,那么k必须原创 2020-05-10 10:46:25 · 278 阅读 · 0 评论 -
Sum of Round Numbers
思路很简单的一个分解数字题,只要把每一位都处理出来,把其中0舍去即可AC代码#include <cstring>#include <algorithm>#include <iostream>#include <cmath>using namespace std;int number[10];int main(){ int T; cin >> T; while(T--){ int n;原创 2020-05-10 10:37:14 · 243 阅读 · 0 评论 -
[CF535D]Tavas and Malekas
分析代码#include <cstring>#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int mod = 1e9+7;const int N=1e6+5;int ne[N];int pos[N];char ...原创 2020-03-06 19:53:44 · 230 阅读 · 0 评论 -
Constanze's Machine
思路这是一个dp题,关键在于找递推公式:if (s[i] == 'u'&&s[i - 1] == 'u' || s[i] == 'n'&&s[i - 1] == 'n') { d[i] = (d[i - 1] + d[i - 2]) % mod; } else { d[i] = d[i - 1]; }为什么是这个呢?首先要能有其他的可...原创 2019-11-23 10:04:55 · 144 阅读 · 0 评论 -
D:Yet Another Monster Killing Problem
思路1.首先对英雄的攻击里排序,如果攻击力一样就看耐力,再从后往前遍历,求出攻击力大于heros[i].p的所有英雄的最大耐力是多少,存入c[i]中2.按顺序去遍历怪物,用一个mmax来存下消灭到当前怪物要达到的攻击力是多少,一个len来存要消灭的怪物的数量,其实就是要消灭的怪物中的最大攻击力是多少,然后用二分查找,找出第一个攻击力大于mmax的英雄,下标位idx,那么我们只要判断c[idx]...原创 2019-11-22 15:46:04 · 314 阅读 · 0 评论 -
Sweets Eating
分析一个贪心加找规律的题目,关键在于这个规律。先考虑i和i-1之间多了什么,其实就相当于再i-1的序列的最开头插入了一个a[i],对于i-1个数集体后移,其中只有离i-m+1有m个单位距离的数对解有影响,因为它们的天数改变了,那么ans[i]=ans[i-1]+a[i]+sum[i];sum[i]表示前面说的那些数的和,sum[i]与sum[i-m]之间有关系:sum[i]=sum[i-m]+...原创 2019-11-21 17:31:47 · 267 阅读 · 0 评论 -
C. Platforms Jumping
题意就是要你跨过一条水沟,长度位n,给你m个板子,每一个板子的长度告诉你,你可以跳d的距离,求如果要过水沟,板子的摆放情况。分析思路步骤:1.判断如果当前位置+跳的距离d+剩下板子的长度>=n+1,就表示把剩下的板子全部无缝连在一起,再跳小于等于d的距离就可以过水沟了。2.如果不能,就表示不只需要跳d,还需要多次跳跃,那么我们就把一块板子的起点放在当前位置,更新当前位置到板子的末端...原创 2019-11-21 16:23:36 · 148 阅读 · 0 评论 -
Stones
思路贪就完事了,由于两个操作的前提都是B堆要有东西,而且每次操作都是拿3个,那么要操作的次数多,肯定时B减小的越慢越好,那么肯定是优先操作2,在进行操作1。代码#include <iostream>#include <iostream>#include <algorithm>#include <cstdio>const int N = ...原创 2019-11-20 19:41:33 · 104 阅读 · 0 评论 -
B. More Cowbell
题意就是给你n个物品,尺寸都告诉你,让你放入k个大小相同的箱子里,最多可以放两个在一个箱子里,求箱子的最小尺寸。其实这题目就是一个字:贪,假设有i个箱子放入了两个物品,j个箱子放入了一个物品,那么i+j=k,i2+j=n;那么就可以知道i=n-k,并且一定有物品时单独放在一个箱子里的,排序后,只要对最大的物品,和前2i项求两个数加起来的最大值就可以了代码#include <iostr...原创 2019-11-20 18:58:23 · 160 阅读 · 0 评论 -
C. Match Points
分析先来看一个关系 对于一个升序序列a b c d 如果 b-a和d-c符合题目条件,那么c-a和d-b肯定也符合题目条件,但是哪一个更容易满足呢?由于上面的关系是不能反向推的,所以是c-a 和d-b更容易符合条件,也就是说我们选的时候应该从中点开始选(超过4个或者是序列数是奇数的时候也可以这样推,和结论是一样的),那么题目就很明朗了,那就只要用两个指针就可以了,一个在左半区间,一个在右半区间,...原创 2019-11-15 12:26:41 · 241 阅读 · 0 评论 -
Producing Snow
#include <iostream>#include<queue>#include<cstdio>#include<cstring>using namespace std;const int maxn = 1e5 + 10;int v[maxn];int t[maxn];long long sum[maxn];int main...原创 2019-11-15 11:16:33 · 225 阅读 · 0 评论 -
B. Sport Mafia
思路就是一个简单的二分,枚举放入的次数,每次都判断就可以了。代码#include<cstdio>#include<cstring>#include<string.h>#include<algorithm>#include<iostream>#include<vector>using namespace std...原创 2019-11-15 10:24:36 · 166 阅读 · 0 评论 -
B1. The Doctor Meets Vader (Easy)
思路把所有的飞船攻击力和编号封装起来,再把每一个基地的攻击力和黄金量封装,把飞船和基地按攻击力排序,之后就是对于每一个飞船能攻击的基地从小到大遍历,只不过可以把前一个飞船的遍历到的位置和能拿到的黄金数给存起来,这样下一个飞船就不用再从头遍历,只要从存下来的地方去遍历就可以了。代码#include<cstdio>#include<cstring>#include&l...原创 2019-11-15 09:46:12 · 222 阅读 · 0 评论 -
B. Alyona and a Narrow Fridge
题意就是把一个序列的数放入一个容器中,而且必须按顺序放,不能先把小的放进入,还有一个“隔板”的条件,如果忽略上面的几个条件,就是一个简单的贪心算法,其实这里的几个条件把贪心的条件变了而已,隔板的条件使得我们要把高度最相近的放在一行,我就用了排序来完成这一步,必须按序列顺序存入的话,我是假设能放入n个数,从小到大遍历n个数,第一个可以放入的n最大,直接输出就可以了。代码#include<...原创 2019-11-15 09:24:20 · 169 阅读 · 0 评论 -
C. The Labyrinth
题意其实就是把每一个‘*’换成‘。’让后对其用dfs,但是这样一定会超时的,所以这里要用一些预处理来提高算法的速度,先要把每一个连通图的节点个数求出来,然后只要对‘ * ’的四周判断是否有连通图,然后把连通图的节点个数加起来就可以了代码#include <iostream>#include <stdio.h>#include <string.h>#i...原创 2019-11-13 21:34:58 · 196 阅读 · 0 评论 -
线性结构上的动态规划
LISint main(void) { int a[6] = { 1,6,2,3,7,5 }; int d[6]; int max[6]; for (int i = 0; i < 6; i++) { d[i] = 1; max[i] = 0; for (int j = i - 1; j >= 0; j--) { if (a[j] < a[i]) ...原创 2019-11-02 16:44:30 · 110 阅读 · 0 评论 -
A2. Toy Train
题意(连接:http://codeforces.com/contest/1129/problem/A2)就是小火车在环形铁路上开,遇到车站每次都可以装卸糖果,以某个车站为起点,问把每一个糖果都卸到指定车站的最短时间,输出所有可能性结果分析对于一个车站,有x个糖果,至少要经过这个车站x次,因为每次都只能装一颗,那就意味着至少要跑x-1圈,那么在一圈中肯定已经经过了要卸货的车站,因为一圈嘛,所有...原创 2019-11-02 15:24:18 · 179 阅读 · 0 评论 -
Mike and Children
思路题意:给一组数组,每个数都不相同,求把每一个数两两相加,得到的相同的和的个数最多的是多大。理解:首先每一个数都是不相同的,那么对于一个两个数的和,就对应两个不同的数,那么就意味着只要统计每一个可能的和个个数就可以,再求个数最大的哪一个和,就可以求解了代码#include <bits/stdc++.h>#define INF 0x3f3f3fusing namespace...原创 2019-10-31 20:57:30 · 216 阅读 · 0 评论