- 博客(108)
- 收藏
- 关注
原创 牛客小白月赛61-E
首先要知道 逆序对数=n!/2*(不相等的数字对儿数)要注意的是 这里除2不能直接除 乘上了2的逆元。给你一个长度为n的序列,它有n!个排列方法中 逆序对的总数是多少。不相等的数组对儿数=
2022-11-19 10:52:03
663
原创 【无标题】
题目大意是给出一个数组a,每个元素只可操作一次(将a[i]变成a[i]*i),问最少操作几次可以使Πa[i]被2的n次方整除,首先这个数组连乘起来可以确定的是她们有多少个2的次方,我们把这个数求出来,与2的n次方比较大小,贪心的做法去找需要乘上多少个2的次方,从大到小去找,如果当前所得的2的次方数比2的n次方大,说明一定有一个小的可以实现。
2022-11-01 10:09:56
317
原创 Educational Codeforces Round 136 (Rated for Div. 2)-C
思路还是不够清晰,搞了半天没搞出来。要多练练这种题呀!给牌做个标记,max=1,max-1=2,max-2=3,max-3=4;
2022-10-09 21:24:41
211
原创 数列分块入门——loj
数列分块入门1传送门数列分块 就是把一个数组分成一块一块的每个块的大小为sqrt(n) 对于每次对元素的查询修改 可以直接对它所在的块操作 可以节省很多时间//乱七八糟的维护区间的 用分块去做//分了根号n块 复杂度为根号n #include<bits/stdc++.h> using namespace std;const int maxn=1e5+10;long long belong[maxn],block,l[maxn],r[maxn],num=0;long long n
2022-05-17 19:01:03
566
原创 仓鼠更有精神
传送门斗争了一个小时 还是超时先放到这里吧 ,但是还是很不情愿,有没有大佬帮我看看还能不能优化啊#include<bits/stdc++.h>using namespace std;int b[1001100];int main(){ string a; int i,j,k,m,n,t; ios::sync_with_stdio(0); cin.tie(0); cin>>t; while(t--) { cin>>a>>k;
2022-05-16 20:28:57
174
原创 codeforces 1661C
传送门题目是说 有一排树 他们有一个初始高度a[i] ,从第一天开始给这些树胶水,奇数天树的高度可以增加1,偶数天可以增加2,问最少需要多少天这些树的高度可以一样高,每一天都可以选择给一棵树浇水,或者一颗都不浇思考一下 ,一颗树浇到最大的高度 只有两种情况,要么全部由偶数天来浇,要么是一些偶数天 加上一天奇数天,统计一下所有的树,一共需要多少奇数天,多少偶数天,如果偶数天比奇数天多,我们可以把空闲的没有用的上的奇数天,来补偶数天,均衡一下奇偶,如果是奇数天比偶数天多,那便没有办法用偶数天来补了,还有一
2022-05-15 08:45:22
187
原创 Binary String To Subsequences(子序列问题)
传送门思路不能有两个1挨着 ,也不能有两个0挨着,用两个容器存子序列的最后一个元素是第几个子序列里的,每当遇到一个0 尝试把它放到一个以1结尾的子序列末尾去,如果不行,就单独的为它开辟一个新的子序列,遇到1也是如此code#include<bits/stdc++.h>using namespace std;int main(){ int i,j,k,m,n,t; string a; std::ios::sync_with_stdio(0); cin.tie(0); ci
2022-05-05 20:17:42
206
原创 闯关游戏(ccpc河南省赛)
传送门滚动dp因为当前的状态只与dp【i-1】有关 我们没有必要保留前面所有的项的值 只需要保留对我们有用的即可01背包 因为如果某一关卡直接跳过的话游戏就结束了 所以不能取max要给他一个初值后 再取最大值#include<bits/stdc++.h>using namespace std;int dp[3][6100];int a[6010],b[6110],c[6110],d[6101];int main(){ std::ios::sync_with_stdio(0);
2022-05-03 21:33:52
1116
原创 Unequal Array(思维)
传送门直接看样例吧81 1 2 3 4 5 7 7现在的值为2 我们要将其变为0 或者1先变第一对1 x x 3 4 5 7 71 x y y 4 5 7 71 x y z z 5 7 71 x y z m m 7 71 x y z m n n 7 好了目前只剩一对了 大概思路就是这样#include<bits/stdc++.h>using namespace std;const int N=1e5;int a[N*2+10];int main(){ i
2022-04-27 19:50:39
382
原创 二叉树的创建、层序遍历
pta浪漫侧影中序和后序遍历创建二叉树、层序遍历#include<bits/stdc++.h>using namespace std;const int N=400000;int po[N],mid[N],id[N],lc[N],rc[N],m[N];int depth[N],cnt=0;int creat(int lm,int rm,int lp,int rp){ if(lp>rp) return 0; int root=po[rp]; int numl=rm-i
2022-04-19 21:29:13
384
原创 Subtract Operation(set容器)
传送门题解:给你一个长度为n的数组 一个数字k 每次可以选择删除数组中其中一个元素 其他剩下的所有元素的值都要减去被删掉的这个元素 问最后剩下的那个元素能不能等于k每个元素减去的都是相同的值 所以二者之间的差值恒定不变,我们只需要找是否存在两个元素的差值为k即可 不能双层for,会超时,可以用set容器,一层for去找是不是存在inpu44 54 2 2 75 41 9 1 3 42 1717 02 1718 18outputYESNOYESNO#include<b
2022-04-18 20:34:39
275
原创 矩阵列平移(pta)
理解错题意啦,我以为是分别向下移动1个和k个,结果是1到k个 害!也就是 第2列移动1个 第4列移动2 个 第6列移动 3个 以此类推#include<bits/stdc++.h>using namespace std;int a[110][110],n,m,p,k,z[110];int main(){ int i,j; cin>>n>>k>>p; for(i=1; i<=n; i++) { for(j=1; j<=n.
2022-04-18 20:11:23
466
转载 int128的使用
转自这里输入输出模板#include <iostream>using namespace std;typedef __int128_t int128;int128 read(){ int128 x=0;bool f=0;char c=getchar(); while (c<'0'||c>'9'){if (c=='-')f=1;c=getchar();} while (c>='0'&&c<='9'){x=(x<&
2022-04-16 19:56:58
2032
原创 乘法逆元。
传送门大佬博客#include<bits/stdc++.h>using namespace std;const int N=1e6;long long inv[N*3+10];int main(){ int i,j,k,m,n,p; scanf("%d%d",&n,&p); inv[1]=1; for(i=2;i<=n;i++) { inv[i]=(p-p/i)*inv[p%i]%p; } printf("1\n"); for(i=2;i
2022-04-15 21:02:12
181
原创 求组合数(记忆化搜索)
传送门递归递归一直递归 如果遇到之前已经求出来的直接加上就可以了 要注意的是,我一直忽略了m为0的情况,我一直认为m不可能为0,其实也可以啊,m为0的时候只有一种方案就是所有的都不取,就可以了#include<bits/stdc++.h>using namespace std;long long f[2100][2100];const long long mod=1000000007;long long solve(int x,int y){ if(f[x][y]!=-1)
2022-04-15 19:08:33
397
原创 Tree Infection(模拟)
传送门一开始以为跟二叉树有关 一看到就头疼 看了题解发现跟二叉树没啥关系,看了好长时间才明白一秒内可以做俩操作:感染一个健康的节点传染相邻的兄弟节点思路sum[i]表示以i为节点的节点个数有几个,一开始去感染最多的那个群体 为什么呢?因为这样可以给这个群体更多的彼此间互相传染的时间,在他互相传染的时间里,我们去感染其他群体如果所有的群体我们都已经感染了一个,计算在这个时间内 每个群体剩余的没有被感染的节点的个数,我们再重复以上操作(找到最多的 去感染,让其传染,在这个时间内去感染其他节点)
2022-04-14 19:57:21
668
原创 Good Pairs(构造)
这题很有意思 虽然我第一眼没看出来咋做 但是蒙对了传送门题目是说 找一个i 一个j使数组中所有的 abs(ai-ak)+abs(ak-aj)=abs(ai-aj) 怎么才能使所有的k都满足这个式子呢 我们把绝对值去掉 变成ai-ak+ak-aj=ai-aj 那怎么才能得到这个式子呢 只需要满足 ai>ak>aj也就是ai取数组中的最大值 aj取数组中的最小值即可#include<bits/stdc++.h>using namespace std;const int
2022-04-13 21:17:11
249
原创 谷歌的招聘(pta)
学俩新函数substr stoi#include<bits/stdc++.h>using namespace std;typedef long long ll;int pr(int x){ if(x==1||x==0) return 0; for(int i=2;i<sqrt(x);i++) { if(x%i==0) return 0; } return 1;}int main(){ int i,k,n;// init(); string s;
2022-04-13 20:22:07
524
原创 造桥(牛客)
今日教训:当有字符串的时候,而像我这种不认真看数据范围的人,直接用string,这样怎么也不会爆!牛客小白#include<bits/stdc++.h>using namespace std;char s[1010010];int f[40];int main(){ int i,j,k,m,n,t; scanf("%d",&t); while(t--) { memset(f,0,sizeof(f)); int ans=0; scanf("%d",&am
2022-04-11 21:11:54
311
原创 Getting Zero(思维)
codeforces一开始我只想着让她加 随便加几个应该就能得出答案了,没想太细,没有想到这个32768跟2的关系 32768是2的15次方 所以任何一个数 只要乘以2的15次方,就一定可以得到0,我们要让n加上1的次数控制在15以内,因为这个答案的最大值是15浅看一下吧#include<bits/stdc++.h>using namespace std;const int k=32768;int f[10]= {0,32768,65536};int main(){ int
2022-04-11 19:08:10
468
原创 codeforces 1665A (GCD vs LCM)思维
传送门我还在那分奇数偶数直接输出 n-3 1 1 1 这样最大公约数和最小公倍数都是1#include<bits/stdc++.h>using namespace std;int main(){ int i,j,k,m,n,t; scanf("%d",&t); while(t--) { scanf("%d",&n); if(n==4) { printf("1 1 1 1\n") ; continue; } printf
2022-04-10 20:29:44
333
原创 codeforces1660(Get an Even String)
codeforces把所有可以构成偶字符串的字符个数统计出来 用字符串长度减去可以构成的长度 就是我们需要删去的字符个数#include<bits/stdc++.h>using namespace std;string s;int book[30]; void solve(){ memset(book,0,sizeof(book)); int m=0; for(int i=0;i<s.size();i++) { if(!book[s[i]-'a'])//如果当前字
2022-04-10 16:23:49
310
原创 训练题AFG
A#include<bits/stdc++.h>using namespace std;int main(){ int h,m,s; h=7; m=31+24; s=26+15; printf("%02d:%02d:%02d",h,m,s); return 0;}F#include<bits/stdc++.h>using namespace std;int dp[50];int main(){ int i,j,k,m,n; scanf("%d"
2022-04-08 19:44:06
218
原创 承压计算(蓝桥杯)
传送门#include<bits/stdc++.h>using namespace std;double a[40][40];int main(){ int i,j,k,m,n; for(i=1; i<=29; i++) { for(j=1; j<=i; j++) scanf("%lf",&a[i][j]); } for(i=1; i<=30; i++) { for(j=1; j<=i; j++) { if(i==1)
2022-04-07 14:51:22
313
原创 k倍区间(蓝桥杯)
求前缀和 直接取余 每个余数相同的可以组成一对两两相互组合 删去重复的详情见传送门#include<bits/stdc++.h>using namespace std;const int N=1e5+10;//long long dp[N];long long s[N];int main(){ int i,j,k,m,n; long long ans=0; scanf("%d%d",&n,&k); for(i=1; i<=n; i++) {
2022-04-07 11:14:53
126
原创 日期问题(蓝桥杯)
我们把6种可能的情况都放到结构体里 然后按大小进行排序 在输出的时候判断一下这个日期是不是可能的即可首先1960之前的年份和2059之后的年份都不是可能的年份闰年要特别判断一下 闰年的2月有29天 平年的2月有28天天数大于当前月份的最大日期时不是可能的日期月份不在1到12之间的不是可能的日期最后要注意不能重复输出相同的日期 用数组标记一下即可#include<bits/stdc++.h>using namespace std;int m[14]= {0,31,29,31,3
2022-04-06 21:23:31
552
2
原创 平面划分.
n条直线最多可以分成几个平面 fn= n*(n+1)/2 +1n条折线最多可以分为几个区域 dn=f 2n-2n传送门例题训练题最开始一条直线最多与7条直线相交 最多可以得到6个平面 然后下一条直线最多与8条直线相交 可以得到7个平面 以此类推 答案为47...
2022-04-04 21:32:14
274
原创 KartRider(思维)
传送门当在t秒时刻内,能走的路程是t m,方向或正或反,都可以我们依次累加,+1,+2,+3 直到sum>=n 这还不够 如果跑过了,我们还要选着中间某个时间点返回一次 ,比如 1+x=10>n=9那1 可以选择反方向 -1+x=8<9 也不可以 所以我们只能在一个偶数的点选择返回 也不是返回 大概是这个意思吧#include<bits/stdc++.h>using namespace std;long long solve(long long n){ lon
2022-04-01 20:26:06
420
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人