A
归并排序求逆序对板子
这次没做出来的同学要下去认真学,这是基础算法,下次考利用快排解决某一种问题
B
牛客寒假训练营第6场原题,bfs或者dfs都可以过,dfs走迷宫变形
C
这道题,对于任意一个长度为x+1连续最长不降子数组,它包含的nice数组为,(1+x)*x/2,所以我们遍历数组n,找到一个连续最长不降子数组就统计它对答案的贡献
参考代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5+9;
int a[N];
int main()
{
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
//cout<<a[i]<<" ";
}
// puts("");
ll ans = 0;
//注意n==1的时候,答案为1
if(n==1) puts("1");
else
{
ll t=1;
//puts("wa");
for(int i=2; i<=n; i++)
{
if(a[i]>=a[i-1]) t++;
else
{
//cout<<t<<endl;
ans+=(1+t)*t/2;
t=1;
}
//cout<<t<<endl;
}
ans+=(1+t)*t/2;
}
printf("%lld\n",ans);
return 0;
}
D&E
对于一个数字n,我们要求它的约数和,即它的因子;i从1遍历到n/i,
如果x%i==0, 那么加上i,如果x/i!=i,再加上x/i。
注意使用long long
参考代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define INF_INT 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof a)
//inline void print(__int128 x)
//{
// if(x<0) {putchar('-'); x=-x;}
// if(x>9) print(x/10);
// putchar(x%10+'0');
//}
ll ans=0;
int sum(int n)
{
int tmp=0;
for(int i=1; i<=n/i; i++)
{
if(n%i==0)
{
tmp+=i;
if(n/i!=i) tmp+=n/i;
}
}
return tmp;
}
int main()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)
{
ans+=sum(i);
}
cout<<ans<<endl;
return 0;
}
求1~n的约数和的和还有O(n),O(n/2),O(logn)的做法,感兴趣的同学自行了解,不懂的,若愿意可以来问我
一点点话
这次比赛看来大家的的成绩不是很好,想继续搞竞赛的同学还得努力点,我也有过低谷,即使现在也很菜,还是一直在努力。不管你们下来怎样,愿大家四年后觉得没有遗憾~