首页 > 其他分享 >2024牛客多校第四场

2024牛客多校第四场

时间:2024-07-29 11:06:23浏览次数:19  
标签:std 第四场 int void len 2024 牛客 return include

F

找规律题,点击查看全网最详解(臭不要脸的本人给自己打广告):

2024牛客多校第四场F.Good Tree 挑战全网最详解 - liyishui - 博客园 (cnblogs.com)

代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
int T,x;
int sol(){
    cin >> x;
    int n=sqrt(x);
    while (n*n>x) n--; 
    //printf("n=%lld\n",n);
    if (n*n==x) return 2*n+1;
    if (n*n+n>=x){
        if ((n*n+n-x)%2) return 2*n+3;
        return 2*n+2;
    }
    else{
        return 2*n+3;
    }
}
void test(){
    for (int i=1;i<=10;i++){
        x=i;
        printf("%lld:%lld\n",i,sol());
    }
}
signed main(){
//    test();
    cin >> T;
    while(T--) cout << sol() << endl;
    return 0;
}

A

带权并查集或者先dfs搜一遍都可做。

std是带权并查集,我队友写的先dfs预处理出每个点最后深度,再维护一个当前u所形成的联通块的最大深度,对减一下就是答案

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int T;
const int N=1e6+505;
int n,root,u[N],v[N],c[N],vis[N];
int fa[N],h[N];
int edgenum,head[N],vet[N],Next[N],dep[N];
void edge(int u,int v){
    edgenum++;
    Next[edgenum]=head[u];
    head[u]=edgenum;
    vet[edgenum]=v;
}
void dfs(int u,int depth){
    dep[u]=depth;
    for (int i=head[u];i;i=Next[i]){
        int v=vet[i];
        if (dep[v]) continue;
        dfs(v,depth+1);
    }
}
int find(int x){
    if (fa[x]==x) return x;
    return fa[x]=find(fa[x]);
}
void work(){
    scanf("%d",&n);
    edgenum=0;
    for (int i=1;i<=n;i++){
        head[i]=0;
        vis[i]=0;
        dep[i]=0;
        fa[i]=i;        
    }

    for (int i=1;i<n;i++){
        scanf("%d%d%d",&u[i],&v[i],&c[i]);
        edge(u[i],v[i]);
        vis[v[i]]=1;
    }
    for (int i=1;i<=n;i++)
        if (vis[i]==0){
            root=i;
            break;
        }
    dfs(root,1);
    for (int i=1;i<=n;i++)
        h[i]=dep[i];
    for (int i=1;i<n;i++){
        int top=find(u[i]);
        fa[v[i]]=top;
        h[top]=max(h[top],h[v[i]]);
        printf("%d ",h[c[i]]-dep[c[i]]);
    }
    printf("\n");
} 
signed main(){
    cin >> T;
    while(T--) work();
    return 0;
}

G

中考数学,做对称轴

#include<cstdio>
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
int T,s1,t1,s2,t2;
double dist(int s1,int t1,int s2,int t2){
    int s=s1-s2;
    int t=t1-t2;
    return sqrt(s*s+t*t);
}
void work(){
    cin >> s1 >> t1 >> s2 >> t2;
    printf("%.10lf\n",min(dist(s1,-t1,s2,t2),dist(-s1,t1,s2,t2)));
} 
signed main(){
    cin >> T;
    while(T--) work();
    return 0;
}

I

经典双指针

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int n,m,R[N+5],ans=0;
vector<int> v[N+5];
void Kafka()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;++i)
    {
        int x,y;
        cin>>x>>y;
        if(x>y) swap(x,y);
        v[x].push_back(y);
    }
    for(int i=1;i<=n;++i) sort(v[i].begin(),v[i].end());
    for(int i=1;i<=n;++i) 
    {
        R[i]=i;
        for(int j=0,lim=v[i].size();j<lim;++j)
        {
            int y=v[i][j];
            if(y==R[i]+1)++R[i];
            else break;
        }
    }
    for(int i=n,cur=n,len;i;--i)
    {
        cur=min(cur,R[i]);
        len=cur-i+1;
        ans+=len;
    }
    cout<<ans<<endl;
}
signed main()
{
    Kafka();
    return 0;
}

H

折纸题。这里提供另一个不同于题解的证明思路:

