2023牛客暑期多校训练营4

news2024/9/20 8:57:46

A.Bobo String Construction

s取全0串或者全1串,至少有一者满足题述条件

大致感受一下

随便举几个例子:

t s t

0000|0000|0000 s为全0不符合,但s为全1符合

1001|00|1001 s为全0不符合,但s为全1符合

101|000000|101 s为全0或为全1均符合

所以只需判断全0串或者全1串哪个符合题述条件即可(只要判断一方即可,一方不符合就是另一方)

 

 

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<cstdio>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
int n;
void solve() {
    cin>>n;
    string t;
    cin>>t;
    string s(n,'0');
    string ss(n,'1');
    string str=t+s+t;
    if(str.find(t,1)!=t.size()+s.size()) cout<<ss<<endl;
    else cout<<s<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)
        solve();
    return 0;
}

或者用kmp算法在文本串匹配模式串 

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<cstdio>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=1010;
int ne[N];
int n;
void solve() {
    cin>>n;
    string t;
    cin>>t;
    string s(n,'0');
    string ss(n,'1');
    string str='0'+t+s+t;
    int len1=t.size();
    int len2=t.size()+n+t.size();
    t='0'+t;
    //求next值
    for(int i=2,j=0;i<=len1;i++){
        while(j&&t[i]!=t[j+1]) j=ne[j];
        if(t[i]==t[j+1]) j++;
        ne[i]=j;
    }
    //文本串匹配模式串
    bool ok=true;
    for(int i=1,j=0;i<=len2;i++){
        while(j&&str[i]!=t[j+1]) j=ne[j];
        if(str[i]==t[j+1]) j++;
        //找到了模式串
        if(j==len1){
            //i表示文本串匹配到了哪一位
            if(i!=len1&&i!=len2){
                ok=false;
                break;
            }
        }
    }
    if(ok) cout<<s<<endl;
    else cout<<ss<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)
        solve();
    return 0;
}

F.Election of the King 

先从小到大排个序,然后每次肯定要么删第一个数,要么删最后一个数

我们先求出第一个数(最小的数)和最后一个数(最大的数)的平均值x,然后求出大于x的数有几个,小于等于x的数有几个,如果大于x的数多,那么就删掉第一个数,否则就删掉最后一个数

将运行轨迹输出出来,方便检查

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<deque>
#include<cstdio>
#define endl '\n'
//#define int long long
typedef long long ll;
using namespace std;
typedef pair<int,int>PII;
int n;
void solve()
{
    cin>>n;
    vector<PII>ans;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        ans.push_back({x,i});
    }
    sort(ans.begin(),ans.end());
    int p=0,q=n-1;
    while(p<q){
        int x=ans[p].first+ans[q].first;
        int l=p,r=q;
        while(l<r){
            int mid=(l+r)/2;
            if(ans[mid].first*2>x) r=mid;
            else l=mid+1;
        }
//        cout<<p<<" "<<q<<" "<<l<<endl;
        if(q-l+1>l-p) p++;
        else q--;
    }
    cout<<ans[p].second<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--)
    solve();
    return 0;
}

L.We are the Lights

法一:先预处理操作的行的最终状态和列的最终状态

然后按照先后顺序进行枚举,由于记录的都是最终状态,也就是说操作的每一行以及每一列都只会操作一次(不会重复操作)

如果开了一列灯,那么就加上(n-开了几行灯)

如果开了一行灯,那么就加上(m-开了几列灯)

如果关了一列灯,那么就减去开了几列灯

