ahut 周赛3

news2024/11/26 15:32:07

A.gzm判试卷 

AhutOj

 

 

线段树(注意,一定要开到4*N,不然会RE)

单点更新(求区间最值)

单点更新不需要懒标记,区间修改是大量的点,需要懒标记

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define int long long
#define endl '\n'
const int N=8e5+10,INF=2e9;
int a[N];
int tr[N];
int n,m;
void build(int id,int l,int r){
    if(l==r) {
        tr[id]=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    tr[id]=max(tr[id*2],tr[id*2+1]);
}
void point_update(int id,int l,int r,int x,int v){
    if(l==r){
        tr[id]=v;
        return;
    }
    int mid=(l+r)/2;
    if(x<=mid) point_update(id*2,l,mid,x,v);
    else point_update(id*2+1,mid+1,r,x,v);
    tr[id]=max(tr[id*2],tr[id*2+1]);
}
int find(int id,int l,int r,int x,int y){
    if(x<=l&&r<=y) return tr[id];
    int mid=(l+r)/2,ans=-INF;
    if(x<=mid) ans=max(ans,find(id*2,l,mid,x,y));
    if(y>mid) ans=max(ans,find(id*2+1,mid+1,r,x,y));
    return ans;
}
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    while(m--){
        char op;
        int x,y;
        cin>>op>>x>>y;
        if(op=='U') point_update(1,1,n,x,y);
        else if(op=='Q') cout<<find(1,1,n,x,y)<<endl;
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

B.gzm的新栈

AhutOj

 

Push和Pop就正常操作

然后对于Onethird操作,使用树状数组+二分

用树状数组,sum(x)表示从1到x一共有多少个数,然后使用二分答案,精确找到x,使得sum(x)==(n+2)/3

如果第(n+2)/3个数,和它相同的数只有一个的话,那么可以找到x使得sum(x)刚好等于(n+2)/3

但是如果和它相同的数不止一个,那么找到的x,sum(x)会大于(n+2)/3,则r=mid.并且sum(x-1)

用了ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);就不能用scanf,printf以及puts了

AC代码(stl版的栈):

#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
//#define int long long
#define endl '\n'
using namespace std;
const int N=1e5+10;
int tr[N];
int stk[N];
int tt;
int lowbit(int x){
    return x & -x;
}
void add(int x,int c){
    for(int i=x;i<=N;i+=lowbit(i)) tr[i]+=c;
}
int sum(int x){
    int res=0;
    for(int i=x;i;i-=lowbit(i)) res+=tr[i];
    return res;
}
void solve()
{
    int m;
    cin>>m;
    stack<int>s;
    int n=0;
    while(m--){
        string op;
        cin>>op;
        if(op=="Pop"){
            if(s.empty()){
                puts("Invalid");
                continue;
            }
            cout<<s.top()<<endl;
            add(s.top(),-1);
            s.pop();
            n--;
        }
        else if(op=="Push"){
            int x;
            cin>>x;
            add(x,1);
            s.push(x);
            n++;
        }
        else{
            if(s.empty()){
                puts("Invalid");
                continue;
            }
            int l=1,r=N;
            while(l<r){
                int mid=(l+r)/2;
                if(sum(mid)>=(n+2)/3) r=mid;
                else l=mid+1;
            }
            cout<<l<<endl;
        }
    }
}
signed main()
{
    cin.tie(nullptr);
//    ios::sync_with_stdio(false);
//    cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

AC代码(数组模拟栈): 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
//#define int long long
#define endl '\n'
using namespace std;
const int N=1e5+10;
int tr[N];
int stk[N];
int tt;
int lowbit(int x){
    return x & -x;
}
void add(int x,int c){
    for(int i=x;i<=N;i+=lowbit(i)) tr[i]+=c;
}
int sum(int x){
    int res=0;
    for(int i=x;i;i-=lowbit(i)) res+=tr[i];
    return res;
}
void solve()
{
    int m;
    cin>>m;
    while(m--){
        string op;
        cin>>op;
        if(op=="Pop"){
            if(!tt){
                puts("Invalid");
                continue;
            }
            cout<<stk[tt]<<endl;
            add(stk[tt],-1);
            tt--;
        }
        else if(op=="Push"){
            tt++;
            cin>>stk[tt];
            add(stk[tt],1);
        }
        else{
            if(!tt){
                puts("Invalid");
                continue;
            }
            int n=tt;
            int l=1,r=N;
            while(l<r){
                int mid=(l+r)/2;
                if(sum(mid)>=(n+2)/3) r=mid;
                else l=mid+1;
            }
            cout<<l<<endl;
        }
    }
}
signed main()
{
    cin.tie(nullptr);
//    ios::sync_with_stdio(false);
//    cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

C.gzm的新栈

AhutOj

 

数最大为1000000000,第二大为999999999,所有位数加起来为81,再加起来为9,已经变成个位数了,再怎么加都不变了,所以[1,1e9]中的任何一个数只需要最多两次就可以变成个位数,再怎么操作都不会变了,该下标就不用再操作了

利用并查集,当a[x]变为个位数时,p[x]就指向x+1,当下次再到该x时,就利用find(x)找到x的祖宗,跳过之间已经不需要操作的下标

注意,p[n+1]要初始化为n+1,否则p[n+1]一开始为0的话,当调用find(n)时,p[n]=n+1,再调用find(n+1),然后n+1不等于0,这样的话,就一直递归不出来,导致死循环

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#define endl '\n'
using namespace std;
const int N=2e5+10;
int a[N];
int p[N];
int n,q;
void init(){
    for(int i=1;i<=n+1;i++) p[i]=i;
}
//并查集
int find(int x) {
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
//求a[x]所有位数之和,并返回给a[x]
void sum(int x){
    int ans=0;
    while(a[x]){
        ans+=a[x]%10;
        a[x]/=10;
    }
    a[x]=ans;
}
void solve()
{
    cin>>n>>q;
    init();
    for(int i=1;i<=n;i++) cin>>a[i];
    while(q--){
        int op;
        cin>>op;
        if(op==1){
            int l,r;
            cin>>l>>r;
            while(l<=r){
                sum(l);
                if(a[l]<10) p[l]=l+1;
                l++;
                l=find(l);
            }
        }
        else{
            int x;
            cin>>x;
            cout<<a[x]<<endl;
        }
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    solve();
    return 0;
}

D.gzm的旋转图腾

AhutOj

 

 

题目表达的意思不是很明确,有一些歧义,题目的意思是能否通过恰好k次操作(0变1或1变0),使得该图形旋转180度之后和原本一样(也就是中心对称)

首先要考虑特殊情况,这是做题目最应优先考虑的:当n等于1时,直接输出YES

遍历一遍矩阵,数一下有多少对点不是中心对称,记为cnt,如果cnt超过了题目的限制k,那么就直接输出NO

如果cnt小于k,还不一定是NO.

当n为奇数时,最中心的那个点始终中心对称,我们可以变换最中心的点,01交替变换,直至次数刚好为k

当n为偶数时,我们可以将一对中心对称的相同的点同时从1变为0或从0变为1,故如果k-cnt是2的倍数,就输出YES,否则输出NO

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<stack>
#include<vector>
using namespace std;
const int N=1010;
int a[N][N];
//int tmp[N][N];
int n,k;
旋转180度
//void rotate(int a[N][N])
//{
//    memset(tmp,0,sizeof tmp);
//    for(int i=0;i<n;i++){
//        for(int j=0;j<n;j++){
//            tmp[n-1-i][n-1-j]=a[i][j];
//        }
//    }
//}
void solve()
{
    cin>>n>>k;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>a[i][j];
        }
    }
    if(n==1){
        puts("YES");
        return;
    }
    int cnt=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(a[i][j]!=a[n-1-i][n-1-j]){
                cnt++;
                a[i][j]=a[n-1-i][n-1-j];
                if(cnt>k){
                    puts("NO");
                    return;
                }
            }
        }
    }
    if(n%2==1) puts("YES");
    else{
        if((cnt-k)%2==0) puts("YES");
        else puts("NO"); 
    }
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    solve();
    return 0;
}

E.gzm学线段树

AhutOj

 

线段树(注意,一定要开到4*N,不然会RE)

区间修改(求区间最值)

需要懒标记

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define int long long
#define endl '\n'
const int N=8e5+10,INF=2e9;
int a[N];
int lazy[N];
int sum[N];
int n,m;
void build(int id,int l,int r){
    if(l==r){
        sum[id]=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    sum[id]=sum[id*2]+sum[id*2+1];
}
void push_up(int id){
    sum[id]=sum[id*2]+sum[id*2+1];
}
void push_down(int id,int l,int r){
    if(lazy[id]){
        int mid=(l+r)/2;
        lazy[id*2]+=lazy[id];
        lazy[id*2+1]+=lazy[id];
        sum[id*2]+=lazy[id]*(mid-l+1);
        sum[id*2+1]+=lazy[id]*(r-mid);
        lazy[id]=0;
    }
}
void range_update(int id,int l,int r,int x,int y,int v){
    if(x<=l&&r<=y){
        lazy[id]+=v;
        sum[id]+=v*(r-l+1);
        return;
    }
    push_down(id,l,r);
    int mid=(l+r)/2;
    if(x<=mid) range_update(id*2,l,mid,x,y,v);
    if(y>mid) range_update(id*2+1,mid+1,r,x,y,v);
    push_up(id); 
}
int find(int id,int l,int r,int x,int y){
    if(x<=l&&r<=y) return sum[id];
    push_down(id,l,r);
    int mid=(l+r)/2,ans=0;
    if(x<=mid) ans+=find(id*2,l,mid,x,y);
    if(y>mid) ans+=find(id*2+1,mid+1,r,x,y);
    return ans;
}
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    while(m--){
        char op;
        cin>>op;
        if(op=='C'){
            int x,y,v;
            cin>>x>>y>>v;
            range_update(1,1,n,x,y,v);
        }
        else if(op=='Q'){
            int x,y;
            cin>>x>>y;
            cout<<find(1,1,n,x,y)<<endl;
        }
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

F.gzm的新启发式可持久化线段树维护多重背包

AhutOj

思维题

对于正数来说,肯定乘的i越小越好,而我们完全可以做到让所有的正数都乘1,只需要从前往后一个一个删即可

但是对于负数,我们肯定要乘的i尽可能大,所以从后往前删,负数都是乘以它们本身的下标

故只需要将正数全部相加,负数则乘以它本身的下标再相加

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define int long long
using namespace std;
const int N=1e6+10;
int a[N];
void solve()
{
    int n;
    cin>>n;
    int res=0;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++){
        if(a[i]>0) res+=a[i];
        else if(a[i]<0) res+=a[i]*i;
    }
    cout<<res<<endl;
}
signed main()
{
    solve();
    return 0;
}

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

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

相关文章

Jmeter接口测试从0到1打通,从安装到接口测试实例(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Jmeter简介 J…

安装adobe系列产品,提示错误代码81解决办法

安装adobe系列软件&#xff0c;如Photoshop、Premiere Pro、Illustrator等时&#xff0c;出现如下图提示错误代码81&#xff0c;如何解决呢&#xff1f;一起来看看。 解决方法一 (重启电脑等待5分钟再安装&#xff01;) 解决方法二 应用程序中打开Adobe Creative Cloud 点击…

分布式文件系统与HDFS的shell操作及查看元数据

启动hadoop和hive的metastore查看sbin的目录下的文件 执行./start-all.sh 查看相关的进程

node.js重装问题

目录 问题一&#xff1a; 问题二&#xff1a; node.js安装分享&#xff1a; node.js重装参考&#xff1a; 问题一&#xff1a; 使用&#xff08;npm install express -g&#xff09;报错&#xff1a; config global --global -local are deprecated. Use --locationglobal …

【软件测试】Window与Linux系统下-初始化Git环境(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Window 初始化 Gi…

python开发ESP32之环境配置(一)

1、开发编辑器 Thonny 2、串口驱动安装 通过type-c线将芯片链接电脑&#xff0c; 右击我的点电脑——管理——设备管理器&#xff0c;查看驱动安装是否正常。 异常情况下需要安装驱动&#xff08;CP2102USBQD),根据个人电脑配置选择相应的驱动程序 安装失败的话&…

AcWing1536. 均分纸牌 AcWing122. 糖果传递—数学推导、贪心

均分纸牌 && 糖果传递 均分纸牌糖果传递 均分纸牌 题目链接 AcWing1536. 均分纸牌 问题描述 分析 这道题有个特殊的地方就是A1只能从A2获取纸牌&#xff0c;或者A1只能将多余的纸牌给A2&#xff0c;此操作后A1的纸牌数应该为avg。 A2的纸牌只能从A3获取&#xff0c;…

PS VR2头显有望将与PC兼容,并实现破解6DOF跟踪功能

Sony在今年早些时候推出了专门为PlayStation 5打造的高级虚拟现实头显PS VR2&#xff0c;这款头显赢得了行业的赞誉&#xff0c;为用户提供了独特的体验。 然而&#xff0c;由于其高达599美元&#xff08;约合4283元人民币&#xff09;的售价&#xff08;相比于售价为399美元的…

MySQL学生表和分数表的多表查询

目录 一、创建学生表 二、创建分数表 1.查询student表的所有记录 2.查询student表的第2条到4条记录 3.从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;name&#xff09;和院系&#xff08;department&#xff09;的信息 4.从student表中查询计…

【Hello mysql】 mysql的索引

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;介绍mysql的索引 mysql索引 索引索引是什么索引的分类索引作用查看 磁盘mysql的工作过程认识磁盘定位扇区磁盘随机访问(Random Access)与连续访问(Sequential Access)mysql和磁盘交互的基本单位 索引的理解建立测试表为何I…

Python(十四)数据类型——浮点型

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

Redis(分布式缓存详解)

Redis 一、Redis简介1.1. 适用场景1.2. 常用数据类型1.3. 单点Redis缺陷 二、持久化机制&#xff08;解决数据丢失&#xff09;2.1. RDB2.1.1. RDB优缺点 2.2. AOF2.2.1. AOF配置2.2.2. AOF优缺点 三、Redis集群3.1. 主从&#xff08;解决并发读&#xff09;3.1.1. 主从数据同步…

HBase v2.2 高可用多节点搭建

最近刚刚完成了HBase相关的一个项目,作为项目的技术负责人,完成了大部分的项目部署,特性调研工作,以此系列文章作为上一阶段工作的总结. 前言 其实目前就大多数做应用的情况来讲,我们并不需要去自己搭建一套HBase的集群,现有的很多云厂商提供的服务已经极大的方便日常的应用使…

GEE:计算每个对象的面积、标准差、周长、宽度、高度

作者:CSDN @ _养乐多_ 本文记录了面对对对象分割,以及计算每个对象的面积、标准差、周长、宽度、高度的代码。 文章目录 一、代码一、代码 // 设置种子 var seeds = ee.Algorithms.Image.Segmentation.seedGrid(20)

node.js 第一天

目录 使用readFile()方法读取文件内容 判断文件是否读取成功 判断文件是否写入成功 案例 考试成绩整理 path path.join&#xff08;&#xff09; path.basename() 使用readFile()方法读取文件内容 // 1. 导入 fs 模块&#xff0c;来操作文件 const fs require(fs)// 2.…

Redis(二)网络协议和异步方式(乐观锁悲观锁)

Redis系列文章 Redis&#xff08;一&#xff09;原理及基本命令&#xff08;柔性数组&#xff09; Redis&#xff08;二&#xff09;网络协议和异步方式&#xff08;乐观锁&悲观锁&#xff09; Redis&#xff08;三&#xff09;存储原理与数据模型&#xff08;hash冲突、渐…

2023年NOC决赛-加码未来编程赛项决赛模拟题-Python模拟题--卷2

第一题: 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 第二题: 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10…

mysql invalid conn排查

mysql invalid conn排查 问题背景 服务使用golang &#xff0c;客户端库是go-mysql-driver ,系统测试环境频繁但是不总是报出invalid conn 错误&#xff0c;但实际拿sql执行时却是正常执行。 排查思路 原因分析 客户端使用了无效连接 由于连接无效&#xff0c;首先考虑客…

AI绘画StableDiffusion实操教程:冰霜旗袍美女

飞书原文链接&#xff0c;获取更多资源&#xff1a;AI绘画StableDiffusion实操教程&#xff1a;冰霜旗袍美女 前几天分享了StableDiffusion的入门到精通教程&#xff1a;AI绘画&#xff1a;Stable Diffusion 终极炼丹宝典&#xff1a;从入门到精通 但是还有人就问&#xff1a…

数学专题训练1 概率dp

数学专题训练1 1. RollingDiceDivOne 有 n n n​ 个骰子&#xff0c;第 i i i​ 个骰子拥有 d i c e [ i ] dice[i] dice[i] 面&#xff0c;每面包含 1 , 2 , . . . , d i c e [ i ] 1,2,...,dice[i] 1,2,...,dice[i] 的点数。同时掷这 n n n 个骰子&#xff0c;问掷出来…