考虑从小到大的三个点a1,a2,a3。并假设a1和a2之间的距离为x,a2和a3的距离为y。

2x-y的操作其实是以x为对称轴做y的对称点y'(这提示我们有的式子可以拆数学意义or几何意义)

现在选择a2为对称轴,把a1对称过去(你说可能a1对称后比a3还大,那我们就操作a3,这里以a1为例)

现在两点之间的差距变成了y,y-x。

从x,y变成y,y-x!这个形式不就是更相减损吗?这其实就是我们求gcd的过程,只不过求gcd时用了%加速了,本质上是一样的。

那么我们就可以得到:对于两个数x,y来说,最后有一个数变成0,另一个数变成它们的gcd

再回到图像上,不就是有两个点重叠,三个点变成两个点,差值也变成gcd了嘛

现在把3个点的情况扩展到4个,5个...也是一样的

所以最后的答案是gcd(a2-a1,a3-a2,a4-a3...an-an-1)

多倍经验好题:

1477A - Nezzar and Board

#include<cstdio>
#include<iostream>
#define int long long
using namespace std;
const int N=1e5+505;
int T,n;
int a[N];
int gcd(int x,int y){
    if (y==0) return x;
    return gcd(y,x%y);
}
void work(){
    scanf("%lld",&n);
    for (int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    int res=0;
    for (int i=1;i<n;i++){
        int x=a[i+1]-a[i];
        if (x<0) x=-x;
        res=gcd(res,x);
    }
        
    cout << res << endl;
} 
signed main(){
    cin >> T;
    while(T--) work();
    return 0;
}

C

经典置换环,发现每个点的去向是固定的,把每个位置向最后要去的地方连边,最后图一定是若干个环(因为每个点都是一个出度一个入度)

讨论一下环大小对答案的影响即可。

一次能操作4,所以环为4直接一起干掉,3的话也是。

2比较特别,一次能操作两个2,这块和在一起做掉。

5以上的发现一次最多能满足3个,就不断-3,看最后剩多少。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
int vis[N],a[N],to[N];
int n,ans=0,cnt2=0;
void dfs(int u,int len){
    vis[u]=1;
    if(vis[to[u]]) {
        if(len==1) { }
        else if(len==2) cnt2++;
        else if(len==3||len==4) ans++;
        else if(len>=5){
            if( (len-4)%3==0 ) ans+=(len-4)/3+1;
            else if(len%3==0) ans+=len/3;
            else if(len%3==2) ans+=len/3,cnt2++;
        }
        return;
    }
    else dfs(to[u],len+1);
}
void solve(){
    cin>>n;
    ans=cnt2=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        vis[i]=0;
        to[i]=a[i];
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            dfs(i,1);
        }
    }
    ans+=cnt2/2;
    if(cnt2&1) ans++;
    cout<<ans<<"\n";
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

J

把式子用二项式定理展开

#include<bits/stdc++.h>
using namespace std;
const int N=1e5,mod=998244353;
inline int add(int x,int y){return (x+=y)>=mod?x-mod:x;}
inline int sub(int x,int y){return (x-=y)<0?x+mod:x;}
inline int mul(int x,int y){return 1LL*x*y%mod;}
inline int qpow(int a,int p){int res=1;for(;p;p>>=1,a=mul(a,a))if(p&1)res=mul(res,a);return res;}
int n,k,sum[N+5],ans=0;
char s[N+5];
int fac[N+5],invf[N+5];
inline int C(int x,int y){return x<y?0:mul(fac[x],mul(invf[y],invf[x-y]));}
void Himeko()
{
    fac[0]=1;for(int i=1;i<=N;++i) fac[i]=mul(fac[i-1],i);
    invf[N]=qpow(fac[N],mod-2);for(int i=N-1;~i;--i) invf[i]=mul(invf[i+1],i+1);
}
void Kafka()
{
    cin>>n>>k;
    cin>>s+1;
    for(int p=0,div2=qpow(2,mod-2),q,res;p<=k;++p)
    {
        q=k-p,res=0;
        for(int i=n;i;--i) 
        {
            if(s[i]=='0') sum[i]=0;
            else sum[i]=add(sum[i+1],qpow(i,q));
            if(s[i]=='?') sum[i]=mul(sum[i],div2);
        }
        for(int i=1;i<=n;++i)
        {
            if(s[i]=='0') continue;
            int tmp=mul(sum[i],qpow(i-1,p));
        //    if(s[i]=='?') tmp=mul(tmp,div2);
            res=add(res,tmp);
        }
        res=mul(res,C(k,p));
        if(p&1) ans=sub(ans,res);
        else ans=add(ans,res);
    }
    cout<<ans<<endl;
}
signed main()
{
    Himeko();
    Kafka();
    return 0;
}
/*
2 3
1?
*/

 