如果关了一行灯,那么就减去开了几列灯

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<deque>
#include<cstdio>
#include<set>
#define endl '\n'
//#define int long long
typedef long long ll;
using namespace std;
typedef pair<int,int>PII;
const int N=1e6+10;
int n,m,q;
struct node{
    int kind;//0表示行,1表示列
    int x;
    int status;//0表示关灯,1表示开灯
}s[N];
bool st[N];
int cnt[N];
void solve()
{
    cin>>n>>m>>q;
    //预处理,记录操作的行的最终状态以及列的最终状态
    for(int i=0;i<q;i++){
        string s1,s2;
        int x;
        cin>>s1>>x>>s2;
        if(s1=="row"){
            if(s2=="on") s[i]={0,x,1};
            else s[i]={0,x,0};
        }
        else{
            if(s2=="on") s[i]={1,x,1};
            else s[i]={1,x,0};
        }
    }
    set<PII>se;
    for(int i=q-1;i>=0;i--){
        int kind=s[i].kind,x=s[i].x;
        if(!se.count({kind,x})){
            se.insert({kind,x});
            st[i]=true;
        }
    }
    ll res=0;
    for(int i=0;i<q;i++){
        if(!st[i]) continue;
        //开灯
        if(s[i].status==1){
            cnt[s[i].kind]++;//cnt[0]记录开了几行灯,cnt[1]记录开了几列灯
            if(s[i].kind==1) res+=n-cnt[0];//如果开了一列灯,那么就加上(n-开了几行灯)
            else res+=m-cnt[1];//如果开了一行灯,那么就加上(m-开了几列灯)
        }
        //关灯
        else{
            if(s[i].kind==1) res-=cnt[0];//如果关了一列灯,那么就减去开了几列灯
            else res-=cnt[1];//如果关了一行灯,那么就减去开了几列灯
        }
    }
    cout<<res<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--);
    solve();
    return 0;
}

换一种写法: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<deque>
#include<set>
#include<cstdio>
#define endl '\n'
//#define int long long
typedef long long ll;
using namespace std;
const int N=1e6+10;
int n,m,q;
struct node{
    string s1;
    int x;
    string s2;
}s[N];
bool ok[N];
void solve()
{
    cin>>n>>m>>q;
    for(int i=0;i<q;i++) cin>>s[i].s1>>s[i].x>>s[i].s2;
    set<pair<string,int>>se;
    for(int i=q-1;i>=0;i--){
        string s1=s[i].s1;
        int x=s[i].x;
        if(!se.count({s1,x})){
            se.insert({s1,x});
            ok[i]=true;
        }
    }
    int row=0,col=0;
    ll res=0;
    for(int i=0;i<q;i++){
        if(!ok[i]) continue;
        if(s[i].s2=="on"){
            if(s[i].s1=="row"){
                res+=m-col;
                row++;
            }
            else{
                res+=n-row;
                col++;
            }
        }
        else{
            if(s[i].s1=="row") res-=col;
            else res-=row;
        }
    }
    cout<<res<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--)
    solve();
    return 0;
}

法二:

从后往前推,同理也是要知道操作的行和列的最终状态,不过呢,由于在后面的肯定是最终状态,所以当枚举到某行或某列是第一次出现时,那么就是最终状态,标记一下,如果后面再出现已经标记过的行或列时,就直接continue

我们先知道后面的状态,比如说后面的状态是对一列进行关灯操作,那么如果前一操作是开灯操作,那么它开的数量就是(n-开灯的列数),实际上根本不用管后一操作是开灯还是关灯,只要后面操作了,前一次操作操作同样的地方就白操作了,所以只要记录后面状态操作的行的次数以及操作的列的次数就行了

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<deque>
#include<set>
#include<cstdio>
#define endl '\n'
//#define int long long
typedef long long ll;
using namespace std;
const int N=1e6+10;
int n,m,q;
struct node{
    string s1;
    int x;
    string s2;
}s[N];
int row[N];
int col[N];
void solve()
{
    cin>>n>>m>>q;
    for(int i=0;i<q;i++) cin>>s[i].s1>>s[i].x>>s[i].s2;
    int cnt1=n;//还剩几行在后面没被操作过,也就是有几行操作是有效的
    int cnt2=m;//还剩几列在后面没被操作过,也就是有几列操作是有效的
    //由于我们只要求灯亮的数量,所以我们只要知道开灯操作有哪些是有效的就行,不需要考虑关灯
    ll res=0;
    for(int i=q-1;i>=0;i--){
        int x=s[i].x;
        if(s[i].s2=="on"){
            if(s[i].s1=="row"){
                if(row[x]) continue;
                res+=cnt2;
            }
            else{
                if(col[x]) continue;
                res+=cnt1;
            }
        }
        if(!row[x]&&s[i].s1=="row") {
            row[x]=1;
            cnt1--;
        }
        else if(!col[x]&&s[i].s1=="column"){
            col[x]=1;
            cnt2--;
        }
    }
    cout<<res<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--)
    solve();
    return 0;
}

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

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

