cf 练习3

news2024/9/24 7:23:36

cf 955 div.2 D (二维前缀和 + 裴蜀定理)

设原本 有雪帽的点(设为1) 和 没有学帽(设为0)的点 差值为 dif

当边长为k的矩阵覆盖后 , 设矩阵中有x1个有雪帽的点和 x2个没有雪帽的点 ,那么此时的dif 值 就会减少为 (x2 -x1)*x ,假设x2 -x1 = m1  , 有n个子矩阵 ,所以题目就转化成了是否存在x1 ,x2 ,x3 ...xn 使得 x1*m1 + x2*m2 + ....+xn*mn =dif

这时,就需要用到裴蜀定理的推广 , 那么如果存在的话 , gcd(m1,m2..mn) | dif

对于如何求解m1 , m2 , m3..mn,就需要用到二维前缀和

 for(int i =1;i<=n;++i){
    for(int j =1;j<=m;++j){
      if(mp[i][j] == '1')sum1 +=a[i][j];
      else sum0 += a[i][j];
      pre[i][j] = pre[i-1][j] + pre[i][j-1] - pre[i-1][j-1] + (mp[i][j] - '0');
    }
  }

我们预处理出了,每个子矩阵中1的数量 , 之后可以在建立一个数组存储出来每个m的值,m的值为k*k -val-val(val是一个子矩阵中1的数量 , k*k -val是子矩阵中0的数量)

 vector<int>num;
  //枚举所有的k阶子矩阵的数量

  for(int i =1;i+k-1<=n;++i){
    for(int j =1;j+k-1<=m;++j){
      int val = pre[i+k-1][j+k-1] - pre[i-1][j+k-1] - pre[i+k-1][j-1] + pre[i-1][j-1];//有val个1
      num.push_back(abs(k*k - val -val)); //这个才是差值
    }
  }

最后再使用裴蜀定理

int s = 0;
  for(const auto &t :num ){
    if(t)s = gcd(s , t);
  }
  if(s && dif%s == 0){
    cout<<"YES"<<endl;
  }
  else cout<<"NO"<<endl;

cf 959 div1 + div2  B. Fun Game

思路 : 先分类考虑一下 , 对于 第一次遇到 1 和 0 , 如何让1 变到 0 呢 ,可以直接让自己跟自己异或, 就变成 0 和 0 相同了 , 所以 1 0 这种情况可以轻松解决 。那么如果遇到了 0 和 1 , 该如何解决?我们就需要找到前面有 1 才可以 让0 和1 异或变成 1 , 所以我们只需要看前面是否有1,如果没有就输出 NO , 否则一定可以让s变成t

void solve(){
  cin>>n>>a>>b;
  bool f = false;
  bool ok = false;
  for(int i =0;i<n;++i){
    if(a[i] == '0')ok = true;
    if(a[i] == '1')f =true;
    
    if(a[i]  != b[i]){
     if(a[i] == '0' && (!f || !ok)){
      cout<<"NO"<<endl;
      return;
     }
    }
  }
  cout<<"YES"<<endl;
}

cf 959 div1 + div2 C  Hungry Games

Problem - C - Codeforces
思路 :我们从左端点l 开始 向后加al , al+1 , al+2... , 如果当我们的和超过了x,并且此时是r , 总和清零 ,前面的区间 对答案的贡献就是 r-1-l+1 = r-l , 清零后 ,又以r+1为新的左端点继续向后枚举,与刚刚的状态一样, 由此可以想到dp。dp[l] = dp[r+1] + r - l , 推出这样的状态后,可以发现状态时从后往前推的,所以我们可以倒着枚举.

int n , k;
int a[N] , f[N];
int pre[N];
/// fi =  fj + (j-1)-i+1 = fj + j-i
void solve(){
  cin>>n>>k;
  memset(f, 0 , sizeof(f)); //注意每次都要清空
  memset(pre , 0 , sizeof(pre));
  for(int i =1;i<=n;++i)cin>>a[i] , pre[i] = pre[i-1] + a[i];

  for(int i =n;i>=1;--i){
    int j = upper_bound(pre+1 , pre+1+n , k+pre[i-1])-pre; // 二分找到对于每个左端点到清零时的右端点 ,也就是上面说的 r
    if(j == n+1)f[i] = n - i+1; // 如果没有找到这个右端点 , 说明在这里的左端点一直到最后的n都是符合条件的
    else f[i] = f[j+1] + j-i; // 找到的话就状态转移
  }
  int ans = 0;
  for(int i =1;i<=n;++i)ans += f[i]; //最后把所有区间都加上
  cout<<ans<<endl;

}