标签:std,第四场,int,void,len,2024,牛客,return,include
From: https://www.cnblogs.com/liyishui2003/p/18329667

相关文章

  • 2024超声波清洗机排行榜大整理!哪个超声波清洗机比较好?
    2024年已经过了一半,超声波清洗机已成为家庭与商业清洁领域的热门选择。但并非所有产品都能达到预期的清洁标准。市面上,一些廉价的机型仅搭载低质马达,清洁能力有限,甚至会对清洗物品造成损害,有一种“清洁不成反添乱”的感觉。因此,选择出那些各方面都比较优秀的品牌是比较需要的。......
  • NOI2024 F 类游记
    前情提要:省选\(\rmDay1T1\)\(\rmCE\),获得\(\rmF\)类资格。前面一周天天有多校或者模拟赛,抽不出完整的\(5h\)供我\(\rmvp\),于是把\(\rmDay1\)的\(\rmvp\)放到了周日。假装我笔试\(\rmAK\)了。但是已经过去这么多天了,不可避免的知道了一些东西,包括队线,某些题......
  • 禅道项目管理系统权限绕过漏洞(QVD-2024-15263)
    本文所涉及的任何技术、信息或工具,仅供学习和参考之用,请勿将文章内的相关技术用于非法目的,如有相关非法行为与文章作者无关。请遵守《中华人民共和国网络安全法》。1.概述1.1基本信息禅道是一款支持敏捷、瀑布、看板等多种项目模型的开源项目管理软件,可完整覆盖研发项目的......
  • 【2024-07-26】连岳摘抄
    23:59一定要重视家和经营好家。同时,中国是一个差序格局社会,其他组织都是以家为同心圆的延拓,你们也要爱自己所服务的组织,爱所在的社区,爱自己的国家。                                        ......
  • 【2024-07-25】连岳摘抄
    23:59我们从来不搞一鸣惊人的事情,我们什么事情都慢慢来,实际上很快。                                                 ——XXX人的记忆,倾向于记住不愉快的事,而忽视愉......
  • 【2024-07-24】连岳摘抄
    23:59处事要代人作想,读书须切己用功。                                                 ——王永彬万一不得不一个人过这一生,有几点建议:一是同意你的“孝敬父母”,养......
  • 2024年中国AI基础数据服务研究报告(附下载)
    点击访问我的技术博客https://ai.weoknow.comhttps://ai.weoknow.com......
  • 【新方法】1分钟搞定2024暑期教师研修!(7.29更新)
    写在前面代码失效,现在采用修复后的油猴脚本,跟代码区别就是隔几秒再点下一个视频即可,学时可以记录上。仅限于中小学,职教和高教不可以。不会操作可以绿泡泡daikan856.脚本https://greasyfork.org/zh-CN/scripts/486386-2024年智慧中小学暑假教师研修-秒过-每个视频只点1遍-不懂先......
  • NOI2024 摆烂记
    某菜鸡初三Oier的NOID类游记。。。。Day-8~Day-2因为重庆育才有冲刺NOI的训练(其实就是多校联考),所以我提前几天来到了重庆。然后就是正常的多校集训。最后一天休息时还去爬了山,不得不说重庆是真的热,爬完真的累死我了。Day-1下午是报道,然后就逛了一下CQYC。食堂还是自助,而......
  • 2024世界人工智能大会:智象未来(HiDream.ai)入围多行业示范性应用案例
    在刚刚闭幕的世界人工智能大会(2024WAIC)上,智象未来(HiDream.ai)依托自身领先的行业技术,入围多行业示范性应用案例,充分展示了其在人工智能领域的卓越成就和创新能力。会上,智象未来(HiDream.ai)联合创始人兼CTO姚霆博士正式推出了备受期待的“智象大模型2.0”。新一代多模态大模型......