相关文章

redis原理 3:未雨绸缪 —— 持久化

redis原理 3&#xff1a;未雨绸缪 —— 持久化 Redis 的数据全部在内存里&#xff0c;如果突然宕机&#xff0c;数据就会全部丢失&#xff0c;因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失&#xff0c;这种机制就是 Redis 的持久化机制。 Redis 的持久化机制有两种…

超越年龄限制:保持体能与积极心态的重要性(AI)

机器人和人工智能&#xff0c;没有年龄限制&#xff0c;并且越来越强&#xff0c;代表了最先进的生产力方向。 AI&#xff1a; 机器人和人工智能的发展代表了最先进生产力的方向&#xff0c;它们可以帮助人们更高效地完成各种任务&#xff0c;从而推动经济和社会的发展。机器人…

SpringDataJPA框架使用笔记

SpringDataJPA框架使用笔记 什么是JPA jpa概念 JPA是Java中用于实现对象关系映射ORM的API标准&#xff0c; JPA提供了一种将JAVA对象映射到关系数据库的方式&#xff0c; 使开发人员可以使用面向对象的方式操作数据库&#xff0c;而不需要编写繁琐的SQL语句。 jpa中的一些概…

牵手科瑞物业,合合信息智能文字识别技术助力企业沉淀数据资产

名片是商务场景中信息传递的重要载体。比起传统的纸质名片&#xff0c;可动态化呈现个人及企业信息&#xff0c;洞察访客偏好的数字名片已成为企业对外展示、拓展客户的重要工具。近期&#xff0c;合合信息旗下名片全能王与科瑞物业达成合作。通过推动企业数字名片在科瑞物业各…

【若依管理系统】开发功能流程总结

1.在菜单管理中&#xff0c;新增需要创建的菜单&#xff0c;如图 并添加查询、新增、修改、删除等按钮和对应的权限和路径 例如如果没有添加查询按钮&#xff0c;那么在修改的时候&#xff0c;会存在报错&#xff1a;没有权限。上图对应后台代码 2.domain中创建设计的表结构及操…

优化全域广告投放效果的方法与技巧

好久不见&#xff01;不少读者催更的《企业广告投放逻辑精讲》系列继续更新啦&#xff01;感谢各位忠实读者的支持&#xff01; 经过前两章的学习&#xff0c;想必你已经了解了广告投放的正确方式&#xff0c;但事实上&#xff0c;掌握方法只是基础&#xff0c;相当于你要学习…

【计算机视觉】干货分享:Segmentation model PyTorch(快速搭建图像分割网络)

一、前言 如何快速搭建图像分割网络&#xff1f; 要手写把backbone &#xff0c;手写decoder 吗&#xff1f; 介绍一个分割神器&#xff0c;分分钟搭建一个分割网络。 仓库的地址&#xff1a; https://github.com/qubvel/segmentation_models.pytorch该库的主要特点是&#…

Python web实战之Django用户认证详解

关键词&#xff1a; Python Web 开发、Django、用户认证、实战案例 概要 今天来探讨一下 Django 的用户认证吧&#xff01;在这篇文章中&#xff0c;我将为大家带来一些有关 Django 用户认证的最佳实践。 1. Django 用户认证 在开发 Web 应用程序时&#xff0c;用户认证是一个…

Android系统APP之SettingsProvider

前言 SettingsProvider顾名思义是一个提供设置数据共享的Provider&#xff0c;SettingsProvider和Android系统其它Provider有很多不一样的地方&#xff0c;如&#xff1a; SettingsProvider只接受int、float、string等基本类型的数据&#xff1b;SettingsProvider由Android系…

喜讯!箱讯AnyCase荣获“2023年度苏州市服务型制造示范平台”

近日&#xff0c;苏州市工业和信息化局公示了“2023年度苏州市服务型制造示范企业&#xff08;平台&#xff09;”名单。箱讯科技&#xff08;上海&#xff09;有限公司子公司苏州箱讯供应链管理有限公司荣耀上榜。 ​ 添加图片注释&#xff0c;不超过 140 字&#xff08;可选…

IFC纹理及着色器研究

