自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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 514

原创 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 410

原创 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 1186

原创 单源最短路的各种应用

1.AcWing 1135. 新年好题目:佳佳的家在车站1,他有五个亲戚,分别住在车站a,b,c,d,e。过年了,他需要从自己的家出发,拜访每个亲戚(顺序任意),给他们送去节日的祝福。怎样走,才需要最少的时间?解法:把六个点作为起点跑最短路,然后用dfs暴力遍历所有顺序的情况...

2021-12-15 17:01:04 510

原创 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 110

原创 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 754

原创 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 461

原创 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 933

原创 STL慢慢整合

Stringstring s;s.substr(i);从下标i开始到结尾的子串s.substr(i,k);从下标i开始长度为k的字串

2021-11-16 19:54:19 53

原创 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 491

原创 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 392

原创 单调队列优化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 128

原创 二分答案法

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 74

原创 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 53

原创 数位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 82

原创 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 69

原创 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 322

原创 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 218 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 44

原创 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 134

原创 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 134

原创 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 104

原创 邻接表(图论,模板)

#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 110

原创 栈、贪心 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 119

原创 思维、模拟 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 113

原创 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 189

原创 模拟、进制转换 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 158

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除