cf 959 div1 + div2 D Funny Game

思路 : 如果x从1开始枚举的话 ,会有很多情况,所以我们可以考虑倒着枚举 , 最后倒着输出答案(我这里是采用栈来实现的).

x | (|au - av|) -> au \equiv av (mod x)
当 x = n-1 时 , ai %x 最多有 n -1种结果, 但是由鸽巢原理 ,因为总共有n个数 , 所以必定会有至少两个数字它们取模于x是相同的 , 所以这两个数字就可以连成一条边 ,之后我们可以删除其中一个数字(也就是删掉这个点 , 由样例知,我们尽可能删掉大的点)

当x = n-2时 , ai % x 最多有n-2种结果 , 还是由鸽巢原理 , (刚刚删掉了一个数),现在总共有n-1个数 , 所以必定会有至少两个数字,它们取模于x是相同的 , 那么这两个数字就连成一条边,之后再删除其中一个数字

以此类推 , 最后一定可以把所有点都连上

之后我们可以暴力枚举 , 复杂度是On^{2}
 

int n;
int a[N];
void solve(){
  cin>>n;
  for(int i =1;i<=n;++i)cin>>a[i];
  cout<<"YES"<<endl;
  map<int,int>mp;
  vector<pii>ans;
  for(int i =n-1;i>=1;--i){
    mp.clear(); // 每一次都要清零
    for(int j=1;j<=n;++j){
      if(a[j] == INF)continue;
      if(mp[a[j]%i]){
        ans.push_back({j , mp[a[j]%i]});
        a[j] = INF; //删点操作
        break;
      }
      mp[a[j]%i] = j;
    }
  }
  stack<pii>st;
  for(auto [x,y]:ans){
    st.push({x,y});
  }
  while(!st.empty()){
    cout<<st.top().first<<' '<<st.top().second<<endl;
    st.pop();
  }
}

cf 959 div1 + div2 E. Wooden Game

思路 : 这题纯诈骗题啊 , 题目给的树的数据都没有用, 真正有用的只有树的大小 , 因为我们可以随便删树的结点 , 所以我们只要暴力跑一遍删1- n(n表示树的大小),删哪个可以使得答案最大就行了

void solve(){
  cin>>n;
  int ans = 0;
  for(int i =1;i<=n;++i){
    int num;cin>>num;
    int c = ans;
    for(int j =1;j<=num;++j)ans = max(c|j , ans);
    for(int j = 1;j<num;++j){
      int x;cin>>x;
    }
  }
  cout<<max(ans , 1ll)<<endl;

}
  

cf 963 div2 C. Light Switches

思路 : 首先可以很轻易的看出每个房间都是有周期性的 ,整个周期为2k , 每个开灯或观灯周期为k。 那么对于最后一个房间,如果每个房间的加上一部分周期性(让他们进入最后一个房间开灯的时期),如果所有的房间都是在最后一个房间的开灯周期之内 ,那么就可以开灯 ,否则就输出-1

int n ,k;
int a[N];
void solve(){
  cin>>n>>k;
  int ma = 0;
  for(int i =1;i<=n;++i)cin>>a[i] , ma = max(ma , a[i]);

  for(int i =1;i<=n;++i){
    if((ma - a[i]) % (2*k) >= k){
      ma += 2*k - (ma - a[i])%(2*k) ;
    }
  }
    for(int i =1;i<=n;++i){
    if((ma - a[i]) % (2*k) >= k){
      cout<<-1<<endl;
      return;
    }
  }
  cout<<ma<<endl;
}

cf 963 div2 D Med-imize

思路 : 看到中位数就要想到二分 , 我们假设大于等于中位数的部分都是1 , 小于中位数的部分都是-1 , 那么如果总和大于等于 0 的话 , 说明二分的这个中位数成立。
所以我们就可以使用二分的方法 , 然后对于删数字 ,这题有一个非常经典的trick,连续在某一个位置删除三个数 ,以数组索引从0开始为例 , 对于0~n-1的数组 ,假设连续删除三个数字, 我们把索引全部取模于3  , 会得到若干的 0 1 2 0 1 2...这样的索引,连续删除三个数字 ,也就是删除0 1 2,三种索引,最后我们会留下 (n-1) % k +1 个数字。

那么怎么删除会使得剩下的数字中的中位数最大呢 ? 那么已可以使用dp , 因为他是对于每个(n-1)%k +1这样的一组数的状态转移

