10月30日解题报告

2023-05-16

做题思路
第一题表示根本没有想到是线段树这种东西,结果看到题解的时候。。。内心是崩溃的,看了线段树还是得多练练,第二题是dp,算是简单,但是自己没有想到还是很伤,也还是要多练,感觉这两个直接踩到我的痛点了
总分 300
得分 第一题(线段树):40分,第二题(dp):0分,第三题(字典树):0分,惨不忍睹

第一题
给定一个由小写字母组成的字符串 s。有 m 次操作,每次操作给定 3 个参数 l,r,x。如果 x=1,将 s[l]~s[r]升序排序;如果 x=0,将 s[l]~s[r]降序排序。你需要求出最终序列。

样例输入:
5 2
cabcd
1 3 1
3 5 0
样例输出:
abdcc

AC思路:
标程TLE了是真的尴尬。。。所以求助于组内大佬,得到真传。。。我们可以建一颗裸的线段树,把各个叶子节点附上对应位置字符-‘a’+1的值,(因为初始是0,如果不+1后面会搞事情),然后对于一个节点,如果其两个子节点的数值相同,那么它自己也附上相同的值。。。这样输出或求个数时就不一定要把树给遍历完了,而且其也承担着懒数组(伪)的作用,更改时如果区间不完全重合,那么就需要把其子孩子附上它的值(有可能之前的更改没有变更它的值,再把它清0),然后对于每一次操作,求其区间内各个字母的次数,然后按照要求从a-z或从z-a循环,如果有则将相应区间内原来值替换,就搞定了,输入和建树差不多,直接输出就可以了;
代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int n,m;
char s[200000];
string ds;
struct node
{
    int l,r;
    int a;
}e[400000];
int w[30];
int read()
{
    int x=0,y=1;char k;
    while(k<'0'||k>'9'){if(k=='-')y=-1;k=getchar();}
    while(k>='0'&&k<='9'){x=(x<<3)+(x<<1)+k-'0';k=getchar();}
    return x*y;
}
int build(int ll,int rr,int u)
{
    e[u].l=ll;
    e[u].r=rr;
    if(ll==rr)
    {
        e[u].a=(int)(s[ll]-'a'+1);
        return 0;
    }
    int mid=(ll+rr)>>1;
    build(ll,mid,u<<1);
    build(mid+1,rr,u<<1|1);
    if(e[u<<1].a==e[u<<1|1].a)
        e[u].a=e[u<<1].a;
}
void getsum(int ll,int rr,int u)
{
    if(e[u].l>=ll&&e[u].r<=rr&&e[u].a)
    {
        w[e[u].a]+=e[u].r-e[u].l+1;
        return;
    }
    if(e[u].a)e[u<<1].a=e[u].a,e[u<<1|1].a=e[u].a;
    int mid=(e[u].l+e[u].r)>>1;
    if(mid>=ll)getsum(ll,rr,u<<1);
    if(mid<rr)getsum(ll,rr,u<<1|1);
}
void th(int ll,int rr,int u,int x)
{
    if(e[u].l>=ll&&e[u].r<=rr||e[u].a==x)
    {
        e[u].a=x;
        return; 
    }
    if(e[u].a)e[u<<1].a=e[u].a,e[u<<1|1].a=e[u].a,e[u].a=0;
    int mid=(e[u].l+e[u].r)>>1;
    if(mid>=ll)th(ll,rr,u<<1,x);
    if(mid<rr)th(ll,rr,u<<1|1,x);
    if(e[u<<1].a==e[u<<1|1].a)
        e[u].a=e[u<<1].a;
}
void shuchu(int u)
{
    if(e[u].a)
    {
        for(int i=1;i<=e[u].r-e[u].l+1;++i)
            cout<<(char)('a'+e[u].a-1);
        return;
    }
    shuchu(u<<1);
    shuchu(u<<1|1);
}
int main()
{
    n=read();m=read();
    for(int i=1;i<=n;++i)
        cin>>s[i];
    build(1,n,1);
    for(int j=1;j<=m;++j)
    {
        int a,b,x;
        a=read();b=read();x=read();
        for(int i=1;i<=26;++i)
        {
            w[i]=0;
        }
        getsum(a,b,1);
        int l=a;
        if(x==1) 
        for(int i=1;i<=26;++i)
        {
            if(w[i])
            {
                th(l,l+w[i]-1,1,i);
                l=l+w[i];
            } 
        }
        else
        {
            for(int i=26;i>=1;i--)
          {
              if(w[i])
              {
                   th(l,l+w[i]-1,1,i);
                   l=l+w[i];
              } 

          } 
        }
    }
    shuchu(1);  
}

