“范式杯”2023牛客暑期多校训练营1

2023-11-13

D.Chocolate

题意:有n*m的矩阵,分成n*m块,每一块都有一块巧克力,然后A和B两个人,进行博弈,选择一个下标(i,j),将左上角(1,1)到(i,j)的巧克力全部吃掉,如果谁是最后一个吃完全部巧克力,那么就输了(每人至少吃一块巧克力),问最后谁赢

题解:首先考虑一种特殊情况,即1*n,先手除了最后一块,其它全部吃掉,也就是只留一块巧克力给后手,这样后手就输了,先手赢;如果一开始就只有一块巧克力,那么先手输,后手赢

然后考虑能不能把n*m的二维转化成以上一维的情况

先手可以一开始拿掉最左上角1*1的矩形,使得留给后手的矩形有缺口

后手拿到有缺口的矩形,可以将其继续变成有缺口的矩形或者完整的矩形

而先手每次都可以继续留给后手有缺口的矩形(即不是完整的矩形)

这样的话,最终就会演变成后手将其变成完整的1*n的矩形,故先手赢

所以,只有当n和m都等于1的时候,先手输,其它情况都是先手赢

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
signed main()
{
    int n,m;
    cin>>n>>m;
    if(n==1&&m==1) puts("Walk Alone");
    else puts("Kelin");
    return 0;
}

K.Subdivision 

如图,用bfs一层一层搜

首先自身算一个点

 

如果遇到叶子节点,就加k-dist[t],比如样例2,k为3,从顶点1搜到2,2是叶子节点,所以加上k-dist[1]即3-1=2

对于1,3,4,5这种结构

如果遇到已经搜过的点,比如顶点1搜到3搜到4然后搜5,发现5已经搜过了(因为5离顶点的距离近),然后加上k-dist[4]=3-2=1

