牛客周赛 Round 58(ABCDF)

news2024/9/24 11:30:48

目录

A.会赢吗?

B.能做到的吧 

 C.会赢的!

D.好好好数

F.随机化游戏时间


A.会赢吗?

思路: 签到题,比大小

void solve()
{
  double a,b;cin>>a>>b;
  if(a>=b) cout<<"NO";
  else cout<<"YES";
}

B.能做到的吧 

思路:只要能变大就行,那么我们就将字符串从大到小排序,如果最大字符串与原字符串相等,则不能变大了,输出NO,反之输出YES

void solve()
{
  int t;cin>>t;
  while(t--)
  {
    string s;cin>>s;
    string temp=s;
    sort(s.rbegin(),s.rend());
    if(s==temp) pn
    else py
  }
}

 C.会赢的!

思路:思维+贪心,我们可以分以下几种情况讨论

(1)x<0||y<0,起始点为(0,0),每次只能向下或向右走,所以当终点在上方或左边时,两个人不可能到达,即结果一定为平局

(2)(x+y)%2==0,说明到达终点的最短步数为偶数步,而先手只能在奇数步移动棋子,所以到达终点的最后一步一定是后手,那先手现在只能尽可能让局面走向平局,那如何走呢?我们会发现平局的时候是终点在棋子上方或左边的时候,也就是棋子的横坐标>x或 棋子的纵坐标>y,那先手就要选择x,y中更小的那个方向走了,因为这样才能尽快的走向平局,如果先手超过了x,y中最小的那个值mind,若此时为mind+1<maxd,表明后手还没到达终点,且已经被先手移动到终点右边或下面了,输出PING,否则先手输

(3)(x+y)%2==1,与(2)同理,后手尽可能让局面走向平局,如果mind+1==maxd,由于先手先下,所以每次先手下棋的时候都是领先后手一步棋,设x为mind,y为maxd,当后手下在(mind,mind)位置时,先手接着就会下在(mind,mind+1)位置,所以后手走到mind+1==maxd时,先手已经走到了(mind,maxd)的位置,即先手赢,否则PING

void solve()
{
  int t;cin>>t;
  while(t--)
  {
    int x,y;cin>>x>>y;
      
    int sum=x+y;
    if(x<0||y<0) cout<<"PING"<<endl;
    else 
    {
        if(sum==1)
        {
            py
            continue;
        }
        int maxd=max(x,y),mind=min(x,y);
        if(sum&1)
        {
            int s=mind+1;
            if(s==maxd) py
            else if(s<maxd) cout<<"PING"<<endl;
        }
        else
        {
            int s=mind+1;
            if(x==y) pn
            else if(s<maxd) cout<<"PING"<<endl;
        }
    }
  }
}

D.好好好数

思路: 因为k的好数为若干个不同的k的整数次幂之和的数字,也就是好数对应的k进制位只有0和1,如果一个数至少由两个好数组成,说明这两个好数中有重复的幂次,那么在转换成k进制时会累加重复的那个k进制位,比如12    3,12=9+3=(3^2)+3^1=(110)3,因为(110)中最大的数为1,说明只需一个好数,15=12+3=(110)3+(010)3=(120)3,最大为2,由两个好数组成。

void solve()
{
    int t;cin>>t;
  while(t--)
  {
        int n,k;scanf("%lld %lld",&n,&k);
      if(k==1)
      {
         printf("1\n");
          continue;
      }
        int maxd=0;
        while(n)
        {
            maxd=max(maxd,n%k);
          n/=k;
        }
       printf("%lld\n",maxd);
  }

}

F.随机化游戏时间

思路 :主席树的板子忘了,又把板子掏出来看了一眼🤣,一个区间中含有k个小于等于这个幸运数的数字,说明这个幸运数>=这个区间第k小的数,查询的时候还要分情况讨论下

(1)k==0,说明[l,r]这个区间的数都大于幸运数字,那么幸运数字的所在范围的右区间应<=[l,r]第1小的数字-1

(2)k==r-l+1,说明这个幸运数字大于等于这个区间的所有数字,幸运数字所在范围的左区间>=这个区间第k小的数字

(3)0<k<r-l+1,幸运数字左右区间都要更新。

constexpr int N=2e5+5,mod=1e9+7;

int a[N],n,m,root[N],idx;
vector<int> num;

struct node{
    int l,r,cnt;
}tr[N*20];

int find(int x)
{
    return lower_bound(num.begin(),num.end(),x)-num.begin();
}

int build(int l,int r)
{
    int p=++idx;
    if(l<r)
    {
        int mid=(l+r)>>1;
        tr[p].l=build(l,mid);
        tr[p].r=build(mid+1,r);
    }
    tr[p].cnt=0;
    return p;
}

