Codeforces Round #343 (Div. 2)

Codeforces Round #343 (Div. 2) 解题报告 Codeforces Round #343 (Div. 2) 阅读详情

C. Famil Door and Brackets

dp。状态 dp(i,j,k) , i 表示填充到了第几个括号,j表示当前左括号比右括号多多少, k 表示当前在那个子串的左边还是右边填充,状态转移见代码。要注意一些情况,比如要保证任何时候前缀的左括号不少于右括号,后缀的右括号不少于左括号。还有当n=m时,判断子串的合法性。

#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int mod = 1e9+7;

char str[100010];

ll dp[2010][2010][2];

int main(){
    int n,m;
    while(cin>>n>>m){
    memset(dp,0,sizeof(dp));
    scanf("%s",str);
    int lcnt=0;
    int rcnt=0;
    int cnt=0;
    int MAX=-1e9;
    int MAX2=-1e9;

    for(int i=m-1;i>=0;i--){
        if(str[i]=='('){
            cnt++;
        }else{
            cnt--;
        }
        MAX2=max(MAX2,cnt);
    }

    cnt=0;
    bool valid = 1;
    for(int i=0;i<m;i++){
        if(str[i]=='('){
            lcnt++;
            cnt--;
        }else{
            rcnt++;
            cnt++;
        }
        if(rcnt>lcnt)valid=0;
        MAX=max(MAX,cnt);
    }

    int d=n-m;
    if(lcnt+d<rcnt){
    }else if(rcnt+d<lcnt){
    }else{
        dp[0][0][0]=1;
        for(int i=1;i<=d;i++){
            for(int j=0;j<=d;j++){
                if(d-i>=MAX2 && j<d){
                    dp[i][j+1][0] += dp[i-1][j][0];
                    dp[i][j+1][0] %= mod;
                }
                if(d-i>=MAX2 && j>0){
                    dp[i][j-1][0] += dp[i-1][j][0];
                    dp[i][j-1][0] %= mod;
                }

                if(j>=MAX && j+lcnt-rcnt+1<=d && j+lcnt-rcnt+1>=0){
                    dp[i][j+lcnt-rcnt+1][1] += dp[i-1][j][0];
                    dp[i][j+lcnt-rcnt+1][1] %= mod;
                }
                if(j>=MAX && j+lcnt-rcnt-1<=d && j+lcnt-rcnt-1>=0){
                    dp[i][j+lcnt-rcnt-1][1] += dp[i-1][j][0];
                    dp[i][j+lcnt-rcnt-1][1] %= mod;
                }

                if(j<d){
                    dp[i][j+1][1] += dp[i-1][j][1];
                    dp[i][j+1][1] %= mod;
                }
                if(j>0){
                    dp[i][j-1][1] += dp[i-1][j][1];
                    dp[i][j-1][1] %= mod;
                }
            }
        }
    }

    ll ans = dp[d][0][1];
    if(rcnt-lcnt>=0 && rcnt-lcnt<=d){
        ans += dp[d][rcnt-lcnt][0];
    }
    ans %= mod;
    if(n==m && !valid)ans=0;
    cout<<ans<<endl;
    }
    return 0;
} 

D. Babaei and Birthday Cake

由于任意蛋糕的上方只能是编号更大的蛋糕,所以逆序处理。将蛋糕体积离散化,每次计算用新的蛋糕作为“底座”时最大总体积,方法是线段树区间更新单点查询,线段树的节点维护对应体积为“底座”时的最大总体积,每次拿合法的最大的总体积叠在上面。

#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int mod = 1e9+7;
const int maxn = 100010;
const double PI = 3.14159265358979323846264;


ll r[maxn];
ll h[maxn];

ll v[maxn];

struct node{
    int l,r;
    ll val;
}tree[maxn<<2];

void build_tree(int rt,int l,int r){
    tree[rt].l=l;
    tree[rt].r=r;
    tree[rt].val = 0;
    if(l==r)return;
    int mid = (l+r)>>1;
    build_tree(rt<<1,l,mid);
    build_tree((rt<<1)|1,mid+1,r);
}

void update(int rt,int l,int r,ll val){
    if(tree[rt].l == l && tree[rt].r == r){
        tree[rt].val = max(val,tree[rt].val);
        return;
    }
    int mid = (tree[rt].l + tree[rt].r)>>1;
    if(r<=mid){
        update(rt<<1,l,r,val);
    }else{
        if(l>mid){
            update((rt<<1)|1,l,r,val);
        }else{
            update(rt<<1,l,mid,val);
            update((rt<<1)|1,mid+1,r,val);
        }
    }
}

