首页 > 其他分享 >Codeforces Round #766 (Div. 2)C,D

Codeforces Round #766 (Div. 2)C,D

时间:2022-12-29 20:00:52浏览次数:61  
标签:cnt int 质数 766 Codeforces maxn Div head id

Codeforces Round #766 (Div. 2)C,D

今天A竟然看错了,还好后来发现了,A题就写了40几分钟,真有你的

过了B,排名是8千多,比前几天好一点,加油ヾ(◍°∇°◍)ノ゙

C

C

相比于D ,我更没有看懂这一题讲的质数数是个什么东西

后来看了大佬们的讲解,理解了一点

所谓的质数树,这棵树里的每一条边和他相邻的边的和是一个质数

我们可以让相邻的两条边一条为2,一条为3,2,3,2,3这一条链上的边一个2一个3,这样每两个边的和都是5

还有一种情况

是一个节点有3个子节点,或者父节点,这样有三条边是相邻的,假如边1和边2的和是5,边2和边3是5,那边2和边1的和一定是一个4(就算是换成其他的数也不行,众所周知,质数除了2就是奇数,那么这三条边一定有两条边是奇数,其和一定是偶数),所以当一个点的入度大于等于3时,一定是找不到质数树的

如果可以找到就用dfs建边一个一个从入度为1(看做起点)的点开始找(每一点都会在里面,因为有n-1条边,不会出现自环,题目提及)

题目注意不要超时,memset时间复杂度过大,尽量少用

#include <iostream>
#include <cstring>
using namespace std;
#define int long long 
const int maxn=2e5+10;
struct edge
{
    int next,to,id;
}e[maxn];
int head[maxn],cnt;
int val[maxn];
int n,t;
void add(int u,int v,int id)
{
    e[++cnt].next=head[u];
    e[cnt].to=v;
    e[cnt].id=id;
    head[u]=cnt;
    return ;
}
void dfs(int u,int fa,int flag)
{
    for (int i=head[u];i;i=e[i].next)
    {
        int v=e[i].to;
        if (v==fa) continue;
        val[e[i].id]=flag;
        dfs(v,u,flag^1);
    }
    return ;
}
void solve()
{
    cin>>n;
    int cnt=0;
    bool yes=true;
    memset(head,0,sizeof(head));
    int in[maxn]={0};
    for (int i=1;i<n;i++)
    {
        val[i]=0;
        int u,v;
        cin>>u>>v;
        add(u,v,i);
        add(v,u,i);
        in[v]++;
        in[u]++;
       // cout<<"&& "<<in[u]<<" "<<in[v]<<" &&\n";
        if (in[u]>=3||in[v]>=3) yes=false;
    }
    if (!yes)
    {
        cout<<-1<<'\n';
        return ;
    }
    for (int i=1;i<=n;i++)
    {
        if (in[i]==1)
        {
            dfs(i,-1,1);
            break;
        }
    }
    for (int i=1;i<n;i++)
    {
        if (val[i]) cout<<2<<" ";
        else cout<<3<<" ";
    }
    cout<<'\n';
    return ;
}
signed  main ()
{
    ios::sync_with_stdio(false);
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

D

D

这一题好像我之前的一道题很相似

是给你一个数组,你可以进行一个操作,找到ai和aj,假如gcd(ai,aj)不在数组,就可以把这个数放到数组里,然后再寻找,问你你可以进行最大次数的操作

不过那一到题是相减,这里是gcd,这里有一个巧妙的做法,我之前是直接找i的倍数,如果存在两个以上i的倍数,就代表存在两个数的gcd是i,但是这也不一定,有可能是i的倍数,比如i时3,出现了6和12,那么就不对了,而下面的处理就很好的解决了这个问题

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1e6+10;
bool vis[maxn];
int a[maxn];
int ans;
int main ()
{
    int n;
    cin>>n;
    ans=0;
    int mx=0;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
        mx=max(mx,a[i]);
        vis[a[i]]=true;
    }
    for (int i=1;i<mx;i++)
    {
        if (vis[i]) continue;
        int g=-1;//这里很巧妙哦,
        for (int j=i+i;j<=mx;j+=i)
        {
            if (vis[j]) 
            {
                if (g==-1) g=j/i;
                else g=__gcd(g,j/i);
            }
        }
        if (g==1) ans++;//前面的一顿操作下来,如果此时g=1就代表着着n个数里存在两个数的gcd=i
    }
    cout<<ans<<'\n';
    system ("pause");
    return 0;
}

标签:cnt,int,质数,766,Codeforces,maxn,Div,head,id
From: https://www.cnblogs.com/righting/p/17013412.html

相关文章

  • Codeforces Round #764 E
    E.Masha-forgetful题链结论就是任何长的串都可以被2,3长度的串表示后面就是暴力hash和很常规的dp[i]表示前i个是否匹配了voidsolve(){intn,m;cin>>n>>m;tu......
  • CodeForces 1163D Mysterious Code
    洛谷传送门CF传送门zxx的题单来的(发一个无脑kmp自动机+dp做法。看到题就很dp,考虑设计状态。显然填字母时要知道当前串与\(s,t\)的匹配位数,否则就不知道\(s,......
  • Codeforces 随机补题记录
    日期序号题号点评12.2029CF1694E很有借鉴意义的化用算法题12.2138CF1713F子集启蒙题12.2954CF1761E有很多细节,要想清楚,下次不要面向数据编程了......
  • Educational Codeforces Round 7
    EducationalCodeforcesRound7https://codeforces.com/contest/622/problems3/6:ABDA.InfiniteSequence水题#include<bits/stdc++.h>usingnamespacestd;i......
  • Codeforces Round #841 (Div. 2) and Divide by Zero 2022
    Preface这场Div2怎么感觉难度和Div3一样,ABCD都是SB题一眼秒,可惜D下标\(n,m\)弄混挂了一发E本来也是秒出的正解,但是实现的时候一个细节挂了(自作聪明,后来结束前5min改出来......
  • Codeforces Round #841 (Div. 2) and Divide by Zero 2022
    《C.EvenSubarrays》异或和,前缀和  这道题如果用朴素的暴露解法为O(n^2),算出每一个子段的异或和,然后看一下这些异或和中哪个的除数是奇数个,但会超时 超时原因明......
  •   Codeforces Round #841 (Div. 2) and Divide by Zero 2022 -----C. Even Subarray
    题目链接:https://codeforces.com/contest/1731/problem/C  题目的大致意思是:给长度为n的数组,求 子数组的异或和  的结果的除数个数为偶数个的子数组有多......
  • Codeforces Round #841 (Div. 2) and Divide by Zero 2022
    CodeforcesRound#841(Div.2)andDividebyZero2022o(╥﹏╥)o2022的最后一场也没打好B题反正我是理解错了,我看到题目上写着要相乘再取模,结果就真的去先乘再取模,这......
  • vant轮播多个,实现一次轮播中展示多个div,四个一屏为例
    实现效果如下:实现思路:1、官方示例是循环列表,如下代码块,从而实现每屏只有一张图片;<van-swipe-itemv-for="(image,index)inimages":key="index"><imgv-lazy="......
  • Codeforces Round #841 (Div. 2) and Divide by Zero 2022
    A.JoeyTakesMoney题意:给定n个整数,每次操作可以选择两个整数,获得两数之积,再构造一组(x,y)使得x*y等于两数之积,并将原来的数替换为x,y,求操作若干次后n个数......