- 博客(27)
- 收藏
- 关注
原创 CF 1617D1. Too Many Impostors (easy version)
题目链接题意:有n个人,其中有n/3~2*n/3个狼人,可以询问2n次,每次三个人,返回狼人多还是好人多。解法:按1,2,3和2,3,4和3,4,5........这样询问下去,当出现上一次询问结果和这一次结果不一样时,说明中间两个人一个好人,一个狼人(可以举例证明),用这两个人可以得出其他所有人的身份,最后再取两个身份不同的询问这两个人即可#include<bits/stdc++.h>#define fo(i,a,b) for(int i=a;i<=b;i++)us
2021-12-17 17:12:41
572
原创 CF 1617C. Paprika and Permutation
题目链接题意:给一个数列,问通过操作:a[i]=a[i]%x(x自己选择)后,能不能成为1到n的排序,如果能,输出最小操作次数,否则输出-1.解法:对数组a排序后,先把a中出现的1~n的数删掉最多一个,并标记,因为这个数对可以不经过操作而作为答案的一份子。然后遍历排序后的数组,k为当前的位置应该能操作后得到的数,当a[i]不能变成k,直接输出-1.对a[i]取模可以得到的数范围0~(a[i]-1)/2#include<bits/stdc++.h>#define fo(i,
2021-12-17 17:01:13
488
原创 AcWing 1135. 新年好
题目链接#include<bits/stdc++.h>using namespace std;typedef pair<int, int> PII;const int N = 5e5 + 10, M = 2e6 + 10,INF=0x3f3f3f3f;int n, m;int w[M], e[M], ne[M], h[M], idx = 0;int dist[6][N],source[6];bool st[N];void add(int a, int.
2021-12-15 17:02:49
1254
原创 单源最短路的各种应用
1.AcWing 1135. 新年好题目:佳佳的家在车站1,他有五个亲戚,分别住在车站a,b,c,d,e。过年了,他需要从自己的家出发,拜访每个亲戚(顺序任意),给他们送去节日的祝福。怎样走,才需要最少的时间?解法:把六个点作为起点跑最短路,然后用dfs暴力遍历所有顺序的情况...
2021-12-15 17:01:04
587
原创 CF1612D. X-Magic Pair
题目链接题意:给a,b,x问用以下操作,能不能得到x:解法:思考后得,令a,b中大的数为b,当b>a时,不断b-=a,可得到很多个b,而判断这些b会不会等于x很简单,就是b%a=x%a时会出现一个b等于x否则令b=b%a,swap(a,b),再进行下一次判断#include<bits/stdc++.h>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;typedef long long l
2021-11-30 20:27:08
119
原创 CF1612C Chat Ban
题目链接解法:肉眼可见的二分,分成两个区域二分#include<bits/stdc++.h>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;typedef long long ll;ll k, x;ll ans() { ll l = 1, r = k; while (l < r) { //cout << l << ' ' << r <<
2021-11-30 20:00:55
817
原创 ABC228E - Integer Sequence Fair
题意:输入n,k,m ,求m^k^n取模于P解法:费马小定理,得m^k^n(mod P)=m^(k^n(mod P-1))(mod P)#include<bits/stdc++.h>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;typedef long long ll;ll mo = 998244353;ll qmi(ll x,ll k) { ll res = 1; x %= mo; whil
2021-11-20 22:03:04
508
原创 ABC228D - Linear Probing
题意:给一个长度为N=2e20的序列,初始每个序列的值为-1,这里记为数组a问Q个问题,每次输入t和x当t=1时,令h=x,当a[h%N]=-1时,令a[h%N]=x,否则h++,直到赋值了为止当t=2时,输出a[x%N]。解法:用并查集将已经赋值过的x,与x+1合并即可,就是令f[x]=x+1#include<bits/stdc++.h>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;typ
2021-11-20 21:57:39
1010
原创 STL慢慢整合
Stringstring s;s.substr(i);从下标i开始到结尾的子串s.substr(i,k);从下标i开始长度为k的字串
2021-11-16 19:54:19
63
原创 ABC227D - Project Planning
题目链接题意:有N个部门,每个部门有Ai个人,一项任务需要K个部门各出一个人来完成,问最多可以完成多少个任务。解法:类似于单调队列,取最大的K-1个部门,从小到大进队列,用ans=0记录暂时的答案,用cnt记录取到第几个部门,把剩下的部门的所有人加起来用sum记录,取第一个部门a[i],如果sum>=cnt*(a[i]-ans),就代表ans能取到a[i],所以,sum>=cnt*(a[i]-ans),ans=a[i],后面同理。还有对多余sum的特判,看代码。感觉上,就是.
2021-11-13 22:20:53
510
原创 CR754C. Dominant Character
题目链接题意:给一个只有abc的string,要求:1.长度大于等于22.a出现的次数严格大于b,严格大于c问满足以上要求的最短子串解法:思考后发现最短子串的可能很有限,只有以下几种:aa,aba,aca,abca,acba,abbaccb,accabba,4个a就不行了,因为4个a要夹着3个b和3个c,必定会出现abca或acba,更多a同理所以直接if else即可#include<bits/stdc++.h>#define fo(i,a,b) for
2021-11-13 19:35:43
444
原创 单调队列优化DP
题目要求:一般和dp一样,不过用普通dp会T,其中dp有一维可以用单调队列优化可以用单调队列优化的数值会出现明显的上位替代,比如:最近的最大值,最近的最大总和,耀骑士(不是)。例子:1.输入一个长度为n的整数序列,从中找出一段长度不超过m的连续子序列,使得子序列中所有数的和最大。原本暴力复杂度O(nm),但是由前缀和s[i]-s[j]发现,在i固定的情况下,s[j]越小越好,并且离i越近越好,这样就出现了上位替代。可以用单调队列优化。2.农场有编号连续的n头奶牛,每头奶牛i有一个效率...
2021-10-30 21:33:34
161
原创 二分答案法
bool check(){} int l=0,r=n; while(l<r){ int mid=(l+r)/2; if(check(mid))r=mid; else l=mid+1; }
2021-10-30 19:15:31
88
原创 AcWing 1081. 度的数量
题目链接#include<bits/stdc++.h>using namespace std;const int N=35;int l,r,K,B;int f[N][N];//f[i][j]代表i个中选j个的组合数void init(){ for(int i=0;i<N;i++) for(int j=0;j<=i;j++){ if(!j)f[i][j]=1; else f[i][j]=f[i-1][j]+f[i-1][j
2021-10-20 16:57:10
63
原创 数位DP模板
#include<bits/stdc++.h>using namespace std;const int N = 35;int K, B;int f[N][N];void init() {//求组合数 //模板:数位DP一般要预处理符合题意的组合数 for (int i = 0; i <= N; i++) { for (int j = 0; j <= i; j++) { if (!j)f[i][j] = 1; .
2021-10-20 16:20:07
89
原创 AcWing 1073. 树的中心
题目链接题解#include<bits/stdc++.h>using namespace std;const int N=1e5+10;vector<int>E[N],w[N];int up[N],jing[N],d1[N],d2[N];int dfs_down(int x,int fa){ d1[x]=d2[x]=-0x3f3f3f3f; int dist=0; for(int i=0;i<(int)E[x].size();i++
2021-10-18 17:13:59
75
原创 CF1586C. Omkar and Determination
题目链接题意:给一个由0(.)和1(X)组成的图,0代表该位置空,1代表该位置堵塞,由空的位置出发,如果能通过走上和左走出图外,则该位置能离开(E),如果由能离开(E)和不能离开(N)组成的图可以反推原图,则原图是确定的(YES)输入x1,x2,问x1列到x2列的图是不是确定的解法:当x1=x2时,全部空的点能往左走出图,所以是YES其他情况:当出现0110时,会导致右下角的0无法确定,所以先找到所有的0110,记该列(左边的列)为不可确定,最后看给的范围里有没有不可确定的列即可..
2021-10-18 15:49:18
410
原创 CF1586D. Omkar and the Meaning of Life
题目链接题意:交互题,用最多2n次提问找到n长度的序列a,提问时要给出一个数组b,他会返回数组c (ci=ai+bi)里重复数值的第一个位置解法:循环n-1次,最后一位为(2~n-1),其他输出1,再循环n-1次,最后一位为1,其他输出(2~n-1),这样就能得到所有位置和最后一位的差值(有正有负),将全部差值不断加1,直到全为正数即可。#include<bits/stdc++.h>using namespace std;int a[105];int main() { in
2021-10-18 15:34:05
275
1
原创 AcWing 1072. 树的最长路径
题目链接题意:求数的最长路径#include<bits/stdc++.h>using namespace std;const int N=20010;int h[N],w[N],e[N],ne[N],idx=0,ans=0;void add(int a,int b,int c){ e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;}int dfs(int u,int father){ int d1=0,d2=0,dist=0
2021-10-13 17:44:05
48
原创 CodeForces - 243A(暴力+剪枝,set)
题目链接题意:给一个数列,任意选择连续的数,问这些数的或(a|b),有几种#include<bits/stdc++.h>using namespace std;int a[200005];set<int>s;int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) {
2021-10-10 23:04:04
148
原创 CodeForces - 244B(dfs+剪枝,set)
题目链接题意:求小于n且最多由2个数组成的数的个数#include<bits/stdc++.h>using namespace std;set<long long>a;int n, x, y;void dfs(long long num, long long pos) { if (num > n || pos > 10)return; a.insert(num); dfs(num * 10 + x, pos + 1); dfs(num * 10
2021-10-10 22:29:40
149
原创 dijkstra(朴素版+堆优化版)
原理:1.每次从未标记的节点中选择距离出发最近的节点,标记,收录到最优路径的集合中2.计算刚加入节点a的邻近节点b的距离,并根据条件更新节点b的距离dijkstra堆优化版#include<bits/stdc++.h>using namespace std;const int N = 3000, M = 20000;typedef pair<int, int> PII;int h[N], w[M], e[M], ne[M], idx;bool st.
2021-10-05 20:39:59
141
原创 邻接表(图论,模板)
#include<bits/stdc++.h>using namespace std;const int N = 2510, M = 6200 * 2 + 10;int h[N], e[M], w[M], ne[M], idx;void add(int a, int b, int c)//添加边的操作{ e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;}//e存终点,w存权值,ne存相同出发点(a)的上一条边的号码.
2021-10-05 19:03:29
130
原创 栈、贪心 CR744D. Productive Meeting
题目链接题意:有n个人,每个人能与其他人交谈a[i]次,求最大交谈次数的方案解法:先对a数组进行sort,然后按从大到小的顺序存入栈b和c,哪个栈的交谈总数小,就存哪个栈,然后对交谈总数大的栈进行判断,如果它的交谈总数比另一个至少大2,且至少有两个人,则这个栈内部先交谈,最后两个栈互相交谈即可#include<bits/stdc++.h>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;typ...
2021-09-29 16:49:03
147
原创 思维、模拟 CR744C. Ticks
题目链接题意:给一个图,上面有多个√,每个√占2d+1个格子,问能否用d>=k的√复原原图。注意:√必须要对称上手出现的问题:题目有点复杂,没看明白解法:将图读入a数组,用b数组在d>=k的条件下复原a数组,最后比较两个数组#include<bits/stdc++.h>using namespace std;int t, n, a[30][30],b[30][30],m,k;void pan(int i, int j) { int d = 1,.
2021-09-29 16:38:44
137
原创 DP ABC220D - FG operation
题意:给一个N长度只有0到9的序列,做以下两个操作F:将(x+y)%10 G:将(x*y)%10(x和y是序列最前面的两个数),将结果放入序列最前面,直到只剩下一个数。算出每个数剩下的可能个数。解法:dp 由于序列是固定的(作为y),所以dp枚举0到9所有数(作为x),将F和G的结果加入下一层,即可。#include<bits/stdc++.h>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;...
2021-09-27 11:16:50
226
原创 模拟、进制转换 ABC220B - Base K
题意:将K进制下的A、B相乘,得十进制结果做题时错误:以为10^5是数字,所以输入用了int,实际上是数值,所以要用string总结:以后进制类默认用string#include<bits/stdc++.h>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;typedef long long ll;ll s(string x,int k) { ll res = 1, ans = 0,si=x....
2021-09-27 11:04:26
197
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人