int n ,k;
int a[N] , f[N];
void solve(){
  cin>>n>>k;
  int ma = 0;
 for(int i =1;i<=n;++i)cin>>a[i];

  auto check = [&](int x){
    f[1] =a[1] >=x?1:-1; 
    for(int i =2;i<=n;++i){
      int v = a[i] >= x ? 1 : -1;
      if((i-1)%k == 0){
        f[i] = v;
      }
      else{
        f[i] = f[i-1] + v;
      }
      if(i > k)f[i] = max(f[i] , f[i-k]);
    }
    return f[n] > 0;

  };

 int l = 1 , r = 2e10;
 while(l < r){
  int mid = (l + r +1)>>1;
  if(check(mid))l = mid;
  else r = mid -1;
 }
 cout<<l<<endl;
}

 

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

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

相关文章

【建议收藏】AI大模型学习资源大全,免费分享

前言 马斯克旗下的AI大模型企业xAI&#xff0c;官宣拿到巨额融资60亿美元。 估值冲向240亿美元&#xff08;约1304亿&#xff09;&#xff0c;一举跃升为AI大模型“最猛独角兽”&#xff01; 资本大佬Valor Equity Partners、红杉资本、国王控股、沙特王子-Bin Talal、Vy Cap…

同态加密和SEAL库的介绍(四)CKKS 方案

写在前面&#xff1a; 上篇介绍了 BFV 的 Batch Encoder&#xff0c;其虽然充分利用了槽空间&#xff0c;但是每个槽只包含一个模 plain_modulus 的整数&#xff0c;除非 plain_modulus 非常大&#xff0c;否则我们可能会很快遇到数据类型溢出并在需要进行整数计算时得到意外的…

【Docker安装】Ubuntu系统下离线部署Docker环境教程

【Docker安装】Ubuntu系统下离线部署Docker环境教程 前言一、本次实践介绍1.1 本次实践规划1.2 本次实践简介二、检查本地环境2.1 检查操作系统版本2.2 检查内核版本2.3 更新软件源三、卸载Docker四、下载安装包4.1 创建目录4.2 官网下载五、部署Docker环境5.1 解压安装包5.2 复…

北京青蓝智慧科技:160个项目通过“数据要素×”大赛湖北分赛初赛

近日&#xff0c;2024年“数据要素”大赛的湖北分赛在武汉热烈开幕。 八个赛道的参赛队伍齐聚一堂&#xff0c;共同争夺数据创新先锋的殊荣。 经过激烈的角逐&#xff0c;初赛评审专家团最终评选出了160个入围项目&#xff0c;每个赛道分别有20个项目脱颖而出&#xff0c;其中…

Unity物理模块 之 2D效应器

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 1.什么是效应器 2D 效应器 - Unity 手册 2D 效应器是与 2D 碰撞器一起使用的组件&#xff0c;相当于预先编写好的插…

8月8日笔记

8月8日笔记 msf常见命令 启动MSF控制台 msfconsole: 启动MSF控制台。msfconsole -h: 显示帮助菜单。msfconsole -q: 启动MSF控制台并立即退出。 导航和管理 back: 返回上一级菜单。exit: 退出MSF控制台。banner: 显示MSF的横幅。cd: 更改工作目录。color: 开启或关闭彩色输…

深度学习任务中的 Zero-shot、One-shot 和 Few-shot 是什么?

深度学习任务中的 Zero-shot、One-shot 和 Few-shot 是什么&#xff1f; 在深度学习的任务中&#xff0c;Zero-shot、One-shot 和 Few-shot 学习是处理有限数据的三种重要方法。这些方法尤其在计算机视觉领域表现得非常突出。接下来&#xff0c;我们将详细探讨这三种学习方式&…

【ML】self-supervised Learning for speech and Image

【ML】self-supervised Learning for speech and Image 1. self-supervised Learning for speech and Image1.1 自监督学习在语音处理领域的方法及其特点1.2 自监督学习在图像处理领域的方法及其特点 2. Predictive Approach2.1 特点2.2 适用场景 3. contrastive Learning4. 语…

鸿蒙开发5.0【Debug调试】运维

Debug 介绍 本示例通过使用ohos.hidebug接口来获取当前应用内存使用情况。 )效果预览 使用说明 1.点击界面右上方Debug图标&#xff0c;弹出Debug信息界面&#xff0c;显示当前应用内存使用情况&#xff1b; 2.再次点击右上方Debug图标&#xff0c;Debug信息界面消失。 具…

