牛客网小白月赛8

链接:https://www.nowcoder.com/acm/contest/214/C
来源:牛客网
 

题目描述

clccle一行?个人来到了一个诡异的世界,她们需要去寻找逃出这个地方的方法——找到神秘的所罗门之匙
她们决定从中随机选出一些人去寻找钥匙,并在其中选出一个队长,clccle不想知道自己有多大几率被选中,她只想知道一共有多少种选择的方案 (选出的人数要在1−?之间,不同的队长算不同的方案)。 
方案数对1000000007取模 

输入描述:

第一行,一个整数?。

输出描述:

一个整数,表示方案数。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
ll pow(ll a,ll b)
{
    ll ans=1,base=a;
    while(b!=0)
	{
        if(b&1!=0)    ans=ans*base%mod;
        base=base*base%mod;
        b>>=1;
    }
    ans=ans%mod;
    return ans;
}
int main()
{
	ll n;
	ll x=2;//一定要把2变为long long型
	scanf("%lld",&n);
	ll sum=n*pow(x,n-1)%mod;
	printf("%lld\n",sum);
	return 0;
}

链接:https://www.nowcoder.com/acm/contest/214/F
来源:牛客网
 

题目描述

clccle是个蒟蒻,她经常会在学校机房里刷题,也会被同校的dalao们虐,有一次,她想出了一个毒瘤数据结构,便兴冲冲的把题面打了出来,她觉得自己能5s内切掉就很棒了,结果evildoer过来一看,说:"这思博题不是1s就能切掉嘛",clccle觉得自己的信心得到了打击,你能帮她在1s中切掉这道水题嘛?

你需要写一个毒瘤(划掉)简单的数据结构,满足以下操作
1.插入一个数x(insert)
2.删除一个数x(delete)(如果有多个相同的数,则只删除一个)
3.查询一个数x的排名(若有多个相同的数,就输出最小的排名)
4.查询排名为x的数
5.求一个数x的前驱
6.求一个数x的后继

输入描述:

第一行,输入一个整数n,表示接下来需要输入n行

接下来n行,输入 一个整数num和一个整数x

输出描述:

当num为3,4,5,6时,输出对应的答案
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int t;
    cin>>t;
    vector <int> q;
    vector <int> ::iterator it;
    while(t--){
     int num,x;
     scanf("%d%d",&num,&x);
        if(num==1)
            q.insert(lower_bound(q.begin(),q.end(),x),x);
        else if(num==2)
            q.erase(lower_bound(q.begin(),q.end(),x));
        else  if(num==3)
            printf("%d\n",lower_bound(q.begin(),q.end(),x)-q.begin()+1);
        else if(num==4)
            printf("%d\n",q[x-1]);
        else if(num==5){
            it=lower_bound(q.begin(),q.end(),x);
            printf("%d\n",*(--it));
        }
        else if(num==6){
            it=upper_bound(q.begin(),q.end(),x);
            printf("%d\n",*it);
        }
    }
}

链接:https://www.nowcoder.com/acm/contest/214/A
来源:牛客网
 

题目描述

有一天clccle和rqy走在某个国家的街头上,机智的rqy却发现周围的行人不太对劲,他们嘴里念念有词,说着"sqn tql!",一边漫无目的的行走,clccle也发现了这一点,却惊讶的发觉这种奇怪的病毒会向周围的城市,最终会感染整个国家,因为网络已经崩溃,所以她们忘记了自己所在的城市,她们唯一知道的是这种病毒是从当前她们所在的城市开始传播的,并且这个国家的所有城市到这个城市的距离和最小(所有道路的距离都为1),现在给定聪明的你一张整个国家的地图,请你帮rqy和clccle找到她们现在可能在这个国家的哪一个城市.

输入描述:

两个整数n,m,代表这个国家一共有n个城市,城市之间只有m条道路

接下来m行,每行两个整数a,b代表城市a,b之间有一条联通的道路

输出描述:

多个整数,输出当前clccle和rqy可能所在的点
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
const int INF = 0x3f3f3f3f;
 
struct node {
    int to, nxt;
}a[maxn];
 
int cnt, head[maxn], n, m, mmin, v[maxn], f[maxn];
 
void add(int u, int v) {
    cnt++;
    a[cnt].nxt = head[u];
    a[cnt].to = v;
    head[u] = cnt;
}
 
void getpoint(int u, int fa) {
    int i, to;
    v[u] = 1;
    for (i = head[u]; i != -1; i = a[i].nxt) {
        to = a[i].to;
        if (to == fa) continue;
        getpoint(to, u);
        v[u] += v[to];
    }
 
    int &ans = f[u] = n - v[u];
 
    for (i = head[u]; i != -1; i = a[i].nxt) {
        to = a[i].to;
        if (to == fa) continue;
        ans = max(ans, v[to]);
    }
    mmin = min(mmin, ans);
}
 
int main() {
    int  i, x, y;
    scanf("%d%d", &n, &m);
    memset(head, -1, sizeof(head));
    memset(v, 0, sizeof(v));
 
    cnt = 0;
 
    mmin = INF;
    for (int i = 1; i <= m; i++) {
        scanf("%d%d", &x, &y);
        add(x, y);
        add(y, x);
    }
    getpoint(1, -1);
    for (i = 1; i <= n; i ++ ) {
        if (f[i] == mmin) {
            printf("%d ", i);
        }
    }
    return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
int h[200001],cnt=0,n,m;
int s[200001],f[200001],minn=0x7fffffff,b[200001];
struct Edge{
    int to,next;
}e[400001];
void AddEdge(int x,int y)
{
    e[++cnt].to=y;
    e[cnt].next=h[x];
    h[x]=cnt;
}
void dfs(int x,int prt)
{
    int i,y;
    s[x]=1;
    for(i=h[x];i;i=e[i].next)
    {
        y=e[i].to;
        if(y==prt)continue;
        dfs(y,x);
        s[x]+=s[y];
        f[x]=max(f[x],s[y]);
    }f[x]=max(f[x],n-s[x]);
}
int main(){
    int i,x,y;cin>>n>>m;
    for(i=1;i<=n-1;i++)
    {
        cin>>x>>y;
        AddEdge(x,y);
        AddEdge(y,x);
    }
    dfs(1,0);
    for(i=1;i<=n;i++)
    if(f[i]<minn)minn=f[i];
    for(i=1;i<=n;i++)
    if(f[i]==minn)b[++b[0]]=i;
    for(i=1;i<=b[0];i++)cout<<b[i]<<" ";
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值