- 博客(75)
- 收藏
- 关注
原创 E. Tracking Segments(二分)
接下来的q行每一行都包含一个整数x(1 <= x <= n)——需要设置为1的数组元素的索引。保证查询中的索引是不同的。比如a = [1,0,1,0,1],那么段[1,5]是漂亮的(1的个数是3,0的个数是2),但段[3,4]不是漂亮的(1的个数是1,0的个数是1)。每个测试用例的第一行包含两个整数n和m(1 <= m <= n <= 10^5)——分别是数组a的大小和段的数量。对于每个测试用例,输出一个整数——最小变化数,在此之后至少有一个线段是美丽的,或者如果没有线段是美丽的,则输出-1。
2023-07-05 15:53:45
292
原创 2021沈阳J.Luggage Lock(bfs+记忆化)
题解:先用bfs预处理一下,用jy[10000]记忆化处理,每次有20种走法,但是因为标记数组存在,最多循环9999次复杂度为2e5。我们取每次的(差值+10)%10作为初始值计算到0000的最短次数,因为从0000开始到差值和差值到0000是一样的次数,所以用bfs#include<iostream>#include<bits/stdc++.h>#define csh(a) memset(a,0,sizeof(a))using namespace std;type
2021-11-23 00:17:06
987
原创 2018桂林J - Stone Game(博弈)
传送门题目爱丽丝和鲍勃总是在玩游戏!今天的游戏是依次从石堆中取出石头。 有n堆石头,第I堆包含A[i]块石头。由每堆石头的数量与其邻居的不同,他们决定在不破坏财产的情况下,一次从其中一堆石头中取出一块石头(不能在拿走一块石头后,相邻的不同石头变相同)。爱丽丝先走。 拿不到石头的玩家将输掉游戏。你应该注意到,即使是一堆0石也还是被视为一堆!题解只需每次判断可以拿走多少次sum,当sum是奇数,A赢,反之B赢。1、当a[i]都小于两边,a[i]可以变成0;2、当a[i]都大于一边,.
2021-11-15 18:49:12
2985
1
原创 1601A - Array Elimination(位运算)
CF传送门题目:你有a1到an个数,现在让你选K个数,X=a1&a2&......&ak,让这k个数再减去X,求能使得a1~an都为0的k值可能为什么?题解:我们可以将数字转成二进制来解决,拿案例来说明:13:0 1 1 0 1 7:0 0 1 1 125:1 1 0 0 119:1 0 0 1 1当k=1时,自己减去自己。当k=2时:会使得都为1的地方为0。 13和7配对 :01000和00010 25和19...
2021-11-08 23:50:05
197
原创 1607D - Blue-Red Permutation(贪)
1607D - Blue-Red Permutation题目:int数组a和char数组b,当b[i]=R时可以将a[i]增大,b[i]=B时可以将a[i]减小。求是否能将a[i]变成包含1~n的数组。题解:用pair数组存储,对其进行排序,贪心一下,让B在前面,R在后面。因为B只能减小,所以放在前面,R反之。#include<bits/stdc++.h>#define ms(a) memset(a,0,sizeof(a));typedef long l
2021-11-07 11:53:04
364
原创 1606C - Banknotes
1606C - Banknotes题目n种不同类型的钞票,ai表示钞票是10^ai。f(s)表示s由钞票组成的最小个数。例如:当,f(59)>>9*1+5*10>>f(59)=9+5=14给你 n个 ai 和 k,求f(s)>k的s题解f(s)>k代表f(s)=k+1;我们要先用最小额度的钞票,一旦超过了第二个钞票的额度就不能在用第一种钞票了;例:k=13 a=0, 1 ,2;这时候10^0取9张,10^1取5张,答案为59;...
2021-11-02 19:45:29
383
原创 1603B - Moderate Modular Mode(数论)
1603B - Moderate Modular Mode题目:有两个偶数x,y,求n使得n%x=y%n。题解:1.当x>y时,(x+y)%x=y,y%(x+y)=y。2.当x<=y时,y - ((y % x) / 2)表示 x小于y的最大倍数maxx,加上(y-maxx)/2。例如:x=4,y=10 maxx=8,y-maxx/2=1;因为(y-maxx)/2<x;y - ((y % x) / 2)%x=(y-maxx)/2因为y和y - ((y % x) /
2021-11-01 15:57:17
317
原创 1603A - Di-visible Confusion
1603A - Di-visible Confusion题目:一个长度为N的数组从a1,a2,…,an。如果在存在不能被整除则可以删除,剩下的数变为a1,a2,…,an-1。求是否能使得数组为空。题解:每个数都会因为前一个数被删除而前移,所以遍历所有情况,对数组中进行判断( 2~i+1)中是否存在使得不被整除的情况。#include<bits/stdc++.h>#define ms(a) memset(a,0,sizeof(a));typedef long lon...
2021-10-31 20:32:40
467
原创 猜谜三人组
题解:因为我们可以让其变成0 ~ a 的c***个数suma,和0 ~ b-1的c****个数sum,答案等于sumb-suma。sum可以通过1.得出位数xs2.而后先将到该位数的c***个数取满3.进行判断x是否在c*和(c+1)***-1之间,然后判断(如 c为2,c*为20 (c+1)*为29)。#include<bits/stdc++.h>#define ms(a) memset(a,0,sizeof(a));typedef long long ll...
2021-10-28 22:47:29
330
原创 1581B - Diameter of Graph
1581B - Diameter of Graph 题目:n,m,k分别表示n个点,m条边,图的直径<k-1;图的直径为 两点之间最小的边数 的最大值。题解:图的直径只有1,2 ,不存在的情况。不存在的情况是:,边数大于最大边可存在的数。,不能连接每条边。直径为2的情况:,这时候总会有 两点之间最小的边数 为2。注:拿一个点做中转,剩下的点连接中转点。直径为1的情况:,这时两点之间最小的边数总是为1。#include<bits/stdc++...
2021-10-28 18:05:47
209
原创 1592B - Hemose Shopping
https://codeforces.com/problemset/problem/1592/B题目:一个长度为n的数组a,对a进行排序,排序需要满足,判断他是否可能变为非递减数组。题解:取数组两端 x,n-x。只需判断是否存在n-x~x的段落,若存在还需要判断 该段落序列 与 排序后的序列 是否相等。1.当不存在n-x,x的段落:——|————|——,左端为x,右端为n-x,两端的部分都可以和其他位置互换。2.当存在n-x,x的段落:——|————|——,左端为n-x,右端为x
2021-10-27 22:53:34
221
原创 1598D - Training Session(数学-组合数)
题目:1598D - Training Session题意:有n个问题,表示题目,表示难度(不存在题目、难度都一样的题目)。现在要求你选择3个问题,满足以下两个条件之一:问题题目都不一样 问题难度都不一样题解:用逆向思维,ans = 全集 - 都不满足条件的数。不满足的情况有且仅有:(a,1)(a,2)(b,2)只需每次减去 (sum-1)*(sum-1)注:若sum=3=sum,每次取2个一样的a,2个一样的b,总共有4种情况。#include<iostr.
2021-10-26 22:23:09
140
原创 1598C - Delete Two Elements(双指针)
题目:1598C - Delete Two Elements题意:给你a[n]个数组,他们的平均数为k,若删除2个数后的数组平均数仍然为k,请求出可行数据有多少队。题解:得出平均数后 直接使用双指针,特判一下当a[i]==a[j]的情况。双指针学习(附加基础题)#include<iostream>#include<bits/stdc++.h>#define csh(a) memset(a,0,sizeof(a));typedef long long ll;..
2021-10-25 15:24:25
460
原创 1399C - Boats Competition
题意:给你n个数a【n】,求满足 a1+b1=a2+b2=......s的最多对数 。(a1和b1都表示a数组内的数)题解:因为不能重复使用,对总和进行遍历,再用双指针。#include <bits/stdc++.h>using namespace std;#define memset(a) memset(a, 0, sizeof(a));typedef long long int ll;const int N = 50 + 5;int a[N];int n;int c
2021-09-05 08:09:44
342
原创 单调栈+单调队列
目录单调栈单调队列单调栈int st[N], t = 0;int main(){ //入栈 int x; cin >> x; st[++t] = x; //输出栈顶 cout << st[t]; //弹出栈顶 t--;}题:单调栈const int N = 3e6 + 5;int r[N];int st[N] = { 0 }, t = 0;int res[N];int main(){ int n; cin >>
2021-09-05 07:17:20
96
原创 1538C - Number of Pairs
题解:这里用到upper_bound和lower_bound的知识#include <bits/stdc++.h>using namespace std;#define memset(a) memset(a, 0, sizeof(a));typedef long long int ll;const int N = 2e6 + 5;int a[N];int main(){ int t; cin >> t; while (t--) { ll ans = 0
2021-09-04 23:32:02
140
原创 upper_bound和lower_bound
对于升序序列:lower_bound返回第一个大于等于val的元素的迭代器upper_bound返回第一个大于val的元素的迭代器对于降序序列:必须指定比较函数:static bool weightComp(int a, int b){ return a > b;}...
2021-09-04 21:42:40
117
原创 双指针
正常写法for(int i=0,j=0,i<n;i++){ while(j<i&&check(i,j)) j++;}分两端点的写法:int i=0,j=n-1;while(i<j){ if(check(i,j)) i++; else j--;}例题:A-Bhttps://www.luogu.com.cn/problem/P1102 sort(r, r + n); int a = 0, b = 0; while ..
2021-09-04 21:08:21
113
原创 并查集
int pre[N];//上家int gd[N];//等级void init(int n) //初始化 { for (int i = 1; i <= n; i++) { pre[i] = i; //认定自己为老大 gd[i] = 1; }}int find(int x){ if (pre[x] == x)return x; return pre[x]=find(pre[x]);//找到老老大认老老大为老大}void join(int x, int y).
2021-09-04 19:30:04
79
原创 1551C - Interesting Story
题目:https://codeforces.com/problemset/problem/1551/C题意:给你n个由abcde5个字母组成的单词,要求你选出最多的单词并且满足(某一个单词的总数大于剩下的单词总数)题解:首先 我们可以对每个单词进行预处理,先计算每个字母的权值(该字母的总和 -其余的字母总和)即该字母的总和*2-单词的长度。这样操作好处在于可以每次单独对一个字母进行操作,再比较哪一个用的单词比较多。#include <iostream>#include
2021-09-03 21:45:42
148
原创 1101B - Accordion
题目:https://codeforces.com/problemset/problem/1101/B题目:Accordion由[:|:]组成的,中间的 | 可以是0个,也可以是无数个。现在给你一个字符串,你可以删除其中的任意符号求最长的Accordion长度。题解:先将[: 和 :]的冒号位置找出来,然后再对其中间进行判断。#include <iostream>#include <string>#include <algorithm>us
2021-09-02 00:02:26
78
原创 1360D - Buying Shovels
题目:https://codeforces.com/problemset/problem/1360/D题意:两个整数n,k。求找出n能由x个i()构成,求i的最小值。题解:我们只需要遍历出n能由和相乘,这里取最大为sqrt(n)。再判断可以出现的条件:即当存在,可取,当存在可取。#include <iostream>#include <cmath>#include <algorithm>using namespace std;type..
2021-09-01 23:39:45
171
原创 1560F1 - Nearest Beautiful Number (easy version)
题目:https://codeforces.com/problemset/problem/1560/F1题意:给你n和k,要求你找出>=并且是k漂亮的,k漂亮的表示x出现的不同的数不超过k。题解:当k=1时,直接遍历即可。当k=2时,先暴力出a和b(b>a),而后进行贪心,我们只需要对满足条件的高位取b,低位取a。例如:12345-》13111 ;对只需要对高位进行处理#include <iostream>#include <string>
2021-09-01 00:35:13
173
原创 1556B - Take Your Places!
题目:https://codeforces.com/problemset/status?my=on题意:给定一个序列,每次操作允许交换相邻的位置,求最少需要几次操作可以使得这个序列奇偶交错题解:我们可以将序列分成4种情况:奇数 偶数 的数量不匹配,即奇偶差大于1。 奇数=偶数+1,说明变换后的序列是 奇偶......偶奇的形式。 偶数=奇数+1,同理变换后的序列是 偶奇......奇偶的形式。 奇数=偶数,存在以上两种可能性,取最小值。我们可以对变换后的情况和变换前的情况做比..
2021-08-30 23:42:23
294
原创 1562C - Rings
题目:https://codeforces.com/problemset/problem/1562/C题意:给你一个包含0和1的字符串,从中找到两个长度大于的子串,满足两字符串是倍数关系,输出两子串的开头和结尾坐标。题解:我们可以使得倍数关系为1 或者2是比较容易 的。倍数为一,只需要在前面加上0; 倍数为2,需要在后面加上0; 没有0的情况下使得子串长度相等即可。#include <iostream>#include <string>#include
2021-08-29 22:26:30
123
原创 1562D1 - Two Hundred Twenty One (easy version)
题目:https://codeforces.com/problemset/problem/1562/D1题目:给你长度为n的字符串包含+和-,和q次的查询,输出最少删除多少个字符满足,删除后的字符串,或者(偶数位乘-1,所有和相加等于0)题解:直接模拟,并且使用前缀和。例:+-+-需要删除2,4或者1,3 +-+-+-,需要删除3,6。+--+会相互抵掉。 +-+-+-+-,也只需要删除4,8。一个字符串前缀和>2的情况下,存在+-+-或者-+-...
2021-08-29 00:00:25
328
原创 1538F - Interesting Function
题目:https://codeforces.com/problemset/problem/1538/F题目:两个正整数和,每次对到。例如:=909,变成910,改变了2个数字; =9,变成10,改变了2个数字; =489999,变成490000,改变了5个数字;求,从到的过程中多少个数字改变?我们可以发现,如果位数变化的话会有多余的变化,所以对位数上的数字分别处理:个位:每次改变1 。 十位:每次改变11。 0~10 ,...
2021-08-27 20:47:41
202
原创 数论分块
主要用于处理这个公式: 数论分块在于将相同效果的数找出来,一次性进行加法处理。理论实现: int n; cin >> n; int ans=0; for (int l = 1, r; l <= n; l = r + 1) { r = n / (n / l); ans += (r - l + 1) * (n / l); printf("%3d %3d %3d\n", n / l, l, r...
2021-08-26 01:10:42
301
1
原创 1561D1 - Up the Strip (simplified version)
题目:https://codeforces.com/problemset/problem/1561/D1题意:你现在在n,你可以进行以下两种操作:n - x [ 1 <= x <= n - 1 ] n / x [ 2 <= x <= n ]问你从n到1的方案数对m取模 2 ≤ n ≤ 2e5 1e8 < m < 1e9题解:减法部分等于之前的总和,用sum表示dp[k](1<k<n) 的前缀和。 除法部分同理 等于dp[n/k](2.
2021-08-26 00:41:42
278
原创 1355B - Young Explorers
题目:https://codeforces.com/problemset/problem/1355/B题意:ei必需存在于>=ei人数的队伍中,求最多可以分多少个队伍。题解:我们可以得知,我们需要一满足条件就去组成下一个队伍,这样才可以最大化,因此应该对小的数先处理我们从小到大排序,然后一有cnt>=a[i]就ans++,cnt=0。#include <iostream>#include <algorithm>using namespace
2021-08-24 22:18:29
111
原创 思维题1339B - Sorted Adjacent Differences
题目:https://codeforces.com/problemset/problem/1339/B题意:题解:只需要排序一下,然后从中间向外开始输出。#include <iostream>#include <algorithm>using namespace std;const int N = 1e5 + 5;int a[N];int main(){ int t; cin >> t; while (t--) { int n..
2021-08-23 23:54:17
131
原创 474B - Worms
题目:https://codeforces.com/problemset/problem/474/B题意:题解:使得每一个号码都可以保存下来(大力出奇迹)#include <iostream>using namespace std;const int N = 1e6 + 5;int a[N] = {};int main(){ int n; cin >> n; int cnt = 1; for (int i = 1; i <= n; i.
2021-08-22 23:33:00
84
原创 1559C - Mocha and Hiking
题目:https://codeforces.com/problemset/problem/1559/C题意:有个城市有n + 1个村庄和2n - 1条定向道路。有两种道路:n - 1道路是从i 村到 i + 1 村,1 <= i <= n - 1。 n条道路可以用序列a1到an来描述,如果ai=0,表示i到n+1的路线,ai=1,表示n+1到i的路线求将所有村庄都走一边的路线。可以从任何村庄开始和结束。题解:为了更好理解,我们将n+1当作岛屿,0代表去岛屿,1代表回陆
2021-08-21 23:41:33
206
原创 1560E - Polycarp and String Transformation
题目:https://codeforces.com/problemset/problem/1560/E题解:先获取从最后遍历记录下每个第一个出现的字母,这就是删除字母的逆序。 记录下每个字母出现的次数,再按删除的顺序除与他们。 例:abacabaaacaac 1. b 2 a 8 c 3 2.2 4 1 再截取t的前几个字母得出s。 模拟一下,对比模拟后是否与t相同。#include <iostream>#include <string>...
2021-08-19 17:48:40
149
原创 1560B - Who‘s Opposite?
题目:https://codeforces.com/problemset/problem/1560/B题解:先对ab进行处理,使得a>b; 得到d=a-b和d2=2*d; 判断c和a是否超过d2; 而后再判断c>d和c<=d的情况 #include <iostream>#include <algorithm>using namespace std;typedef long long int ll; int main(){ i...
2021-08-19 01:53:23
207
2
原创 1560C - Infinity Table
题目:https://codeforces.com/problemset/problem/1560/C题解:我们定义x,y。我们可以明显得知最左边的一列是x的次方形式的,我们首先就要先找出k在那一个外围。我们再判断他是否在这一行上,对x的次方进行 0~x的减法运算 而后对y进行改变。如果不在,则再向上进行判断对x进行改变。#include <iostream>using namespace std;typedef long long int ll; in..
2021-08-19 01:40:46
153
原创 1560D - Make a Power of Two
题目:https://codeforces.com/problemset/problem/1560/D题意:您将获得一个整数n。在一次移动中,您可以执行以下操作之一:擦除数字的任意一位数字(可以接受操作前的数字正好有一位数字,操作后为“空”); 在右边加一个数字。 这些动作可以以任何顺序执行任何次数。请注意,如果从数字中删除某个数字后,该数字将包含前导零,则这些数字不会被删除。例如,如果你从数字301中删除数字3,结果是数字01(不是1)。您需要执行最小数量的操作,使该数为2的任意次方
2021-08-19 01:20:42
170
原创 1495A - Diamond Miner
题目:https://codeforces.com/problemset/problem/1495/A题意:钻石矿工是一个类似黄金矿工的游戏,但是这个游戏中有n个矿工,而不是1个。矿区可以描述为一个平面。n个矿工可以看作y轴上的n个点。矿区有n个钻石矿,我们可以把它们看作x轴上的n个点。出于某种原因,没有矿工或钻石矿可以在原点(点(0,0))。每个矿工应该只开采一个钻石矿。每个矿工都有一个钩子,可以用来开采钻石矿。如果在点(a,b)的矿工使用他的钩子在点(c,d)开采钻石矿,他将花费两点之间
2021-08-18 19:52:03
208
原创 思维题1504B - Flip the Bits
题目:https://codeforces.com/problemset/problem/1504/B题意:有一个长度为n的二进制字符串a。在一个操作中,您可以选择0和1符号相等的任意前缀a。然后前缀中的所有符号被反转:每个0变成1,每个1变成0。例如,假设a=0111010000。在第一个操作中,我们可以选择长度为8的前缀,因为它有四个0和四个1:[01110100]00 →[10001011]00。 在第二个操作中,我们可以选择长度为2的前缀,因为它有一个0和一个1: [10]0010
2021-08-17 16:49:04
133
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人