最近&#xff0c;yorgunkirmizi 讨论了纹理、着色器、纹理坐标以及所有此类内容在 IFC 中的工作原理。 我们在破译什么是可能的、什么是不可能的方面已经取得了一些重大进展&#xff0c;所以我想我应该打开这个线程&#xff0c;以便其他人也可以参与其中&#xff0c;或者至少密…

恒运资本:货币调控精准有力 8月流动性合理充裕

8月3日&#xff0c;中国人民银行以利率投标方式展开30亿元逆回购操作&#xff0c;由于当日有1140亿元逆回购到期&#xff0c;公开商场完成净回笼1110亿元。 专家表示&#xff0c;为坚持流动性合理富余&#xff0c;估计央即将根据流动性供求和商场利率改变&#xff0c;灵敏运用多…

【雕爷学编程】MicroPython动手做(39)——机器视觉之图像基础

MixPY——让爱(AI)触手可及 MixPY布局 主控芯片&#xff1a;K210&#xff08;64位双核带硬件FPU和卷积加速器的 RISC-V CPU&#xff09; 显示屏&#xff1a;LCD_2.8寸 320*240分辨率&#xff0c;支持电阻触摸 摄像头&#xff1a;OV2640&#xff0c;200W像素 扬声器&#…

阿里云平台WoSignSSL证书应用案例

沃通CA与阿里云达成合作并在阿里云平台上线WoSign品牌SSL证书。自上线以来&#xff0c;WoSignSSL证书成为阿里云“数字证书管理服务”热销证书产品&#xff0c;获得阿里云平台客户认可&#xff0c;助力阿里云平台政府、金融、教育、供应链、游戏等各类行业客户实现网站系统数据…

美团前端研发框架Rome实践和演进趋势

本文整理自美团技术沙龙第76期《大前端研发协同效能提升与实践》&#xff0c;为大家介绍了美团到店前端研发框架Rome实践和演进趋势。 具体来讲&#xff0c;本文首先介绍了Rome整体的工程生态、演变路径、规模化升级以及工程框架外的开发辅助工具&#xff1b;第二部分&#xff…

主流CRM有哪些特点和优势?

现如今&#xff0c;CRM系统是企业实现数字化转型&#xff0c;提高销售收入的首选工具。但市场上有众多CRM品牌&#xff0c;每家都有自己的特点和优势&#xff0c;企业该如何进行选择&#xff1f;下面我们就来进行主流CRM系统比较&#xff0c;并说说什么CRM产品比较好? 主流CR…

控制器(IP盒子类似网关)收不到工位板的状态数据包的问题排查解决

控制器(IP盒子类似网关)收不到工位板的状态数据包 问题描述 如下图通信框图所示&#xff0c;控制器工位板程序通过RS422和控制器(类似网关)通信&#xff0c;控制器在将数据转发给Linux应用程序。 一开始设备装好&#xff0c;整个通信是没有任何问题的。 然后在很久之后&…

【C#学习笔记】装箱和拆箱

文章目录 装箱和拆箱性能消耗装箱拆箱 比较var&#xff0c;object&#xff0c;dynamic&#xff0c;\<T\>varobject\<T\> 泛型dynamic 装箱和拆箱 在讲引用类型object的时候&#xff0c;我们说它是万能的&#xff0c;却没说它万能在哪里。 除了object为每一种变量…

收集 301 医院 451 名老年冠心病患者数据,湖北麻城人民医院推出机器学习模型,准确预测患者一年内死亡率

内容一览&#xff1a;据国际糖尿病联盟 (IDF) 统计&#xff0c;2021 年中国糖尿病患者数量占全球 26%。而糖尿病患者血糖长期失控&#xff0c;有极高风险引起冠心病等并发症。近期&#xff0c;湖北省麻城市人民医院研究人员分析比较了多种模型&#xff0c;并用其中表现最优的机…

Scratch 之 两点之间距离的测算

1.前言 在Scratch中&#xff0c;对于坐标系上的两点&#xff0c;我们可以确定通过x坐标或y坐标之差确定两点横坐标或是纵坐标上的距离&#xff0c;那么如何知道两点之间的直线距离呢&#xff1f; 2.勾股定理 对于一个直角三角形&#xff0c;两条直角边的平方和等于斜边的平方&a…