首页 > 其他分享 >[游记]暑假集训5-2022.8.17

[游记]暑假集训5-2022.8.17

时间:2022-08-17 17:11:45浏览次数:59  
标签:ch 17 int long WR 2022.8 include 集训 define

今天的题目都比较有思维量,嗯

A. 星际旅行

考虑一下去掉那两条有向边,就是一个典型的欧拉回路

然后问的就是能够生成的欧拉回路的个数

考虑每次删掉两条边,有三种删除方法:

$\quad\mathfrak{1:}$ 删掉两个自环

$\quad\mathfrak{2:}$ 删掉一个自环和一条边

$\quad\mathfrak{3:}$ 删掉两条有公共顶点的边

注意到如果原图有两个以上分开的连通块无解

 

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#define int long long
#define WR WinterRain
using namespace std;
const int WR=300100,INF=1099588621776;
struct Edge{
    int pre,to;
}edge[WR<<1];
int n,m;
int cnt=0;
int head[WR],tot,opt[WR];
bool vis[WR];
int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch>'9'||ch<'0'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=(s<<1)+(s<<3)+ch-'0';
        ch=getchar();
    }
    return s*w;
}
void add(int u,int v){
    edge[++tot].pre=head[u];
    edge[tot].to=v;
    head[u]=tot;
}
void dfs(int u){
    vis[u]=true;
    for(int i=head[u];i;i=edge[i].pre){
        int v=edge[i].to;
        if(!vis[v]) dfs(v);
    }
}
signed main(){
    n=read(),m=read();
    for(int i=1;i<=m;i++){
        int u=read(),v=read();
        if(u==v){
            cnt++;
            continue;
        }
        add(u,v);add(v,u);
        opt[u]++,opt[v]++;
    }
    if(!tot){
        printf("0\n");
        return 0;
    }
    int ans=(cnt*tot/2)+(cnt*(cnt-1)/2);
    for(int i=1;i<=n;i++){
        if(opt[i]){
            dfs(i);
            break;
        }
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]&&opt[i]){
            printf("0\n");
            return 0;
        }
    }
    for(int i=1;i<=n;i++){
        ans+=opt[i]*(opt[i]-1)/2;
    }
    printf("%lld\n",ans);
    return 0;
}
View Code

 

B. 砍树

 

 考虑用数论分块维护这个 $d$ 就好了

 

#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#define int long long
#define WR WinterRain
using namespace std;
const int WR=300100,INF=1099588621776;
int n,k,sum;
int ans;
int a[WR];
int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch>'9'||ch<'0'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=(s<<1)+(s<<3)+ch-'0';
        ch=getchar();
    }
    return s*w;
}
signed main(){
    n=read(),k=read();
    for(int i=1;i<=n;i++) a[i]=read(),sum+=a[i];
    int l,tot=sum+k,r;
    for(l=1;l<=tot;l=r+1){
        r=tot/(tot/l);
        int res=0;
        for(int i=1;i<=n;i++) res+=ceil((double)a[i]/r);
        if(res*r<=tot) ans=r;
    }
    printf("%lld\n",ans);
    return 0;
}
View Code

 


C. 超级树

 

 

 

 题解写得很明白了

 

#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#define int long long
#define WR WinterRain
using namespace std;
const int WR=300100,INF=1099588621776;
int n,mod;
int dp[1010][1010];
int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch>'9'||ch<'0'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=(s<<1)+(s<<3)+ch-'0';
        ch=getchar();
    }
    return s*w;
}
signed main(){
    n=read(),mod=read();
    dp[1][0]=dp[1][1]=1;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            for(int l=0;l<=j;l++){
                int r=j-l,tmp=dp[i][l]*dp[i][r]%mod;
                dp[i+1][l+r]=(dp[i+1][l+r]+tmp+2*tmp*(l+r)%mod)%mod;
                dp[i+1][l+r+1]=(dp[i+1][l+r+1]+tmp)%mod;
                dp[i+1][l+r-1]=(dp[i+1][l+r-1]+tmp*(l*(l-1)%mod+r*(r-1)%mod)%mod+2*tmp%mod*l*r%mod)%mod;
            }
        }
    }
    printf("%lld\n",dp[n][1]);
    return 0;
}
View Code

 

D. 求和

场切题目我没分

挂分原因:写了个树剖