第二题
求出满足以下条件的 n*m 的 01 矩阵个数:
(1) 第 i 行第 1~li 列恰好有 1 个 1。
(2) 第 i 行第 ri~m 列恰好有 1 个 1。
(3) 每列至多有 1 个 1。
输入
第一行两个整数 n,m。接下来 n 行每行 2 个整数 li,ri。
输出
一行一个整数表示答案。对 998244353 取模。
样例输入
2 6
2 4
5 6
样例输出
12
AC思路:
这道题是真的玄学,虽然是dp,但是这道题是用的比较“不合常规”的dp,数从前到后,却代表的是其后面列数的1的个数。。。。搞得我看标程都看了好久(还好有大佬)
好了,回到这道题,我们发现题目除了对哪一行的一个区间内的1的个数有要求外,主要的大前提是每列不能出现多于1个的1,所以我们发现,其实主要是对列有要求,所以dp思路是对列进行。。。我们枚举每一列,对右边排了几个1进行一一地枚举,然后算出方案数,再对左边枚举,再算出方案数,(记得取%)
代码

#include<iostream>
#include<cstdio>
using namespace std;
long long n,m;
long long sl[300000];
long long sr[300000];
long long f[4000][4000];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int l,r;
        cin>>l>>r;
        sl[l]++;
        sr[r]++;
    }
    for(int i=1;i<=m;i++)
       sl[i]+=sl[i-1],sr[i]+=sr[i-1];//前缀和;
    f[0][0]=1;
    for(int i=1;i<=m;i++)//这是枚举的第i列之后,注意不是之前;
    {
        f[i][0]=f[i-1][0];
        for(int j=1;j<=i;j++)//枚举的是已经放了1的个数;
        {
            f[i][j]=(f[i-1][j]+f[i-1][j-1]*(sr[i]-j+1))%998244353;//枚举列与已经放了的个数......倒走.....
        }
        for(int j=sl[i-1];j<sl[i];j++)//不等于是因为等于会有状态重合;
            for(int k=0;k<=i;k++)//枚举左边放置的数量,其实似乎=也可以不要;
            {
               f[i][k]=f[i][k]*(i-k-j)%998244353;//放的方案数
            }
    } 
    cout<<f[m][n];//还是搞不清为什么输出f[m][n];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10月30日解题报告 的相关文章

  • Nvidia Xavier Nx平台修改CAN时钟调试记录

    1 前言 JETSON NX开发板上配置CAN bus与一个CAN收发器SN65HVD230 要求是改变设备树中的CAN时钟速率 让CAN时钟修改为40MHZ 2 如何设置准确的40MHz 要实现40MHz 首先需要设置CAN父时钟为pll
  • 【CMake】常见目录——10.1安装项目

    CMake中的目录 常见目录所代表的含义 PROJECT SOURCE DIR xff1a 工程的根目录 PROJECT BINARY DIR xff1a 运行cmake命令的目录 xff0c 通常为 PROJECT SOURCE DIR
  • 编译的时候所使用的动态库中出现错误:未定义的引用

    1 使用makefile编译的时候 xff0c 出现错误如下 xff1a 如上图所示 xff0c 是在动态库libicdbapi so中出现了未定义错误 xff0c 既然是未定义错误 xff0c 说明sqlprct sqlnult这5个符号
  • STL1:简介

    STL1 简介 1 背景1 1 STL是什么 xff1f 1 2 STL与C 43 43 标准库的关系1 3 版本 2 STL的组成3 容器分类4 迭代器分类4 1 分类原则 xff1a 访问方式4 2 分类原则 xff1a 操作类型4 3
  • Linux网络编程 5 - select模式的TCP服务器

    为了同时处理多个客户端的连接 xff0c 上一篇介绍了利用多线程的方法实现 xff0c 每个连接新建一个线程 xff0c 然后各自去处理 这是最简单也是最容易想到的方式 客户端的连接存在 xff0c 线程就存在 但是 xff0c 对于每一个
  • c标准库—参考手册

    1 lt errno h gt 2 lt float h gt 3 lt limits h gt 4 lt locale h gt 5 lt math h gt 6 lt signal h gt 7 lt setjmp h gt 8 lt
  • MPU6050

    1 个人总结 常用的MPU6050有八个针脚 xff0c VCC 跟GND 给模块供电 xff0c 模块通讯方式采用IIC通讯 xff0c SCL跟SDA为信号传递通道 xff0c XDA 跟 XCl是用来外接电磁传感器 xff0c 玩过M
  • 自学 Python 第一天

    总结 xff1a 感觉Python 前边学起来 跟c差不多 xff0c 之前学习过c语言 xff0c 但是并没有学这么细 xff0c 刚好学python xff0c 把当时忽略的知识点 重新减一下 打算花费两周学完Python为后续学习Op
  • 多功能悬赏任务平台app+小程序源码开源版搭建开发

    悬赏任务app源码 xff0c 从名字本身就可以理解这个PHP项目的流程 通过在线管理员工任务 即使它也可以在Intranet中工作 MySQL数据库是此源代码的最终部分 它易于实施和遵循 它是所有企业公司的主要项目应用程序 IT公司的任务
  • usart串口发送与接收问题

    项目场景 xff1a 串口通信可以说很常用的一种通信方式 xff0c 例如 蓝牙通信 openmv 与串口 通信 等等 问题描述 1 我们在进行数据传输过程中数据不时出现丢失的情况 xff0c 偶尔会丢失一部分数据 xff0c 导致数据部分
  • 基于51单片机光照强度检测系统

    介绍 本设计采用单片机作为数据处理与控制单元 xff0c 为了进行数据处理 xff0c 通过光敏电阻来感应光强弱变化 xff0c 经过ADC0804转换 xff0c 直接将数字信号送入到单片机中进行数据处理 单片机数据处理之后 xff0c
  • 基于51单片机控制的波形输出

    介绍 本模块采用PCF8591 xff0c 它是一款AD DA集成芯片 所以本节对iic通信协议不做过多的介绍 xff0c 重心放在iic的rtl建模 xff0c 本次通过iic控制PCF8591实现DAC输出功能 及输出波形 将数字量转为
  • 基于51单片机通过译码器控制系统

    用二极管 开关 译码器 单片机 数码管 xff08 点阵显示器 xff09 等器件设计仿真电路 xff0c 实现的功能 xff0c 用红黄绿二极管分别连接开关作为3 8译码器的输入 xff0c 译码器的输出连接到单片机的端口 xff0c 单
  • 基于51单片机串口通信的实验

    串口介绍 串口是一种应用十分广泛的通讯接口 xff0c 串口成本低 容易使用 通信线路简单 xff0c 可实现两个设备的互相通信 单片机的串口可以使单片机与单片机 单片机与电脑 单片机与各式各样的模块互相通信 xff0c 极大的扩展了单片机
  • 【QT】设置子窗口显示位置

    QT通过setGeoment来设置子窗口的位置 QWidget span class token operator span widget test span class token operator 61 span new span cl
  • 【散文诗】C语言的本质(基于ARM深入分析C程序)

    文章目录 1 ARM架构ARM通用寄存器及其别名基本汇编指令LDR xff1a STR xff1a ADD xff1a SUB xff1a BL xff1a PUSH xff1a POP xff1a MOV xff1a 2 局部变量的分配与
  • 【MQTT基础篇(三)】连接MQTT服务端

    文章目录 连接MQTT服务端1 CONNECT 连接服务端1 1 clientId 客户端ID1 2 cleanSession 清除会话1 3 keepAlive 心跳时间间隔 2 CONNACK 确认连接请求2 1 returnCode
  • 【MQTT基础篇(五)】发布、订阅和取消订阅

    文章目录 发布 订阅和取消订阅1 PUBLISH 发布消息1 1 topicName 主题名1 2 QoS 服务质量等级1 3 packetId 报文标识符1 4 retainFlag 保留标志1 5 Payload 有效载荷1 6 dup
  • 【FreeRTOS(六)】队列

    文章目录 队列创建队列 xQueueCreate发送消息至队列 xQueueSend接受队列消息 xQueueReceive获取队列信息数目 uxQueueMessagesWaiting代码示例创建队列集 xQueueCreateSet将队

