
Codeforces
AKone123456
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
B. Saving the City---------------------------思维(贪心+模拟+套路)
题意:给定01串,1代表需要爆破的点。爆破1当前位置连通块需要花费a的代价如果把0变成1 需要花费b的代价问最少需要花费多少使得全部变成0题解贪心(套路题):如果在全都不是0的情况下,最少爆破一次。那我们就枚举每两个连通块之间0的个数 然后贪心计算是把0转换成1爆破划算,还是按照连通块个数爆破划算 。假设 区间0的个数为x那么总的修改次数贡献为 :x * b再加上还要爆破一次:x * b+a所以判断一下 x * b+a < 2 * a 如果小于我们就贪心的把这段0都变为..原创 2020-11-05 21:14:01 · 339 阅读 · 0 评论 -
E. Clear the Multiset-------------------思维(分治+套路)
题意:给定n个数,2种操作第一种操作:横切切到底第二种操作:竖切切到底请问最少操作使得n个数为0解析:第一种横切得贡献是每次找到最小的然后切去,然后分治递归下去,详细看代码第二中竖切得贡献是r-l+1;两者取最小值。#include <bits/stdc++.h>using namespace std;const int N=1e5+100;int a[N];int n;int solve(int l,int r){ if(l>r) return..原创 2020-08-26 21:43:02 · 221 阅读 · 1 评论 -
D. Zigzags----------------------------思维(暴力+前缀和)
解析:枚举j和l 然后n^2暴力统计j左边的数出现的次数。枚举l的时候,如果出现a[j]==a[l],就要累加上[j,l]区间的 [1,j-1]这些数出现的次数即可,详细看代码吧,说的不咋地#include <iostream>using namespace std;typedef long long ll;int cnt[3005];int a[3005];int t,n;int main(){ cin>>t; while(t--)..原创 2020-08-26 17:22:43 · 281 阅读 · 0 评论 -
C. Binary String Reconstruction------------------------思维(模拟)
解析:暴力模拟#include <iostream>using namespace std;string s;int t,n,x;int a[200050];int main(){ cin>>t; while(t--) { cin>>s; cin>>x; int n=s.size(); s='0'+s; for(int i=0;i&l..原创 2020-08-26 17:11:28 · 181 阅读 · 0 评论 -
B. RPG Protagonist-------------------思维(贪心)
解析:对于刀和剑,我们肯定贪心选择单位最少的一个。那么我们枚举刀选了多少把假设刀选了i把那么主人要选剑的时候就是num1=min(cntw,(p-i*s)/w) 要减去选刀的代价跟随者也肯定选择单位最少的一个,所以跟随着一开始也选刀 那么就是num2=(cnts-i,f/s) 因为主人一开始选了i把需要减去跟随着选剑的时候num3=min(cntw-num1,(f-num2*s)/w)因为主人一开始选了剑所以要减去。又因为跟随者算了刀,携带的单位就要减去。枚举的答案就是 i+num1..原创 2020-08-26 16:57:27 · 259 阅读 · 0 评论 -
Binary String To Subsequences-------------------------思维(队列)
题意:给定长度为n的字符串,让你把字符串分成多个子序列,使得每个子序列都不会出现连续相同的数?问最少划分多少个子序列,输出每个字符在第几个子序列中解析:用两个队列分别记录0和1出现在哪几个组中当遇到1的时候,我们判断q0是否为空,如果为空,则需要新分组。如果不空当前1可以和队头组成一组,然后把队头出队。再把1的分组序号记录到q1队列中遇到0 同上即可。#pragma GCC optimize(3,"Ofast","inline")#include<bits/stdc++.h>..原创 2020-08-06 10:34:43 · 329 阅读 · 0 评论 -
D. Odd-Even Subsequence--------------------思维(二分+贪心)
解析:答案具有单调性,所以二分答案。分别讨论奇区间和偶区间的最小值贪心取a[i]<=x ,后面的那个数给另一个区间。这样的会使前一个区间选取更多的数。因为如果后面一个数<=x 所带来的贡献依然不变的。假设讨论奇数区间,当前i符合奇数区间,那把i+1放到偶区间里面。取min之后答案依然还是<=x的,因为奇数区间永远都是符合条件的。偶数区间也是相同道理的。所以直接二分答案即可#include<bits/stdc++.h>using namespace std;...原创 2020-07-08 18:44:41 · 254 阅读 · 0 评论 -
C. Number Game-----------------------思维(博弈)
题意:给你一个n,现在有两种操作。第一种操作就是n除去奇因子第二种操作:n=n-1有两个玩家操作,谁到达不能移动局面谁就输解析:先分析特殊情况n=1,先手必败n=2,先手必胜n%2==1,先手必胜,因为我一定存在一个奇因子就是n,n/n=1 ,那么后手就不能操作了,所以先手必胜n是偶数时如果存在一个奇数因子x, 那么n/x一定是偶数且不存在奇因子。那么后手只能-1,n变成了奇数,那么先手就一定必胜了如果不存在一个奇数因子x,那么先手必须-1,这时n为奇数,后手一定必胜#incl..原创 2020-07-08 16:51:20 · 227 阅读 · 0 评论 -
D. Maximum Sum on Even Positions-----------------------思维(类最大子段和)
题意:给定n个数,只能选择一个子段然后翻转,问偶数下标最大的和是多少?解析:这道题和最大子段和相似,但是多了一个翻转一段子段。而且这道题我们选择子段的长度必须是偶数,(因为如果长度是奇数的话,偶数下标对应还是原来的数).我们先把原数组的偶数下标之和求出来。然后我们用类似求最大子段和的方法来求出每个偶下标和奇下标翻转对答案带来的贡献首先如果是偶下标 ,那么我们要和奇下标交换,说明奇下标的数比偶下标的数要大所以带来的贡献就是a[i-1]-a[i]+sum (之前的最大贡献)如果是奇下标 ,..原创 2020-07-07 19:22:30 · 500 阅读 · 0 评论 -
C. Pluses and Minuses-----------------------思维
解析:求贡献。用一个前缀和来表示当前i是否重新cur++假设前缀和为sum当前第i步,sum<0 那么对答案的贡献就是i 。然后对应伪代码,我们要给cur=i+1,当前第i步,sum>=0 直接跳过最终还需加上整个长度,因为如果前缀和都不为0的话,我们就相当于全部遍历一遍。#include<bits/stdc++.h>using namespace std;const int N=1e6+1000;typedef long long ll;char s[N..原创 2020-07-07 19:11:40 · 329 阅读 · 0 评论 -
E1. Reading Books (easy version)--------------------思维(贪心+模拟)
解析:我们将书分为三种第一种:只有Alice 喜欢第二种:只有Bob 喜欢第三种:Alice和Bob都喜欢我们只需贪心地单独取就是第一种和第二种分别取。如果数量不够k个,那么我们就要从第三种里面开始取。等取够k个的时候,我们再从第三种里面去找最优的情况,来代替单独取,使得答案最小#include<bits/stdc++.h>using namespace std;const int N=2e5+1000;typedef long long ll;ll a[N],b[N...原创 2020-07-06 15:09:47 · 334 阅读 · 0 评论 -
D. Zero Remainder Array---------------------------思维
题意:给定n个数,和一个k两种操作:第一种操作:选择一个数ai=ai+x ,x=x+1第二种操作:x=x+1问最少的操作次数可以使得所有ai%k==0解析:我们先求出每个数距离k最近的操作次数是多少 所以让每个ai%k然后从大到小排序一下,我们找到出现次数最多的(如果次数一样的,选择最小的那个数这就是为什么需要从大到小排序了)。假设n=4,k=6A[i]:1,3,3,3次数最多:3次(mx)次数最多的数:3(maxnum)想一下第一个3肯定要变成6 那就是(k-3)既然..原创 2020-07-06 14:21:53 · 389 阅读 · 0 评论 -
B. Multiply by 2, divide by 6-----------------------思维(分解质因子)
题意:给定一个n,可以*2,可以除6 问最少操作多少次使得n变成1 如果不可以就输出-1解析:弱项之一n一定是6的倍数,又因为6由质因子2和3组成,那么n一定也是由2和3组成的。我们分解一下,分解出m2个 2 ,分解出m3个3对于-1的情况:第一:如果分解到最后,n>1,说明还有其他质因子,不满足条件第二:m2>m3 如果2的个数大于3 的个数 那n只能除 m3个6 ,不能变成1。而且不能减少2的个数(除2的操作)答案:m2<=m3 如果2的个数小于3的个...原创 2020-07-02 22:22:25 · 634 阅读 · 0 评论 -
D. Two Divisors-----------------------------思维(数论+gcd性质+唯一分解定理)
题意:给定n个数,对于每一个数找到两个因子d1和d2 d1>1且d2>1 使得gcd(d1+d2,ai)=1如果没有就输出-1解析:唯一分解定理ai=p1q1 * p2q2 * … pnqnd1=p1q1d2=p2q2 * … pnqnd1和d2互质的因为:gcd(a,b)=gcd(a+b,b)所以:gcd(d1,d2)=gcd(d1+d2,d2);又因为:gcd(a,c)=1 则gcd(a,bc)=gcd(a,b)所以:gcd(d1+d2,d2)=gcd(d1+d.原创 2020-06-12 16:27:11 · 420 阅读 · 0 评论 -
C. Palindromic Paths------------------------思维
解析:回文路径,如上图所示 两条红线对应的元素必须都是一样的,两条绿线对应的元素必须是一样的(如果不相同其中一条路径肯定不会是回文路径)。所以最终我们只要求所有的斜线对应的元素是否一样,不一样我们就统计这两条斜线1的数量和0的数量,哪个最少我们就改哪个。但是遍历斜线又很麻烦。我们可以根据坐标(x,y)来统计 走到第几步就是x+y-1那么第x+y-1 的贡献就是 cnt[x+y-1][a[x][y]]++最后遍历相对应斜线的走的是第几步来计算答案#include<bits/stdc+..原创 2020-06-12 15:12:50 · 262 阅读 · 0 评论 -
D. Solve The Maze------------------------------------思维(bfs)
题意:给定n*m的方格,方格上有墙,空地,好人和坏人,你现在可以在空地上放墙堵住坏人,使得所有好人都能逃脱到(n,m)但是坏人不可以。如果可以输出YES 如果不行输出NO解析:我们先把坏人用墙给围住,如果坏人相邻的有好人,那么坏人一定可以逃脱所以输出NO然后我们从(n,m)开始bfs,遍历那些好人。最终判断那些好人有没有遍历到,如果没有输出NO,否则输出YES#include<bits/stdc++.h>using namespace std;const int N=500;..原创 2020-06-12 10:57:09 · 282 阅读 · 0 评论 -
C. Johnny and Another Rating Drop----------------------------思维(找规律)
解析:找规律对于这种二进制串算贡献的,一般我们都要按位处理我们样例 n=5来说000001010011100101第0位对答案的贡献为:5 也就是(n)第1位对答案的贡献为:2 也就是(n/2)第2位对答案的贡献为:1 也就是(n/22)再举个例子;0000000100100011010001010110011110001001第0位对答案的贡献为:9 也就是(n)第1位对答案的贡献为:4 也就是(n/2)第2位对答案的贡献为:2 也就是(n/..原创 2020-06-05 09:48:29 · 276 阅读 · 0 评论 -
D. Yet Another Yet Another Task----------------------------------思维
题意:给你n个数,现在你要选一段区间然后减去区间的最大值,问答案最大是多少?解析:我们枚举最大值,因为-30<=ai<=30,范围很小然后遍历一遍求最大值即可。#include<bits/stdc++.h>using namespace std;const int N=2e5+1000;int a[N];int n; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i];/..原创 2020-05-29 23:40:21 · 284 阅读 · 0 评论 -
D. The Best Vacation------------------------------思维(双指针)
解析:我们先把环形拉成线性。处理一下每月可获得拥抱数我们选择肯定是选择每个月的最后几天。所以如果有多余的天数话,我们只要用当前的拥抱数-多余x天总的拥抱数即可。#include<bits/stdc++.h>using namespace std;const int N=5e5+10000; typedef long long ll;ll d[N];ll sum[N],val[N];ll n,k;int main(){ cin>>n>>k; ..原创 2020-05-27 14:28:57 · 312 阅读 · 0 评论 -
C. Celex Update--------------------------------思维
#include<bits/stdc++.h>using namespace std;typedef long long ll;ll a,b,c,d;int t;int main(){ cin>>t; while(t--) { cin>>a>>b>>c>>d; cout<<abs(c-a)*abs(d-b)+1<<endl; }}原创 2020-05-27 14:17:36 · 264 阅读 · 0 评论 -
D. The Best Vacation----------------------------思维(模拟)
解析:统计每个字符出现的次数,然后放到set集合中遍历set更新答案,如果当前个数x>=*it 更新答案即可#include<bits/stdc++.h>using namespace std;const int N=1e5+1000;int a[N];map<int,int>v;set<int> s;int t,n;int main(){ cin>>t; while(t--) { cin>>n;...原创 2020-05-27 14:15:44 · 200 阅读 · 0 评论 -
F. Spy-string--------------------------------思维(暴力枚举)
题意:给定n个长度为m的字符串,让你构造一个字符串,使得与这n个字符串不同的地方少于1解析:根据题意不同的地方最多只有1个,那么我们在n个串里面随便找一个串作为基准串。然后我们暴力枚举修改每一个位置(修改为’a’~‘z’),.然后再和n-1串作比较。如果不同之处>=2,那么是肯定不行的。那么时间复杂度:O(tm26nm)#include<bits/stdc++.h>using namespace std;int t,n,m;string s[20];int main(..原创 2020-05-25 20:02:26 · 288 阅读 · 0 评论 -
B. Orac and Models-------------------------思维(dp)
解析:和最长上升子序列是一样的。是不过我们要枚举能整除i的数然后状态转移状态转移方程:f[i]=max(f[j],f[i]+1)#include<bits/stdc++.h>using namespace std;const int N=1e5+1000;int f[N];int a[N];int q[N];int tot,n;int main(){ scanf("%d",&tot); while(tot--) { scanf("%d",&n)..原创 2020-05-20 23:41:44 · 322 阅读 · 0 评论 -
C. Orac and LCM-----------------------思维(数学公式)
解析:gcd(lcm(a1,a2),lcm(a1,a3),lcm(a1,a4),…,lcm(a1,an))因为都有一个共同因子a1所以 gcd1=lcm(a1,gcd(a2,a3,a4,…,an)同理gcd2也是这样的。最终答案是gcd(gcd1,gcd2,gcd3,…,gcdn)所以我们只要求出一个后缀gcd即可重要性质:gcd(lcm(a1,a2),lcm(a1,a3),lcm(a1,a4),…,lcm(a1,an))=lcm(a1,gcd(a2,a3,a4,…,an)#includ..原创 2020-05-20 23:35:45 · 429 阅读 · 0 评论 -
D. Multiset-----------------------------思维(树状数组+二分)
题意:给定n个数,和k次询问。每次询问如果qi<0 就删除第|qi| 个每次询问如果qi>0 就把qi插入到集合中问最后集合是否为空,为空输出0,不空输出里面的元素解析:用树状数组维护qi>0的操作,即在对应的位置上+1当qi<0 时我们二分枚举位置,找到符合的边界假设为x那么我们就要在位置x上-1.最后只要遍历一下C[i]数组,不空就代表着存在元素。如果都是空输出0#include<bits/stdc++.h>using namespac...原创 2020-05-20 16:25:57 · 285 阅读 · 0 评论 -
B. Ternary String----------------------------------思维(二分)
#include<bits/stdc++.h>using namespace std;int t,n;string s;bool check(int x){ map<int,int > v; for(int i=0;i<x;i++) v[s[i]-'0']++; if(v[1]&&v[2]&&v[3]) return true; for(int i=1;i<n-x+1;i++) { v[s[i-1]-'0']-...原创 2020-05-19 00:13:34 · 330 阅读 · 0 评论 -
A. Alarm Clock-----------------思维(模拟)
#include<bits/stdc++.h>using namespace std;typedef long long ll;ll a,b,c,d;int t;int main(){ scanf("%d",&t); while(t--) { cin>>a>>b>>c>>d; if(b>=a) cout<<b<<endl; else if(c<=d) cout<&...原创 2020-05-18 23:46:33 · 411 阅读 · 0 评论 -
D. Game With Array-----------------------------思维(找规律+构造)
解析:找规律 s<n*2 肯定输出NO那么剩下来的。我们只要构造出n-1个1,和一个(s-(n-1))那么只要k=n 就可以满足答案了#include<bits/stdc++.h>using namespace std;int n,s;int main(){ cin>>n>>s; if(s<n*2) cout<<"NO"<<endl; else { cout<<"YES"<<en..原创 2020-05-16 23:27:05 · 234 阅读 · 0 评论 -
A. Sequence with Digits------------------------------思维
解析:数据看着很吓人,其实只要模拟一下就知道,很快就有0出现,0一旦出现,答案就固定不变了。所以判断由0出现,我们就终止程序,输出答案即可#include<bits/stdc++.h>using namespace std;typedef long long ll;ll a1,k;int t;int main(){ cin>>t; while(t--) { cin>>a1>>k; k-=1; while(k--) {..原创 2020-05-16 22:49:42 · 566 阅读 · 1 评论 -
E. K-periodic Garland------------------------思维(dp)
解析:设:f[i][0] 表示前i个合法,并且第i个字符为0的最小操作次数f[i][1] 表示前i个合法,并且第i个字符为1的最小操作次数状态转移方程:f[i][0]=min(f[i-1][0],f[i-1][1])+(s[i] == ‘1’)f[i][0]合法只需要i-1合法就行f[i][1]=min(pre[i-1],f[i-k][1]+pre[i-1]-pre[i-k])+(s[i] ==‘0’)f[i][1]合法只需要i-k的状态合法。如果i~k之间还存在1,那么我们肯定要把i ..原创 2020-05-15 21:34:27 · 399 阅读 · 0 评论 -
D. Constructing the Array-------------------------思维(优先队列)
解析:对于每一个分界点,都会分成两端,我们用优先队列存储,这样可以让区间长度长的且在左边的,优先处理#include<bits/stdc++.h>#define x first#define y secondusing namespace std;const int N=2e5+10000;int a[N]; int t,n;struct node{ int x; int y; friend bool operator<(node a, node b) { ..原创 2020-05-15 20:15:29 · 253 阅读 · 0 评论 -
G. Special Permutation-----------------------思维(构造)
题意:给定一个n,让你构造一个数组满足 1<=ai<=n 且2<=|ai-ai+1| <=4解析:对于n<4 是无法构造出数组的,所以输出-1正确做法:先把所有奇数从大到小输出来 然后再依次输出4,2 然后把剩下来的偶数从小到大输出 即可#include<bits/stdc++.h>using namespace std;int t,n;int main(){ cin>>t; while(t--) { cin..原创 2020-05-15 19:57:53 · 247 阅读 · 0 评论 -
F. Binary String Reconstruction----------------------------思维(构造)
题意:给定a个“00”串,b个“01”或者“10” ,c个“11”然你组成一个最短的字符串,使得每两个字符,满足以上条件即可。解析:要求最短,那么我们可以发现 "01"和“10” 可以由“00”,“11” 过渡过来所以我们先构造出a个"00" 串,c个”11“ 对于”00“和”11“连接起来”0011“ 会产生一个"01"串,所以我们b-1 .最后在把(b-1)个"01"串接上去即可#include<bits/stdc++.h>using namespace std;i..原创 2020-05-15 19:27:02 · 331 阅读 · 0 评论 -
B. Phoenix and Beauty----------------------------思维
题意:给定n个数和一个m,现在你可以在任意位置插入任意数量的数,使得连续m个数的和都是一样的。如果不可以得到就输出-1 。可以得到输出长度和数组元素解析:如果n个数中不同的元素个数>m 则输出-1否则我们就复制前m个数n次 (注意的是连续m个数不同元素的个数要等于m,如果不等于m我们还需要添加元素进去)例如4 32 2 3 4这个样例正好不同元素个数正好等于m。所以直接复...原创 2020-05-02 14:21:44 · 373 阅读 · 0 评论 -
E. Weights Distributing---------------------------------思维(bfs+贪心)
题意:给定n个点,m条边,和m个边权。问你从a走到b,再从b走到c 最短的路程是多少注意(整张图是无权图,权值需要自己添加)解析:会出现两种情况第一种情况: a直接走到b,b直接走到a 那么最短路程一定是 把最小的边权加上去。第二种情况: a->x ->b->x->c 会出现这种情况比如样例一就是的。所以我们可以枚举x(x可以是a,b,c) 随...原创 2020-04-24 17:11:37 · 261 阅读 · 0 评论 -
D. Xenia and Colorful Gems-----------------------------------思维(二分)
题意:给定r个x,g个y,b个z,求(x−y)2+(y−z)2+(z−x)2 最小是多少解析:做法:先固定x,然后二分枚举y和z然后固定y ,然后二分枚举x和z在固定z ,然后二分枚举x和y#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e6+1000;...原创 2020-04-17 19:54:44 · 248 阅读 · 0 评论 -
C. Linova and Kingdom----------------------------思维
题意:有n个城市(每个城市要么是旅游城市,要么是工业城市),现在你必须选出k个城市为工业城市使得这k个城市到1号点经过的旅游城市最多。请输出最大经过旅游城市的数量解析:用f[u]:记录u子树节点的个数用depth[u]:记录u节点的深度。然后每个点对答案的贡献 就是depth[u]-f[u]然后从大到小排序选出前k个即最大值#include<bits/stdc++.h&...原创 2020-04-17 17:00:35 · 528 阅读 · 0 评论 -
C. Dreamoon Likes Coloring-------------------------------------思维
题意:给定长度为n的方块,有m种颜色,每种颜色可染长度为li 询问m种颜色每个颜色的起点是多少。使得最终所有方块被染色,且有m种不同颜色解析:每个颜色染色的起点应不小于自己序次对应的方格。代码上有注释#include<bits/stdc++.h>using namespace std;const int N=1e5+1000;int n,m;int a[N];i...原创 2020-04-05 21:39:03 · 258 阅读 · 0 评论 -
B. Dreamoon Likes Permutations--------------------------------------思维(模拟)
题意:给定n个数 范围[1,n-1] 让你找到分割点,使得左边的数从1排列,右边的数也从1排列解析:用两个set维护左右集合符合条件的 最大数== 区间长度 && 最大数==区间个数#include<bits/stdc++.h>using namespace std;const int N=2e5+1000;int a[N];int t,n;v...原创 2020-04-05 17:59:15 · 323 阅读 · 0 评论 -
D. Dreamoon Likes Sequences------------------------思维
题意:给你d和m,构造一个数组a,使得a递增,使数组b(b1=a1, ∀i>1,bi=bi−1⊕ai)递增,问你构成a有几种可能,答案模上m解析:1.b数组的生成 b[i]=b[i-1]^a[i] 想要b[i]递增,那么a[i-1]第i-1位是1,那么a[i]第i位必定是1。否则b数组不再是单调递增的。例如 a[i-1]=2 那么a[i]=4(不能是3,因为会把最高位的1给...原创 2020-04-05 16:01:57 · 259 阅读 · 0 评论