int modify(int pre,int l,int r,int x)
{
   int p=++idx;
   tr[p]=tr[pre];tr[p].cnt++;
   if(l==r) return p;
   int mid=(l+r)>>1;
   if(x<=mid) tr[p].l=modify(tr[pre].l,l,mid,x);
   else tr[p].r=modify(tr[pre].r,mid+1,r,x);

   return p;
}

int query(int p,int q,int l,int r,int k)
{
    if(l==r) return l;
    int sum=tr[tr[q].l].cnt-tr[tr[p].l].cnt;
    int mid=(l+r)>>1;
    if(k<=sum) return query(tr[p].l,tr[q].l,l,mid,k);
    else return query(tr[p].r,tr[q].r,mid+1,r,k-sum);
}

int qmi(int a,int b)
{
    int res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return res;
}

void solve()
{
  idx=0;
  num.clear();
  mem(root,0)
  cin>>n>>m;
  for(int i=1;i<=n;i++) 
  {
    cin>>a[i];
    num.pb(a[i]);
  }

  sort(num.begin(),num.end());
  num.erase(unique(num.begin(),num.end()),num.end());

  int Max=num.size()-1;
  int L=1,R=n;
  root[0]=build(0,Max);
  for(int i=1;i<=n;i++)
  root[i]=modify(root[i-1],0,Max,find(a[i]));
  
  while(m--)
  {
    int l,r,k;cin>>l>>r>>k;
    if(!k)
    {
        int q=num[query(root[l-1],root[r],0,Max,1)];
        R=min(R,q-1);
    }
    else if(k==r-l+1)
    {
        int q=num[query(root[l-1],root[r],0,Max,k)];
        L=max(L,q);
    }
    else
    {
        int q=num[query(root[l-1],root[r],0,Max,k)];
        L=max(L,q);
         q=num[query(root[l-1],root[r],0,Max,k+1)];
        R=min(R,q-1);
    }
  }

  if(L==R) cout<<1<<' '<<L<<endl;
  else cout<<qmi(R-L+1,mod-2)<<endl;
}