ll query(int rt,int x){
    if(tree[rt].l == tree[rt].r){
        return tree[rt].val;
    }
    int mid = (tree[rt].l+tree[rt].r)>>1;
    if(x<=mid){
        return max(tree[rt].val,query(rt<<1,x));
    }else{
        return max(tree[rt].val,query((rt<<1)|1,x));
    }
}

map<ll,int> mp;

int main(){
    int n;
    cin>>n;
    for(int i = 1;i<=n;i++){
        scanf("%I64d %I64d",&r[i],&h[i]);
        v[i] = r[i]*r[i]*h[i];
        mp[v[i]] = 0;
    }

    int k=1;
    for(auto it=mp.begin();it!=mp.end();it++){
        it->second = k++;
    }

    build_tree(1,1,k);

    double ans = 0;
    for(int i=n;i>0;i--){
        int id = mp[v[i]];  
        double tmp = query(1,id+1);
        tmp+=v[i];
        update(1,1,id,tmp);
        ans=max(ans,tmp);
    }
    printf("%.12f\n",ans*PI);
    return 0;
} 

E. Famil Door and Roads

解题核心是求LCA。先分析下要使u-v成环需要满足什么条件:u-v在树上有且仅有一条简单路径,新的边只要加在u-v两个端点的两头,就能成环。所以我们只要计算两头所有点到u/v的平均距离即可。分两种情况,若lca不是u或v,两端的点就是u和v的子树;否则,假设v是u和v的lca,u那头的点还是u的子树,v那头的点则是整棵树砍掉v往u方向的孩子。在dfs时,去计算每个点到其子孙的总距离和到所有点的总距离,就可以进而算出上述平均距离。

#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int maxn = 100010;

int head[maxn];
int pre[maxn<<1];
int Next[maxn<<1];
int tot;
int p[maxn][20];
int dep[maxn];
int size[maxn];

double dist_down[maxn];
double dist_all[maxn];

void init(){
    memset(head,-1,sizeof(head));
    dep[1]=1;
    tot=0;
}

void dfs(int u,int fa){
    //
    int tmp = fa;
    for(int i=0;i<=16;i++){
        p[u][i] = tmp;
        tmp = p[tmp][i];
    }
    //
    size[u]=1;
    for(int i=head[u];~i;i=pre[i]){
        int v=Next[i];
        if(v==fa)continue;
        dep[v]=dep[u]+1;
        dfs(v,u);
        size[u]+=size[v];
        dist_down[u] += (dist_down[v]+size[v]);
    }
}

void dfs2(int u,int fa){
    if(u==1){
        dist_all[u] = dist_down[u];
    }else{
        dist_all[u] = dist_all[fa] - size[u] + (size[1]-size[u]);
    }

    for(int i=head[u];~i;i=pre[i]){
        int v=Next[i];
        if(v==fa)continue;
        dfs2(v,u);
    }
}

int get_ancestor(int u,int x){
    int k = 0;
    while(x){
        if(x&1){
            u=p[u][k];
        }
        k++;
        x>>=1;
    }
    return u;
}

int lca(int u,int v){
    if(dep[v]>dep[u]){
        swap(u,v);
    }

    u=get_ancestor(u,dep[u]-dep[v]);
    if(u==v)return u;
    int k=16;
    while(k>=0){
        if(p[u][k]!=p[v][k]){
            u = p[u][k];
            v = p[v][k];
        }
        k--;
    }
    return p[u][0];
}

void addEdge(int u,int v){
    Next[tot]=v;
    pre[tot]=head[u];
    head[u]=tot++;
    //
    Next[tot]=u;
    pre[tot]=head[v];
    head[v]=tot++;
}