正解非常平凡,预处理出所有的 $dpt[i]^k$ 然后查询完事

 

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#define int long long
#define WR WinterRain
using namespace std;
const int WR=300500,INF=1099588621776,mod=998244353;
struct Edge{
    int pre,to;
}edge[WR<<1];
struct Query{
    int u,v,k,id;
    bool operator<(const Query &b)const{
        return k<b.k;
    }
}ask[WR];
int n,m;
int head[WR],tot;
int dis[WR][51],fa[WR][30];
int dpt[WR];
int ans[WR];
bool vis[100];
int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch>'9'||ch<'0'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=(s<<1)+(s<<3)+ch-'0';
        ch=getchar();
    }
    return s*w;
}
void add(int u,int v){
    edge[++tot].pre=head[u];
    edge[tot].to=v;
    head[u]=tot;
}
int quick_pow(int a,int b){
    int base=a,res=1;
    while(b){
        if(b&1) res=res*base%mod;
        base=base*base%mod;
        b>>=1;
    }
    return res;
}
void dfs(int u,int root){
    fa[u][0]=root;dpt[u]=dpt[root]+1;
    for(int i=1;i<=25;i++){
        fa[u][i]=fa[fa[u][i-1]][i-1];
    }
    for(int i=1;i<=50;i++){
        dis[u][i]=(dis[root][i]+quick_pow(dpt[u],i))%mod;
    }
    for(int i=head[u];i;i=edge[i].pre){
        int v=edge[i].to;
        if(v==root) continue;
        dfs(v,u);
    }
}
int LCA(int x,int y){
    if(dpt[x]<dpt[y]) swap(x,y);
    for(int i=25;i>=0;i--){
        if(dpt[fa[x][i]]>=dpt[y]){
            x=fa[x][i];
        }
    }
    if(x==y) return x;
    for(int i=25;i>=0;i--){
        if(fa[x][i]!=fa[y][i]){
            x=fa[x][i]; y=fa[y][i];
        }
    }
    return fa[x][0];
}
signed main(){
    n=read();
    for(int i=1;i<n;i++){
        int u=read(),v=read();
        add(u,v);add(v,u);
    }
    dpt[0]=-1;dfs(1,0);
    m=read();
    for(int i=1;i<=m;i++){
        int x=read(),y=read(),k=read();
        int lca=LCA(x,y);
        printf("%lld\n",(dis[x][k]+dis[y][k]-dis[fa[lca][0]][k]-dis[lca][k]+2*mod)%mod);
    }
    return 0;
}
View Code

 

标签:ch,17,int,long,WR,2022.8,include,集训,define
From: https://www.cnblogs.com/WintersRain/p/16593595.html

相关文章

  • NOIP2022模拟赛二 By yzxoi 8.17
    Preface今天早上被公交车搞了,晚了30min才到……最后T1读入\(n\)的时候写%d了,喜提30pts(结果Rank竟然不变233)A.「NOIP2022模拟赛二ByyzxoiA」『Pale』/feat.初音ミ......
  • 172 树套树 线段树套平衡树
    视频链接:LuoguP3380【模板】二逼平衡树(树套树)//需要开O2#include<iostream>#include<algorithm>usingnamespacestd;#defineN2000010#defineINF21474836......
  • CF1719B Mathematical Circus
     题意简述:对于给定的$n,k$,能否将$1,2,3,...,n$($n$为偶数),两两分组.求对于每个分组($x_i$,$y_i$),是否全部满足$4\mid(x_i+k)*y_i$,如果分组全部......
  • [AcWing 1117] 单词接龙
    DFS点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=50+10;intn;stringword[N];intg[N][N];//g[i][......
  • 摸鱼喽哈哈!!!8.17 写了就是我的
    1、一个数组,有很多个字典 长这样:data_list=[{'Type1':114,'Type2':514},{'Type1':1919,'Type2':810}]一般json获取的数据,就可能会长成这个样子,问题不大可以直接df一下......
  • 2022-8-17 剑指offer-二叉树-递归
    剑指OfferII054.所有大于等于节点的值之和难度中等35收藏分享切换为英文接收动态反馈给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值......
  • 22/8/17 python基础学习
    python语法基础python解释器提供一个traceback,指出解释器尝试运行代码时的错误信息。第二章变量和简单数据类型在字符串中使用变量:f字符串:实例代码:first_name="ada......
  • 《GB17896-2012》PDF下载
    《GB17896-2012管形荧光灯镇流器能效限定值及能效等级》PDF下载《GB17896-2012》简介本标准规定了管形荧光灯电子镇流器的能效等级、能效限定值、节能评价值和电感镇流......
  • 暑期集训4
    rank29mark150题纲:T1:赛时全员AC,其他的应该不用说什么了T2:图论,竞赛图统计强连通分量(位运算的应用)T3:计数类DPT4:线段树维护dfs序-->树剖-->染色T2:定义竞赛图,任意两点......
  • 学习Js-day17
    轮播图简单轮播图的实现:(自动轮播,小圆点切换图片,左右按钮切换图片,鼠标移入有左右切换图标,移出消失,鼠标悬停停止轮播,移开继续轮播)HTML首先是html内容,布局很简单,一个图片......