int32_t main()
{
    //__md
   //init();
   int t;cin>>t;
   //t=1;
   while(t--)
   {
      solve();
   }
    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2105243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端请求的路径baseURL怎么来的 ?nodejs解决cors问题的一种方法

背景&#xff1a;后端使用node.js搭建&#xff0c;用的是express 前端请求的路径baseURL怎么来的 &#xff1f; 前后端都在同一台电脑上运行&#xff0c;后端的域名就是localhost&#xff0c;如果使用的是http协议&#xff0c;后端监听的端口号为3000&#xff0c;那么前端请求…

pdf怎么去水印?5个实用去水印方法新手必看(保姆级攻略)

pdf怎么去水印&#xff1f;在日常的办公工作生活中&#xff0c;我们常常需要使用PDF文件。pdf格式文件非常流行&#xff0c;因为它兼具稳定性和安全性。但是&#xff0c;有时我们从网上下载的pdf文件会带有水印&#xff0c;这些水印不仅影响了文件的美观&#xff0c;还影响了别…

turbovnc 服务端、客户端安装

turbovnc 可以方便地远程登录带界面的linux系统&#xff0c;比如xbuntu、kali等&#xff1b;远程windows11系统&#xff0c;经过亲身测试体验&#xff0c;感觉还是不如windows自带的rdp服务&#xff08;mstsc命令连接&#xff09;好用。 一、安装客户端 下载最新版本的客户端…

Java:位运算符,移位运算

一 位运算符 1.按位与------ & 运算法则&#xff1a; 2.按位或------ | 运算法则&#xff1a; 3.按位异或------ ^ 运算法则&#xff1a; 4.按位取反------ ~ 运算法则&#xff1a; 如果该位为 0 则转为 1, 如果该位为 1 则转为 0 二 移位运算 1.左移 << 运…

数据结构 双向链表

初始化 创建 遍历以及头插

Ubuntu 24.04 安装 英特尔工具包 Intel® Toolkits

目录 1.采用用户界面 GUI 安装英特尔基本工具包 Intel oneAPI Base Toolkit 1.1 下载离线英特尔基本工具包 1.2 安装英特尔基本工具包 1.3 英特尔基本工具包 Intel oneAPI Base Toolkit 环境设置 2.安装英特尔高性能计算工具包 Intel HPC Toolkit 2.1 下载离线英特尔高性…

学习大数据DAY52 Docker中的Mysql主从配置

Mysql 数据库主从同步 上机练习 1 容器生成命令 压缩包获取镜像 docker image load -i /root/mysql.tar 创建并开启两个镜像&#xff1a; docker run --name mysql1 -d -p 3333:3306 \ -v /opt/mysql1/conf:/etc/mysql/conf.d/ \ -v /opt/mysql1/data:/var/lib/mysql \…

精选整理!市面上7款AI论文生成器一键自动生成论文!

在当今学术研究和写作领域&#xff0c;AI技术的迅猛发展为研究人员提供了极大的便利。特别是AI论文自动生成助手&#xff0c;它们不仅能够提高写作效率&#xff0c;还能帮助生成高质量的论文内容。本文将详细介绍市面上7款超好用的AI论文生成器&#xff0c;并特别推荐千笔-AIPa…

kubernetes中的ParallelizeUntil()框架源码解读与使用

概述 摘要&#xff1a;本文从源码层面解读了kubernetes源码中常用的workqueue.ParallelizeParallelizeUntil()框架的源码实现&#xff0c;并且本文也将举例说明了workqueue.ParallelizeUntil()方法的典型使用场景。 正文 说明&#xff1a;基于 kubernetes v1.18.0 源码分析 …

Scratch教师节:给老师的一封信

小虎鲸Scratch资源站-免费Scratch作品源码,素材,教程分享平台! 【Scratch教师节特别献礼】—— 给老师的一封信&#xff1a;编程之光&#xff0c;照亮梦想之路 在这个金秋送爽、硕果累累的季节里&#xff0c;我们迎来了一个特别而温馨的日子——教师节。在这个充满感激与敬意的…

交叉编译概念

交叉编译概念 目录 交叉编译概念1. 什么是交叉编译2. 交叉编译的作用3. 交叉编译器4. 交叉编译工具链5. 交叉编译的一般步骤6. 交叉编译实例 1. 什么是交叉编译 交叉编译是指在一个平台上编译代码&#xff0c;使其能够在另一个不同的平台上运行的过程。这种编译方式通常用于开…

深入探索JDBC:Java数据库连接技术详解与实战应用

Java Database Connectivity&#xff08;JDBC&#xff09;是Java语言中用于访问关系型数据库的标准接口。它定义了一组API&#xff0c;使得Java程序能够以统一的方式连接、访问和操作不同的关系型数据库。JDBC不仅简化了数据库操作&#xff0c;还提高了Java应用程序的可移植性和…

抢先看:2024云栖大会体验攻略

这是一场「AI」奇妙之旅。 2024云栖大会定档 9月19日&#xff01; 期待与你在 杭州云栖小镇 共度一场为期3天的科技盛会 三日主论坛 400分论坛 与并行话题 4万平米 智能科技展区 免费领取云栖大会门票 怎么看、怎么玩、怎么逛 超长干货攻略奉上&#xff0c;请查收 ⬇️…

将OpenHarmony RK设备散包镜像打包为一个整包

本篇文章教大家使用瑞芯微的Linux_Pack_Firmware工具将rk设备的多个镜像文件打包为一个固件。首先感谢大佬AlgoIdeas开源的打包工具&#xff0c;开源地址&#xff1a;https://gitee.com/openharmony-driver/ril_adapter 接下来进行演示&#xff0c;下面我们使用OpenHarmony 4.…

js运算符----三元运算符

&#xff1f;前为真就执行&#xff1f;号后面的&#xff0c;为假就执行&#xff1a;号后边的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge…

828华为云征文|Flexus云服务器X实例赋能,用Python将微信公众号秒变智能聊天机器人

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;AWS/阿里云资深使用…

微服务——服务注册和发现(一)

服务注册和发现 1.1.服务注册背景 假如某项微服务被调用较多&#xff0c;为了应对更高的并发&#xff0c;我们进行了多实例部署&#xff0c;如图&#xff1a; 此时&#xff0c;每个item-service的实例其IP或端口不同&#xff0c;问题来了&#xff1a; item-service这么多实例…

【JUC】12-CAS

1. CAS compare and swap&#xff0c;比较并交换。 包含三个操作数&#xff1a;内存位置、预期原值及更新值。 执行CAS操作的时候&#xff0c;将内存位置的值与预期原值比较&#xff1a; 匹配&#xff0c;更新为新值。不匹配&#xff0c;不进行操作&#xff0c;多个线程同时…

SpringCloud开发实战(五):Feign的一些优化建议

目录 SpringCloud开发实战&#xff08;一&#xff09;&#xff1a;搭建SpringCloud框架 SpringCloud开发实战&#xff08;二&#xff09;&#xff1a;通过RestTemplate实现远程调用 SpringCloud开发实战&#xff08;三&#xff09;&#xff1a;集成Eureka注册中心 SpringCloud开…

nefu暑假集训5 KMP 个人模板+例题汇总

前言&#xff1a; KMP算法用于匹配字符串&#xff0c;假设长字符串为s&#xff0c;需要匹配的字符串是p。KMP算法的基础思想是利用一个next[n]数组&#xff1a;next[i]对应的是&#xff1a;以下标i为结尾的连续子串&#xff0c;与以第一个字符开始的子串&#xff0c;相等的最大…