int main(){
    init();

    int n,m;
    cin>>n>>m;

    int test =0;
    for(int i=1;i<n;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        if(i==1)test=u;
        addEdge(u,v);
    }

    dfs(1,0);
    dfs2(1,0);

    for(int i=1;i<=m;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        if(dep[u]<dep[v]){
            swap(u,v);
        }
        int LCA = lca(u,v);
        double ans = 0;

        if(LCA==v){
            int son = get_ancestor(u,dep[u]-dep[v]-1);
            ans = dist_down[u]/size[u] + (dist_all[v]-dist_down[son]-size[son])/(size[1]-size[son]);
            ans += (dep[u]-dep[v]+1);
        }else{
            ans = dist_down[u]/size[u] + dist_down[v]/size[v];
            ans += (dep[u]+dep[v]-dep[LCA]*2+1);
        }
        printf("%.10f\n",ans);
    }
    return 0;
}
数据库行转列的sql语句  问题描述假设有张学生成绩表(CJ)如下Name Subject Result张三 语文 80张三 数学 90张三 物理 85李四 语文 85李四 数学 92李四 物理 82现在 想写  sql 语句     查询后结果 为    姓名 语文 数学 物理张三 80 90 85李四 85 92 82       该怎么实现 ?研究意义        这是个并不复杂的问题,但却是数 阅读详情

相关推荐

同一台电脑使用模拟ModbusTcp主从通讯的时候,Wireshark抓取不到包

在使用ModBus Slave和Poll模拟主从通讯的时候,发现Wireshark怎么都抓取不到包怎么排查和解决?

HUJIANGMING的博客 703

Codeforces Round #343 (Div. 2) C

As Famil Door’s birthday is coming, some of his friends (like Gabi) decided to buy a present for him. His friends are going to buy a string consisted of round brackets since Famil Door loves string of

NineFailure的博客 321

【深度学习】肺结节分割项目实战一:处理数据集