从顶点1搜到5搜到4,发现4已经被搜过了,然后加上k-dist[5]=3-1=2

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e5+10;
int dist[N];
int p[N];
bool st[N],leaf[N];
int n,m,k;
vector<vector<int>>e(N);
int res;
void bfs()
{
    queue<int>q;
    q.push(1);
    dist[1]=0;
    st[1]=true;
    while(q.size()){
        int t =q.front();
        q.pop();
        if(dist[t]>k) break;//如果1到t的最短距离大于k,就没必要更新它的出点了,直接break
        res++;//点t算一个点
        leaf[t]=true;//先假设t是叶子节点,
        for(auto v:e[t]){
            if(p[t]==v) continue;//如果遍历到它的父节点,父节点是已经遍历过的,那么就continue,
            leaf[t]=false;//如果它的下一层有点和它相连,那么它就不是叶子节点
            //如果点v每标记过才更新,保证每一个点只搜一次
            if(!st[v]){
                p[v]=t;//标记父节点,是为了不往上搜,只往下搜
                dist[v]=dist[t]+1;
                q.push(v);
                st[v]=true;
            }
            else res+=k-dist[t];//如果v已经被搜过了,那么就加上k-dist[t]
         }
         if(leaf[t]&&t!=1) res+=k-dist[t];//如果t是叶子节点并且它不是顶点,那么就加上k-dist[t]
    }
}
void solve()
{
    cin>>n>>m>>k;
    for(int i=0;i<m;i++){
        int u,v;
        cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    bfs();
    cout<<res<<endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

H.Matches 

将正序区间放在S中,逆序区间放在T中,然后,sum记录所有区间长度的和 

 

然后排序一下S,使得区间左端点从小到大排序,然后由于r记录此前区间最大右端点,如果区间右端点小于等于r,那么就continue,不把它的区间左端点放入Sx中,以及不把它的区间右端点放入Sy中,以及不把距离放在len中,因为左端点本来就升序排序,右端点右小于等于r,那么该段区间就包含于前面的区间,而我们要求正序区间和逆序区间相交的最大长度,肯定选择范围大的区间,所以该段区间就没必要放进去了,这样导致我们存放的区间左端点是升序的,右端点也是升序的

然后遍历T中的每一个区间左端点即为x,右端点记为y,在S中二分

三种情况:

找到S中左端点大于x的第一个区间,赋值给l,如果l>0,因为l是从0开始的嘛,所以前面的一个区间的左端点是小于等于x的,那么就会产生重叠部分,长度为min(y,Sy[l-1])-x

找到S中右端点大于等于y的第一个区间,赋值给r,如果r

如果l小于r,因为l是左端点大于x的第一个区间,r是右端点大于等于y的第一个区间,因为横纵坐标均升序,所以区间l到区间r-1都是包含在[x,y]中的,所以*max_element(len.begin()+l,len.begin()+r)遍历[len.begin()+l,len.begin()+r)

AC代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define int long long
const int N=1e6+10;
typedef pair<int,int>PII;
vector<PII>S,T;
int n;
int a[N],b[N];
signed main()
{
    cin>>n;
    int sum=0;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n;i++)cin>>b[i];
        for(int i=0;i<n;i++){
            if(a[i]<b[i])S.push_back({a[i],b[i]});
            else if(b[i]<a[i])T.push_back({b[i],a[i]});
            sum+=abs(a[i]-b[i]);
    }
    sort(S.begin(),S.end());
    vector<int>Sx,Sy,len;
    int r=-0x3f3f3f3f;
    for(auto u:S){
    if(u.second<=r)continue;
    r=max(r,u.second);
    Sx.push_back(u.first);Sy.push_back(u.second);len.push_back(u.second-u.first);
    }
    int m=Sx.size();
    int ans=0;
    //二分
     for(auto v:T){
         int x=v.first,y=v.second;
         int l=upper_bound(Sx.begin(),Sx.end(),x)-Sx.begin();
         int r=lower_bound(Sy.begin(),Sy.end(),y)-Sy.begin();
         if(l>0)ans=max(ans,min(y,Sy[l-1])-x);
         if(r<m)ans=max(ans,y-max(x,Sx[r]));
         if(l<r)ans=max(ans,*max_element(len.begin()+l,len.begin()+r));
     }    
     cout<<sum-2*ans<<endl;
     return 0;
}

J.Roulette 

首先第一把投了1块钱,假设输了,然后第二把投2块钱,假设输了,第三把投4块钱,假设输了,第四把投8块钱,假设赢了,得16块钱,那么一共输了7块钱,投了8块钱,那么一共是赚了1块钱

假设一开始就赢一把,就是投一块钱赢一块钱

所以不管前面输了多少把,还是一把都没输,赢一把就是赚一块钱

那么以输输输...输赢为一个周期,赚一块钱,需要赚m块钱就需要m个周期

算一个周期赢一块钱的概率:先求出最多能连输多少把,记为r,那么2^r-1即为连输r把输的钱,

2^r-1

我们只要将本金为n时赢一块钱的概率*本金为n+1时赢一块钱的概率*....*本金为(n+m-1)赢1块钱的概率

但是其实有某些区间的概率时一样的,[2^r-1,2^r-2],在这个区间里都是最多输r把,所以赢1块钱的概率一样

 

 

题目中要求概率取模,概率可以写成a/b的形式,然后除法取模的话,要写成(a*b的逆元)再取模

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define int long long
#define endl '\n'
using namespace std;
const int mod=998244353;
//快速幂,快速求(a^k)%mod
int qmi(int a, int k) {
    int res = 1;
    while (k) {
        if (k & 1) res = res * a %mod;
        a = a * a % mod;
        k >>= 1;
    }
    return res;
}
//求逆元
int infact(int x) {
    return qmi(x, mod - 2);
}
void solve()
{
    int n,m;
    cin>>n>>m;//n表示本金,m表示要挣到的钱
    m+=n;//现在m表示要挣到多少钱
    int res=1;
    while(n<m){    
        int r=log2(n+1);//本金为n时最多能连输r把
        //算出同样也是最多连输r把的最大本金再+1为nn,当本金在区间[n,nn-1]时,获胜的概率是一样的,都是1-(0.5)^r
        int nn=min(m,(1ll<<(r+1))-1); 
        //首先概率是个分数,涉及除法,然后取模操作的话,除以一个数转变成乘以它的逆元
        //然后分数就转变成了另一个数(通过分母乘以分子的逆元得到),接下来就用得到的新的数来代替表示概率,记为powvalue
        //其中(1/2)可以直接用1*2^(mod-2)=2^(mod-2)代替
        //(1/2)^r=2^(-r+1)*2^(-1)=2^(-r+1)*2^(mod-2)=2^(mod-1-r)
        //mod+1-2^(mod-1-r)即为赢一块钱的概率(通过逆元换成了另一个数,但是在模操作下是等效的)
     int powvalue=mod+1-qmi(2,mod-1-r);
        res*=qmi(powvalue,nn-n);
        res%=mod;
        n=nn;
    }
    cout<<res<<endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“范式杯”2023牛客暑期多校训练营1 的相关文章

  • Task.Factory.StartNew 或 Parallel.ForEach 对于许多长时间运行的任务? [复制]

    这个问题在这里已经有答案了 可能的重复 Parallel ForEach 与 Task Factory StartNew https stackoverflow com questions 5009181 parallel foreach
  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • C++ 中的“int”默认是“signed long int”吗?

    Is int默认情况下signed long int in C 它是否依赖于平台和 或编译器 如果是这样 怎么办 EDIT 以下任何一项是否保证是重复的 signed short int signed int signed long int
  • C# - Visual Studio 中的 System.OutOfMemoryException

    我遇到问题 当我右键单击 Visual Studio 中的主窗体并转到 视图设计器 时 出现错误 它说 引发了 System OutOfMemoryException 类型的异常 堆栈跟踪 at System Reflection Asse
  • 是否有可能将 *.pdb 文件包含到发布版本中以查看错误行号?

    我做了一个项目 所有设置都是默认的 当我在调试模式 构建配置 调试 下运行它并遇到异常时 它转储到我的自定义日志记录机制 其中包含错误行号 但是当我运行发布构建时 记录相同的异常 没有行号 只有方法抛出和记录调用堆栈 是否有可能在发布配置
  • 在异步请求中使用超时回调

    我之前问过这个问题 但我将用提出的解决方案来完成这个问题 并提出另一个问题 我正在使用这个类来进行异步网络请求 http msdn microsoft com en us library system net webrequest aspx
  • 如何检查号码是否只有唯一的数字?

    例如 2345 是唯一的数字 因为没有数字显示两次 但 3324 不是唯一的数字 因为 3 出现了两次 我尝试使用 但我 代码 显示但我没有得到数字我得到了数字 编辑 你不能使用字符串 number 10 number 100 number
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • 打开位置设置页面或提示用户启用位置

    我一直在绞尽脑汁 徒劳地谷歌搜索 我正在尝试找到一种方法来提示用户通过直接进入设置页面或仅点击屏幕上的 是 来切换位置 我见过的所有代码似乎都不起作用 有人有有效的方法吗 一个详细的例子将不胜感激 谢谢 我对 Xamarin 开发非常陌生
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • 在 Windows 上使用 C/C++ 开发时省略 msvcr100.dll?

    是否可以在 Windows 上使用 C C 进行开发而不链接到 msvcr100 dll 我知道这是 Windows 的标准 c 库 但我想知道如果我没有安装 Visual Studio 或 Redistributable 软件包 我的计算
  • Code::Blocks 中的调试似乎不起作用 - 缺少调试符号

    我正在尝试在 Code Blocks 中调试程序 我跟着本指南 http wiki codeblocks org index php title Debugging with Code Blocks and 这个短视频 http www y
  • 如何阻止 Control-I 在 CoreWindow 范围内的 UWP 文本框中插入选项卡?

    当我在 UWP 应用程序中有一个 TextBox 时 对我来说 奇怪的行为 在 Windows 10 中创建通用的空白应用程序 UWP 应用程序 使用以下代码将文本框添加到默认网格
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误

    我正在尝试使用 lua 用 C 编写的函数 下面给出的是cpp文件 extern C include lua h include lauxlib h include lualib h static int add 5 lua State L
  • boost::spirit::qi::语法和可变参数模板

    我在使用可变参数模板定义语法时面临一个问题 我首先定义一些包含在某些结构中的简单语法 例如纬度 经度 如下所示 include
  • execlp() 系统调用输出错误

    这个非常简单的例子exec 系统调用 在这里 我试图打电话execlp 两次 但是 我没有得到例外的输出 它仅显示当前目录的第一次调用的输出 include
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐

  • 如何去除数据库中重复的数据

    去除数据库中重复的数据 准备工作 方法一 用distinct 联合去重 方法二 使用窗口函数限制row number 1 方法三 使用窗口函数删除row number gt 1 方法四 group by去重 准备工作 原始表users CR
  • vs调试时报错:变量已被优化掉,因而不可用

    前言 使用vs运行程序时 发现不是每次运行的结果都一致 抛开多线程的因素 比方说我用openGL加载骨骼动画数据 有时候能加载出骨骼纹理 有时候就不行 很头疼 在调试问题的时候就遇见vs调试器报错 变量已被优化掉 因而不可用 解决 在vs顶
  • USB Audio&hid 混合设备的描述符详解

    USB Standard Device Descriptor ALIGN BEGIN uint8 t USBD HS DeviceDesc USB LEN DEV DESC ALIGN END 0x12 bLength USB DESC T
  • OpenCV中的姿势估计及3D效果(3D坐标轴,3D立方体)绘制

    OpenCV中的姿势估计及3D效果 3D坐标轴 3D立方体 绘制 1 效果图 2 原理 3 源码 3 1 姿态估计后绘制3D坐标轴 3 2 姿态估计后绘制立方体 参考 这篇博客将延续上一篇博客 OpenCV中的相机失真 内外参 不失真图像
  • 【泛微E9】JS限制明细表文本框包含特殊文字

  • 使用IDEA工具不能自动导包的处理方法

    使用IDEA工具不能自动导包的处理方法 当我们在使用idea的时候 有时候会出现它不自动导包的情况 这是因为你没有选中自动导包的按钮 那怎么选择呢 首先点击File选项中Settings 如图 之后在搜索框中搜索Maven 再选中Impor
  • 未来刷脸支付设备圈地运动将会加剧

    未来刷脸支付设备的圈地运动将会加剧 而支付宝方面数据显示 自从去年支付宝宣布刷脸支付大规模商业化后 与刷脸支付相关的上下游产业链 催生的研发 生产 安装调试人员就已经达到50万人 刷脸支付项目合作推广更是成为市场热门 抓住移动支付发展的浪潮
  • 【FFmpeg】多媒体文件处理

    1 ffmpeg的日志打印 include
  • Rancher 集群安装

    一 Rancher 是什么 Rancher 是一个 Kubernetes 管理工具 用于在任何地方和任何提供商上部署和运行集群 Rancher 可以从托管提供商调配 Kubernetes 调配计算节点 然后将 Kubernetes 安装到这
  • TCP应用层协议

    TCP IP是个协议组 可分为三个层次 网络层 传输层和应用层 在网络层有IP协议 ICMP协议 ARP协议 RARP协议和BOOTP协议 在传输层中有TCP协议与UDP协议 在应用层有FTP HTTP TELNET SMTP DNS等协议
  • 准备刺第一针了(飞秋官方下载)

    WZSZF飞鸽 2013年10月26日 它还有一双花椒粒一样大小的眼睛 它还会丰富多腔地叫唤 叫起来婉转动听 毛大爹 原来我们不能离开眼镜啊 第二天 呜的一声 简直不相信自己的耳朵 放生青蛙今天外公外婆叔叔阿姨们要来我家吃饭 我终于撑到最后
  • Z-Statk协调器 路由器 终端的确定---Simple例程(一)

    Z Statk协调器 路由器 终端的确定 Simple例程 一 2010 12 24 09 42 10 分类 嵌入式 当我们选择了终端 路由器 或者协调器的时候 来看一下程序中是怎么判断的 也就是如何作为其中的各个角色进行启动 是加入网络
  • 使用内网负载机(Linux)执行Jmeter性能测试

    一 背景 在我们工作中有时候会需要使用客户提供的内网负载机进行性能测试 一般在什么情况下我们需要要求客户提供内网负载机进行性能测试呢 遇到公网环境下性能测试达到了带宽瓶颈 那么这时 我们就需要考虑在内网环境负载机下来执行我们的性能测试以达到
  • 给button设置背景图片不显示解决了

    以前给按钮设置背景图片但是图片不显示 一直没有解决 网上也找不到正确的方法 今天终于被我解决了 其实就把button的背景颜色改改就OK了
  • 面试时这样介绍算法,想不高薪都难,排序算法(归并排序)

    算法背景 归并排序 Merge sort 是一种排序算法 它的目的是将一个无序的数组变成有序的 它采用分治法 将原数组不断地分成若干个小数组 直到每个小数组只有一个元素 然后把这些小数组按照顺序合并起来 最终得到一个有序的数组 归并排序需要
  • CSS3滤镜——页面黑白灰度处理

    每当遭遇重大灾难 比如之前的非典 汶川地震 以及前几天清明节对新冠肺炎逝世同胞的哀悼 各大主流网站也会呈黑白两色 今天偶然搜了下实现机制 原来是如此的简单 也对之前不怎么了解的滤镜刮目相看了 将以下样式代码放到页面中即可实现页面黑白处理 这
  • 数据结构和算法之插入排序

    一 插入排序 插入排序是一种简单直观的排序算法 它的原理是通过构建有序序列 对于未排序数据 在已排序序列中从后向前扫描 找到相应位置并插入 mermaid svg v2YbPqchr8qWCPvn font family trebuchet
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • 学习新技术的10个建议

    学习新技术的10个建议 http www apkbus com portal php mod view aid 1780 我们生活在一个振奋人心的时代 我们可以越来越方便廉价地获得大量学习资源 这些资源的传播载体由最初的教室被变成了博客 技
  • “范式杯”2023牛客暑期多校训练营1

    D Chocolate 题意 有n m的矩阵 分成n m块 每一块都有一块巧克力 然后A和B两个人 进行博弈 选择一个下标 i j 将左上角 1 1 到 i j 的巧克力全部吃掉 如果谁是最后一个吃完全部巧克力 那么就输了 每人至少吃一块巧