8/18 牛客加赛补题
Posted 钟钟终
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8/18 牛客加赛补题相关的知识,希望对你有一定的参考价值。
E-Everyone is bot
题意:一个复读的游戏,倒数第p个人复读会被惩罚,其他人则获得a[i][j]
个冰红茶。
每个人只能参与一次复读,且可以选择是否复读。
思路:
1.首先,倒数第p个人会被惩罚。首先看n=5,p=3,则只能n-p个人参与复读,若n-p+1个人参与,则后面p-1个人都参与,那它就会被惩罚,因此都不会参与。
2.再看n=5,p=2,这组数据,只能由n-2p个人复读,若n-2p+1个人复读,则剩下p+1个人也会复读。
因此可看出只能由n-(n/p)*p个人复读。
#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
#define maxn 1000000000LL
#define ULL unsigned long long
using namespace std;
const int N=3e3+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
int n,p,a[N][N];
void solve()
cin>>n>>p;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
int g=n-(n/p)*p;
for(int i=1;i<=n;i++)
if(i<=g)
cout<<a[i][i]<<" ";
else
cout<<0<<" ";
cout<<endl;
signed main()
//int t;cin>>t;
//while(t--)
solve();
return 0;
H-Here is an Easy Problem of Zero-chan
题意:给定一个值x,和i进行lca,求出公共节点数相乘问有多少个后缀0
思路:暴力的方式首先排除
1.后缀0的形成,需要因子2和5,而0的个数取决于2和5个数中的较小值。
2.结合题目,每个结点i和x的最近公共祖先,可考虑到:x子树中的结点lca为x,而x和其他结点lca为x的祖先。
3.可用一种削减的方式。先考虑根节点中2的个数和5的个数。2的个数siz[u]*two[u],5的同理;如果递归到子树节点,则要减去已根为lca的结点num1-siz[v]*two[u]
,加上已v为lca的点。
4.将点分为两类,一类为已x为最近公共祖先的子树结点,一类为x的祖先为lca的结点。
#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
#define maxn 1000000000LL
#define ULL unsigned long long
using namespace std;
const int N=7e5+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
int n,q,d[N],two[N],five[N],siz[N],ans[N];
int dep[N]; //存u点的深度
int fa[N][20]; //存从u点向上跳2^i层的祖先节点
vector<int>e[N];
void dfs(int u,int pare)
dep[u]=dep[pare]+1;
fa[u][0]=pare;
siz[u]=1;
for(int i=1;i<=19;i++)
fa[u][i]=fa[fa[u][i-1]][i-1];
for(int v:e[u])
if(v!=pare)
dfs(v,u);siz[u]+=siz[v];
void dfs1(int u,int fa,int num1,int num2)
num1+=siz[u]*two[u],num2+=siz[u]*five[u];
ans[u]=min(num1,num2);
for(int v:e[u])
if(v==fa) continue;
dfs1(v,u,num1-siz[v]*two[u],num2-siz[v]*five[u]);
//利用st表求lca
int lca(int u,int v)
if(dep[u]<dep[v]) swap(u,v);
for(int i=19;i>=0;i--)
//先跳到同一层
if(dep[fa[u][i]]>=dep[v])
u=fa[u][i];
if(u==v) return v;
//跳到lca的下一层
for(int i=19;i>=0;i--)
if(fa[u][i]!=fa[v][i])
u=fa[u][i],v=fa[v][i];
return fa[u][0];
void solve()
cin>>n>>q;
for(int i=1,u,v;i<n;i++)
cin>>u>>v;
e[u].push_back(v);e[v].push_back(u);
for(int i=1;i<=n;i++)
int tmp=i;
while(tmp%2==0) two[i]++,tmp/=2;
while(tmp%5==0) five[i]++,tmp/=5;
dfs(1,0);
dfs1(1,0,0,0);
while(q--)
int x;cin>>x;
cout<<ans[x]<<endl;
signed main()
//int t;cin>>t;
//while(t--)
solve();
return 0;
M-Maimai DX 2077
一道模拟题,题意还算清晰。但有个地方没看懂,A是标准分数中如果全是critical perfect将得到的分数。
理解是硬伤!!!
#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
#define maxn 1000000000LL
#define ULL unsigned long long
using namespace std;
const int N=7e5+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
double a1,a2,b1,b2;
double a[4][5]=1,1,0.8,0.5,0,
2,2,1.6,1.0,0,
3,3,2.4,1.5,0,
5,5,2.5,2.0,0;
double b[5]=1,0.5,0.4,0.3,0;
void solve()
for(int i=0;i<4;i++)
for(int j=0;j<5;j++)
int x;cin>>x;
a1+=x*a[i][j];
a2+=x*a[i][0];
if(i==3)
b1+=b[j]*x,b2+=x*b[0];
double ans=a1/a2*100+b1/b2;
cout<<fixed<<setprecision(9)<<ans<<endl;
signed main()
//int t;cin>>t;
//while(t--)
solve();
return 0;
J-Jellyfish and its dream
差分数组。(2,0)可转化为(0,0),(1,1)可转化为(2,0),(0,1)可转化为(1,0),因此只要1的个数大于等于2的个数,便可将数组全消为0.
#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
#define maxn 1000000000LL
#define ULL unsigned long long
using namespace std;
const int N=7e6+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
int n,a[N];
void solve()
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
int x=0,y=0;
for(int i=0;i<n;i++)
if(a[i]!=a[(i+1)%n])
if((a[i]+1)%3==a[(i+1)%n])
x++;
else
y++;
if(x>=y)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
signed main()
int t;cin>>t;
while(t--)
solve();
return 0;
以上是关于8/18 牛客加赛补题的主要内容,如果未能解决你的问题,请参考以下文章
二叉树有关习题整理145二叉树的后序遍历 94二叉树的中序遍历 572另一棵树的子树 236二叉树的最近公共祖先 JZ36二叉搜索树与双向链表 - 牛客