Zed : 一款不容错过的编码神器

简介 “Code at the speed of thought“ — 用过之后都说好&#xff0c;名副其实&#xff5e; 不过&#xff0c;请记住它的定位是“编辑器、编辑器、编辑器”&#xff08;重要的事情说三遍&#xff09; 一切皆可配置 步入正题&#xff0c;开始配置&#xff5e;&#xff01; 配…

嵌入式学习之文件IO和标准IO

IO概述 I/O是Input/Output的缩写&#xff0c;指的是输入/输出。在计算机科学和工程领域&#xff0c;I/O是指计算机系统与外部环境或内部组件之间进行数据交换的过程和机制。 用户I/O 用户通过输入设备与计算机交互。例如&#xff0c;通过键盘输入文字、通过鼠标点击界面等。…

2007-2023年上市公司金融化程度测算数据(含原始数据+计算代码+计算结果)

2007-2023年上市公司金融化程度测算数据&#xff08;含原始数据计算代码计算结果&#xff09; 1、时间&#xff1a;2007-2023年 2、指标&#xff1a;行业代码、行业名称、stkcd、year、证券简称、是否发生ST或ST或PT、是否发生暂停上市、股票简称、成立日期、交易性金融资产、…

西门子s7通信协议

目录 西门子s7通信协议 S7协议帧结构 s7协议的使用 连接 COTP连接&#xff08;第一次握手&#xff09;报文 S7连接&#xff08;第二次握手&#xff09;报文 使用tcp五次握手进行连接 读取和写入报文格式 数据的读取 接收数据的响应 数据的写入 完整代码 西门子s7通信协议 S7C…

精通C++ STL(四):vector的模拟实现

目录 vector各函数接口总览 vector当中的成员变量介绍 默认成员函数 构造函数1 构造函数2 构造函数3 拷贝构造函数 赋值运算符重载函数 析构函数 迭代器相关函数 begin和end 容量和大小相关函数 size和capacity reserve resize empty 修改容器内容相关函数 push_back po…

pyttsx3自动化脚本经典案例

pyttsx 是一个 Python 库&#xff0c;可以将文本转换为语音。它支持多个语音引擎&#xff0c;并且可以在 Windows、Linux 和 macOS 等不同平台上运行。 pyttsx 可以用来做什么&#xff1f; 将文本转换成语音输出&#xff0c;例如将电子书朗读出来。 在语音助手或者聊天机器人中…

Linux 快速构建LAMP环境

目录 部署方式&#xff1a; 基础环境准备&#xff1a; 1.安装Apache服务 &#xff08;1&#xff09;安装Apache &#xff08;2&#xff09;安装一些Apache的扩展包 2.安装PHP语言 &#xff08;1&#xff09;下载php软件仓库 &#xff08;2&#xff09;指定php安装版本…

Linux-vim编辑器以及权限-04

我们为什么要把这两个单独拎出来讲呢&#xff1f;大家应该需要知道权限是什么,我们的linux是多用户多任务的,所以可能有许多用户可以操作,万一他们把重要的文件删了呢,所以要给他设置权限,而我们的vim编辑器也是非常重要的,用来编辑我们的文本信息,第二章我们讲到了vi,他们两个…

并行训练技术概述

继续开一个新专栏&#xff0c;这里主要收集一些并行训练的相关内容。 文章目录 并行/分布式训练概述为什么需要&#xff1f;如何实施&#xff1f; 并行/分布式训练概述 首先想要说明的是&#xff0c;并行训练和分布式训练的概念其实都能讲&#xff0c;但前者可能更侧重于技术实…

李晨晨的嵌入式学习 DAY21

今天主要也是对昨天学习的进行了补充 一&#xff0c;时间函数 1.time函数 函数原型&#xff1a;time_t time(time_t *tloc); 功能&#xff1a;获取当前时间&#xff08;自1970年1月1日&#xff08;称为Unix纪元或Epoch&#xff09;以来的秒数&#xff0c;即Unix时间戳&#x…

群晖NAS安装Video Station结合内网穿透实现远程访问本地存储的影音文件

文章目录 前言1.使用环境要求&#xff1a;2.下载群晖video station&#xff1a;3.公网访问本地群晖video station&#xff1a;4.公网条件下访问本地群晖video station5.公网条件下使用移动端&#xff08;安卓&#xff0c;ios等系统&#xff09;访问本地群晖video station 前言 …