首页 > 其他分享 >2023河南萌新联赛第(一)场:河南农业大学 11/12

2023河南萌新联赛第(一)场:河南农业大学 11/12

时间:2023-07-12 17:33:58浏览次数:33  
标签:11 12 return get int ll long read 萌新

晚来了一小时,终榜14名,血亏

https://ac.nowcoder.com/acm/contest/61132

A题不会,我选择oeis

n=int(input())
print(n*(n+1)*(n+2)//6%1000000007)
python代码

B题考虑线段树f[x][i][0]表示如果x所统辖的区间里,x第i位为0做计算得到的值,f[x][i][1]表示x所统辖的区间里,第i位为1做计算得到的值

那么叶子节点可以写三个if,合并两个区间时可以使用

        f[x][i][0]=f[x*2+1][i][f[x*2][i][0]!=0];         f[x][i][1]=f[x*2+1][i][f[x*2][i][1]!=0]; 询问时可以把[l,r]区间的转移矩阵合并,最后对于x的每一位计算答案 合并操作;         for(int i=0;i<=20;i++)         {             t[i][0]=f[x][i][t[i][0]!=0];             t[i][1]=f[x][i][t[i][1]!=0];         } 计算答案:             for(int i=0;i<=20;i++)             {                 ans=ans+t[i][ (x&(1<<i))!=0] ;             } (太C了,写了十五分钟就过了)
#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
ll read()
{
    ll x;scanf("%lld",&x);return x;
}
int n;
char s[100010];
int f[400010][25][2],t[25][2],a[100010];
int work(int xx,char c,int yy)
{
    if(c=='|')
        return xx|yy;
    else if(c=='^')
        return xx^yy;
    else
        return xx&yy;
}
void build(int x,int l,int r)
{
    if(l==r)
    {

        for(int i=0;i<=20;i++)
        {
            f[x][i][0]=work(0,s[l],a[l]&(1<<i));
            f[x][i][1]=work(1<<i,s[l],a[l]&(1<<i));
        }
        return ;
    }
    int mid=(l+r)/2;
    build(x*2,l,mid);
    build(x*2+1,mid+1,r);
    for(int i=0;i<=20;i++)
    {
        f[x][i][0]=f[x*2+1][i][f[x*2][i][0]!=0];
        f[x][i][1]=f[x*2+1][i][f[x*2][i][1]!=0];
    }
}
void add(int x,int l,int r,int d)
{
    if(l==r)
    {
        for(int i=0;i<=20;i++)
        {
            f[x][i][0]=work(0,s[l],a[l]&(1<<i));
            f[x][i][1]=work(1<<i,s[l],a[l]&(1<<i));
        }
        return ;
    }
    int mid=(l+r)/2;
    if(d<=mid)
        add(x*2,l,mid,d);
    else
        add(x*2+1,mid+1,r,d);
    for(int i=0;i<=20;i++)
    {
        f[x][i][0]=f[x*2+1][i][f[x*2][i][0]!=0];
        f[x][i][1]=f[x*2+1][i][f[x*2][i][1]!=0];
    }
}
void ask(int x,int l,int r,int tl,int tr )
{
    if(tl<=l&&r<=tr)
    {
        for(int i=0;i<=20;i++)
        {
            t[i][0]=f[x][i][t[i][0]!=0];
            t[i][1]=f[x][i][t[i][1]!=0];
        }
        return ;
    }
    int mid=(l+r)/2;
    if(tl<=mid)
        ask(x*2,l,mid,tl,tr);
    if(tr>mid)
        ask(x*2+1,mid+1,r,tl,tr);
}
int main()
{
//     freopen("1.in","r",stdin);
    n=read();
    scanf("%s",s+1);
    for(int i=1;i<=n;i++)
        a[i]=read();
    build(1,1,n);
    for(int m=read();m;m--)
    {
        if(read()&1)
        {
            int pos=read();
            a[pos]=read();
            add(1,1,n,pos);
        }
        else
        {
            int x=read(),l=read(),r=read(),ans=0;
            for(int i=0;i<=20;i++)
            {
                t[i][0]=0;
                t[i][1]=(1<<i);
            }
            ask(1,1,n,l,r);
            for(int i=0;i<=20;i++)
            {
                ans=ans+t[i][ (x&(1<<i))!=0] ;
            }
            printf("%d\n",ans);
        }
    }
}
B

 C 

如果先手一次能赢,输出alice

如果先手第一次怎么动,后手第一次一定能赢,输出Bob

否则输出平局

D

考虑二分答案,问题转变成判断,只经过小于等于val的点,到达ed的最短路是否小于等于h,暴力跑一跑即可。

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
ll read()
{
    ll x;scanf("%lld",&x);return x;
}
int n,m,st,ed,a[10010],vis[10010],h;
ll d[10010];
queue<int>q;
vector<int>e[10010],v[10010];
int check(int val)//要求路上的松果数量<=val
{
    memset(d,0x3f,sizeof(d));
    if(a[st]>val)
        return 0;
    d[st]=0;
    q.push(st);
    while(q.size())
    {
        int tx=q.front();
        q.pop();
        vis[tx]=0;
        for(int i=0;i<e[tx].size();i++)
        {
            if(a[e[tx][i]]<=val&&d[tx]+v[tx][i]<d[e[tx][i]])
            {
                d[e[tx][i]]=d[tx]+v[tx][i];
                if(vis[e[tx][i]]==0)
                {
                    vis[e[tx][i]]=1;
                    q.push(e[tx][i]);
                }
            }
        }
    }
    if(d[ed]<=h)
        return 1;
    return 0;
}
int main()
{
    // freopen("1.in","r",stdin);
    n=read();m=read();st=read();ed=read();h=read();
    for(int i=1;i<=n;i++)
        a[i]=read();
    for(int i=1;i<=m;i++)
    {
        int x=read(),y=read(),z=read();
        e[x].push_back(y);
        v[x].push_back(z);
        e[y].push_back(x);
        v[y].push_back(z);
    }
    int l=1,r=10000000,mid;
    while(l+1<r)
    {
        mid=(l+r)/2;
        if(check(mid))
            r=mid;
        else
            l=mid;
    }
    if(check(l))
        cout<<l;
    else if(check(r))
        cout<<r;
    else
        cout<<-1;
}
D

 E

对于当前前缀和sum,只需判断sum-m是否出现过即可,用前缀和维护一下。

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
ll read()
{
    ll x;scanf("%lld",&x);return x;
}
int n,m,ans;
ll sum;
map<ll,int>o;
int main()
{
    n=read();m=read();
    o[0]=1;
    for(int i=1;i<=n;i++)
    {
        sum=sum+read();
        ans=ans+o[sum-m];
        o[sum]++;
    }
    cout<<ans;
}
E

F

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
ll read()
{
    ll x;scanf("%lld",&x);return x;
}
int ans;
int n,a[100010],fa[100010];
int get(int x)
{
    return fa[x]==x?x:fa[x]=get(fa[x]);
}
void merge(int x,int y)
{
    if(get(x)==get(y))
        return ;
    fa[get(x)]=get(y);
}
int main()
{
    n=read();
    for(int i=1;i<=n;i++)
        fa[i]=i;
    for(int i=1;i<=n;i++)
    {

        a[i]=read();
        merge(a[i],i);
    }
    ans=n;
    for(int i=1;i<=n;i++)
        if(i==get(i))
            ans--;
    cout<<ans;
}
F

 

 

标签:11,12,return,get,int,ll,long,read,萌新
From: https://www.cnblogs.com/qywyt/p/17548290.html

相关文章

  • 7.12
    面向对象是一种现在最为流行的程序设计方法,几乎现在的所有应用都以面向对象为主了,最早的面向对象的概念实际上是由IBM提出的,在70年代的Smaltalk语言之中进行了应用,后来根据面向对象的设计思路,才形成C++,而由C++产生了Java这门面向对象的编程语言。但是在面向对象设计之前,广泛采......
  • Day08(2023.07.12)
    行程8:45    到达上海市信息安全测评认证中心(黄浦区陆家浜路1308号)9:00  学习《网络安全等级测评师培训教材》11:30--13:00   吃饭休息13:00 学习《网络安全等级测评师培训教材》17:00      下班 路由器:堡垒机:如......
  • LeetCode 剑指 Offer 11. 旋转数组的最小数字
    题目链接:LeetCode剑指Offer11.旋转数组的最小数字题意:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [......
  • LeetCode 剑指 Offer 12. 矩阵中的路径
    题目链接:LeetCode剑指Offer12.矩阵中的路径题意:给定一个 mxn二维字符网格 board和一个字符串单词 word。如果 word存在于网格中,返回true;否则,返回false。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元......
  • HHHOJ #1238. 「NOIP 2023 模拟赛 20230712 D」但战斗还未结束 思考--zhengjun
    赛时想写60pts,结果cxr似乎少算了一点空间,导致我一直没把空间卡过去QWQ。当时不会dfs求拓扑序,这里讲一下。枚举所有非访问过的点依次dfs,每次进行下列操作:找出\(v\)的一个未访问过的入点\(u\),调用dfs(u);找不到\(u\)的时候,把\(v\)加入拓扑序列中。代码#inc......
  • 【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组4
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组3
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 123
    之前由于安装Dolby音效的软件,导致无法开机解决办法:1.安全启动开机按F8,选择“安全启动”,进入到系统2.删除程序如果软件和驱动可以直接卸载就卸载,不能卸载就用文件夹在C盘搜索相关文件名,然后删除所有的文件,如果无权删除可以右击使用腾讯电脑管家删除。如果没有安装电脑管......
  • 【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组2
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 7.12日
    一、学Java的容器部分并完成五道练习题,之后就可以开始学技术内容了。二、cf刷题,最低170道,然后模拟参与一场竞赛。在这里恭喜一下自己,第一次做出四道题,上大分。 #include<bits/stdc++.h>#defineintlonglong#definexfirst#defineysecond#defineendl'\n'#define......