随机推荐

  • 2021-09-29 使用安卓手机Camera和IMU信息运行ORBSLAM3

    目的 安卓手机具备camera imu gps等SLAM技术所需要的传感器 xff0c 且安卓手机很普及 如果能使用安卓设备作为ros的sensor xff0c 通过安卓设备节点传输到计算机 xff0c 进行实时定位与建图分析 xff0c
  • 【ESP32 WiFi篇(五)】ESP32 HTTP

    文章目录 1 HTTP概述1 1 超文本1 2 请求 响应1 3 TCP 2 HTTP请求和响应2 1 HTTP请求响应过程2 2 客户端请求消息2 2 1 请求行2 2 1 1 请求方法2 2 1 2 URL2 2 1 3 HTTP版本
  • 【Linux 裸机篇(五)】I.MX6ULL BSP工程管理下的 Makefile编写、链接脚本

    目录 一 BSP 工程二 Makefile三 链接脚本 Makefile 的静态模式和函数1 静态模式2 函数2 1 patsubst2 2 dir2 3 notdir2 4 foreach 一 BSP 工程 文件夹描述bsp存放驱动文件i
  • 【Linux 裸机篇(六)】I.MX6U 主频和时钟配置

    目录 一 时钟系统详解1 系统时钟来源2 7路 PLL 时钟源2 1 ARM PLL PLL1 2 2 528 PLL PLL2 2 3 USB1 PLL PLL3 2 4 USB2 PLL PLL7 2 5 ENET PLL PLL6 2
  • 【Linux 裸机篇(七)】I.MX6U 中断系统

    目录 一 中断向量表1 中断向量偏移 二 中断系统简介1 创建中断向量表 三 GIC 控制器简介1 中断 ID 四 GIC 逻辑分块1 Distributor 分发器端 2 CPU Interface CPU 接口端 五 CP15 协处理器
  • 【Linux 裸机篇(八)】I.MX6U EPIT 定时器中断、定时器按键消抖

    目录 一 EPIT 定时器简介二 定时器按键消抖 一 EPIT 定时器简介 EPIT 的全称是 xff1a Enhanced Periodic Interrupt Timer xff0c 直译过来就是增强的周期中断定时器 xff0c 它主要
  • PCB拼板和工艺边教程

    PCB拼板 xff0c 主要是为了充分利用板材 xff0c 从而提高生产效率 比较简单的是 xff0c 规则板框的拼板 如上图的 xff0c 板框是正方形 xff0c 很容易就拼了四块板 xff0c 其中 xff0c 只需要有一块板有布线
  • curl命令模拟get请求时遇到特殊字符{}被过滤异常处理

    curl命令模拟get请求时遇到特殊字符 xff0c 接口接受参数不符合预期 crul请求 curl GET http test com opdgApply pageNum 61 1 amp sortDesc 61 true amp sea
  • 函数声明在头文件中的好处,可以利用静态库隐藏算法

    背景 xff1a 现在有个程序员A想实现一个算法 xff0c 这个算法是俩数之和 xff0c 他自己不会于是他去买程序员B的已经做好的算法 xff0c 但是程序员B不想让他看到算法结构应该怎么做 1 首先程序员B需要写程序 xff0c 包括
  • Javaparser使用

    Javaparser使用 什么是Javaparser 分析 转换 生成Java代码 Javaparser库为你提供了一个 Java 代码的抽象语法树 Abstract Syntax Tree AST 结构允许您以一种简单的编程方式使用 Ja
  • YUV和RGB图像格式说明

    对于进行图像处理的程序员来说 xff0c 图像格式是必须了解的问题 本文不涉及压缩图像格式 xff0c 只对YUV和RGB图像进行描述 1 RGB图像和YUV图像区别 RGB和YUV图像的区别在于色彩空间坐标系描述上不同 xff0c 就如同
  • CMake 常用指令

    文章目录 范式环境 amp 工程配置 96 cmake minimum required 96 96 project 96 96 file 96 添加头文件搜索路径 96 link directories 96 96 add compile
  • (JAVA)国际跳棋--棋里乾坤

    导入 因为假期内被朋友带入坑后起了兴趣 xff0c 但发现网上似乎没有什么人写过国际跳棋的相关制作过程 xff0c 于是制作了一个单纯的java的国际跳棋程序 xff0c 虽然没有AI xff0c 但能够实现玩家双方的任务和皮肤 目前只设置
  • 力扣刷题日记 211. 添加与搜索单词

    211 添加与搜索单词 题目描述题解思路代码结语 题目描述 题解思路 首先 xff0c 这道题要求我们给出所有结果 xff0c 那就意味着我们可能只能选择枚举这一条路 xff0c 然后再看到数据范围 xff0c 好家 伙 xff0c 确实挺
  • 力扣刷题日记 798. 得分最高的最小轮调

    798 得分最高的最小轮调 题目描述题解思路代码结语 题目描述 题解思路 数据范围没有截图到 xff0c 这里的数据范围为0 20000 题目的内容还是很好理解的 xff0c 就是给你一个数组 xff0c 你可以将数组内容向左推移若干次 x
  • Java实现简单的计算器

    文章目录 前言一 主界面部分二 监听器部分三 结果计算部分总结 前言 最近在复习着Java Swing的使用 xff0c 在布局这块反复又看了很久 xff0c 然后突然发现GirdLayout机器适合来做一个计算器的简单样子 xff0c 所
  • 多旋翼飞行器设计与控制(一)

    一 基本概念固定翼直升机多旋翼复合飞行器 二 操控和评价四旋翼操控对比评价局限性 三 发展历史休眠期 xff08 1990前 xff09 复苏期 xff08 1990 2005 xff09 产品方面学术方面 发展期 xff08 2005 2
  • 考试中暴露的问题

    1 注意位运算 可以去看看洛谷里如果城堡不用位运算处理的话会怎样233 2 注意数学函数 xff0c 如sqrt为开根号 xff0c abs为绝对值 xff1b 3 最长上升子序列upper bound与lower bound的用法要知道
  • 10月28日考试解题报告

    考试中的心路历程 说实话第一道题和第三道题真的是水题 xff0c 然鹅我只搞到了100分 xff0c 感觉有些亏 xff0c 最后一题看错了题目 xff0c 导致我的思路开始各种螺旋 xff0c 当其他人都为第二题思考的时候 xff0c 我
  • 10月30日解题报告

    做题思路 第一题表示根本没有想到是线段树这种东西 xff0c 结果看到题解的时候 内心是崩溃的 xff0c 看了线段树还是得多练练 xff0c 第二题是dp xff0c 算是简单 xff0c 但是自己没有想到还是很伤 xff0c 也还是要多