一、LIDC-IDRI数据集简介 官方网站 肺图像数据库协会的图像收集(LIDC-IDRI)包括诊断和带有病变注释标记的肺癌筛查胸部CT。这是一个网络公开的国际资源,用于肺癌检测和诊断的计算机辅助诊断(CAD)方法的开发、培训和评估。 数据集包含1018个病例,每个病例包括来自临床胸部CT扫描的图像和一个相关的XML文件,该文件记录了由四名经验丰富的胸部放射科医生进行的两阶段图像注释过程的结果。在最初的盲读阶段,每个放射科医生独立审查每个CT扫描,并标记出属于三种类型之一的病变(“结节>= 3mm”,

weixin_42182906的博客 1万+

Codeforces Round #343 (Div. 2) 总结

A. Far Relative’s Birthday Cake time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Door's family is going celeb

小马的博客 583

一份针对零基础学习AI Agent详细学习计划

以下是针对零基础学习者制定的AI Agent详细学习计划,结合最新行业动态和实用资源推荐,帮助你从入门到进阶系统掌握核心技能

sexy19910923的博客 1904

STM32F103移植NuttX实战:从零搭建最小系统到串口Shell(附完整配置文件)

本文详细介绍了在STM32F103C8T6开发板上移植NuttX实时操作系统的完整过程,包括环境搭建、BSP配置、系统时钟初始化、驱动裁剪、编译烧录及串口Shell交互。通过实战指南帮助开发者快速掌握NuttX移植技巧,解决典型问题,适用于嵌入式系统开发。

tree8的博客 292

Codeforces Round #343 (Div. 2) A B C D E

A. Far Relative’s Birthday Cake time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Door's family is going celeb

计算机技术 1123

PX4飞控与MAVROS实战:从零搭建无人机ROS通信环境(附常见报错解决)

本文详细介绍了如何从零搭建PX4飞控与ROS的通信环境,重点解析了MAVROS的安装、硬件连接、串口权限配置以及坐标系转换等核心步骤。针对GeographicLib数据下载失败、串口权限不足等常见报错提供了实用解决方案,并附有Offboard模式控制的代码示例,帮助开发者快速建立稳定的无人机ROS开发环境。

dapp9builder的博客 335

Codeforces Round #343 (Div. 2) (C. Famil Door and Brackets(DP))

题目链接:点击打开链接 题意:给你一个长度为m的只含()的括号串s, 要求在s两端在加两个串p和q, 使得总长度为n,并且平衡, 平衡是指任意前缀串的(都不少于), 并且整个串的(和)一样多。 思路:我们不难想到这样一个DP, d[i][j]表示长度为i的串,(比)多j个(或者)比(多j个, 是等价的)的方案数。  那么转移很简单: if(j > 0) d[i][j] += d[i-1][j

AC_Arthur的专栏 1369

2024年全国大学生电子设计竞赛H题_自动行驶小车

自动行驶小车(H题)【本科组/高职高专组】

qq_74395263的博客 1万+

下载MNIST数据集并使用python将数据转换成NumPy数组(源码解析)

下载MNIST数据集并使用python将数据转换成NumPy数组首先来分析init_mnist函数接下来继续分析load_mnist函数实现数据集转换的python脚本的代码显示MNIST图像并确认数据 下载MNIST数据集并将数据转换成NumPy数组的Python脚本里面最重要的就是load_mnist函数,其他项目想要调用数据集的话,就可以调用load_mnist函数,得到一个字典类型的数据,字典的值是一个Numpy数组。 这些过程是如何实现的,现在开始逐字逐句分析源码: 在load_mnist函数中第

及时总结 4268

Codeforces Round #343 (Div. 2) C. Famil Door and Brackets

题目链接: http://codeforces.com/contest/629/problem/C 题意: 长度为n的括号,已经知道的部分的长度为m,现在其前面和后面补充‘(',或')',使得其长度为n,且每个左括号都能找到右括号与它匹配。 题解: dp[i][j]表示长度为i,平衡度为j的合法括号序列的总数,这里平衡度定义是‘('比')'多多少个,或')'比’('多多少个。 1...

weixin_30855761的博客 160

Transformer实战(1)——词嵌入技术详解

词嵌入的核心思想是,通过将词语表示为稠密的向量,使得计算机可以更有效地处理和理解文本中的语义关系。在本节中,我们学习了单词分布式表示的概念及其实现,包括静态嵌入和动态嵌入,实现了 Word2Vec 和 GloVe 模型,并介绍了如何使用 Gensim API 探索嵌入空间。

盼小辉丶的博客 1万+

Codeforces Round #343 (Div. 2)【A,B水题】

A. Far Relative’s Birthday Cake 题意: 求在同一行、同一列的巧克力对数。 分析: 水题~样例搞明白再下笔! 代码: #include<iostream> using namespace std; const int maxn = 105; char a[maxn][maxn]; int main ...

An55511的博客 260

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Codeforces Round #343 (Div. 2) B. Far Relative’s Problem (贪心)

H - Far Relative’s Problem Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Description Famil Door wants to celebrate his birthday with his f

lu_1110的博客 301

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Codeforces Round #343 (Div. 2)C. Famil Door and Brackets DP

转自:Codeforces Round #343 (Div. 2) 解题报告 题意:给你一个由括号组成的字符串,长度为m,现在希望获得一个长度为n(全由括号组成)的字符串,0<=n-m<=2000这个长度为n的字符串要求有两个性质:就是任意前缀,左括号数量大于右括号数量 字符串中左括号的数量等于右括号 现在让你可以在长度为m的原串前加一个括号串p,在原串后加一个括号串q 最后p+m+q=n问有多

龙崎的专栏 461

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake

D. Babaei and Birthday Cake time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output As you know, every birthday par

jhljx的专栏 546

Codeforces Round #343 (Div. 2) E. Famil Door and Roads lca 树形dp,lca

题目链接:http://codeforces.com/contest/629/problem/E 题意:给你一棵节点数为n的树,随机地在树上的任意两个点连一条边,给你m个询问,每次询问两个点,问连一条边后如果这两个点能在简单环中,简单环的期望是多少。简单环即这两个点在一个环上,这个环是没有重边的。 解法:这里先设置几个变量dep[i]:i节点的深度,这里记dep[0]=0,dep[1]=1;sz

I good vegetable a! 553

Codeforces Round #343 (Div. 2) C. Famil Door and Brackets dp

题目链接:http://codeforces.com/contest/629/problem/C 题意: 定义一个合法串:(1),’(‘的总数 == ‘)’的总数。(2), 串中所有前缀 满足 ‘(‘的个数 >= ‘)’的个数。题意:给定一个合法串的长度n和一个长度为m的中间串s,要求你找到一个p串和q串,使得p + s + q是一个合法串且长度为n。问有多少种不同的方案数。 结果 % (1e9

I good vegetable a! 366

Codeforces Round #343 (Div. 2) C. Report (乱搞)

题目链接:点这里!!! 题意: 给你一个长度为n的序列,经过m次操作后,再输出序列。 操作分为 1 ri  表示将前ri个元素按升序排序;2 ri 表示将前ri个元素按降序排序。 数据范围:1 题解: 我们知道只有在ri>rj&&i的情况下的操作才是有意义,因为小范围的操作可以被大范围包含。 所以我们求可以筛选出满足条件的r数组。我们就可以知道ri,ri+1中

Zsss的博客 356
上一篇: Educational Codeforces Round 8
下一篇: TopCoder srm683 div2 1000
squee_spoon
博客等级 码龄14年 61粉丝 455原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值