力扣301周赛C~DABC299 D、E、G

news2025/2/11 9:36:47

第 301 场周赛

C:

 

思路:

经典双指针问题,用i表示字符串start当前枚举到的位置,用j表示字符串target当前枚举到的位置:

  1. i从当前位置向后跑,跑到start串下标i之后的第一个不为'_'的位置

  2. j从当前位置向后跑,跑到target串下标j之后的第一个不为'_'的位置

  3. 判断start[i]与target[j]是否相同,如果不同,指定是无解了。

  4. 如果当前start[i]=='L'时,应该是i>=j,如果是'R'则应该是i<=j,否则无解。

  5. 检查i<n and j<n,如果满足,返回步骤1,重复执行操作,否则进行步骤6

  6. 如果i<n-1,检查start,同理检查target字符串,之后的字符应全是'_'

    代码:

    class Solution:
        def canChange(self, start: str, target: str) -> bool:
            n=len(start)
            i=j=0
            while i<n and j<n:
                while i<n and start[i]=='_':
                    i+=1
                while j<n and target[j]=='_':
                    j+=1
                if i<n and j<n:
                    if start[i]!=target[j]:
                        return False
                    c=start[i]
                    if c=='L' and i<j or c=='R' and i>j:
                        return False
                    i+=1
                    j+=1
            while i<n:
                if start[i]!='_':
                    return False
                i+=1
            while j<n:
                if target[j]!='_':
                    return False
                j+=1
            return True

D:

 

思路:

不会,参考题解

数学 & 递推,附复杂度与 n 无关(klogk)的做法:

2338. 统计理想数组的数目 - 力扣(LeetCode)

代码

class Solution {
    const int MOD=1e9+7;
    const int MAXP=16;
​
public:
​
    int idealArrays(int n, int K) {
        //nlnn求因数
        vector<vector<int>>fac(K+1);
        for(int i=1;i<=K;i++){
            for(int j=i<<1;j<=K;j+=i){
                fac[j].push_back(i);
            }
        }
​
        //计算子问题答案,f[i][j]表示以i为结束元素,长度为j的方案个数,长度为j的序列元素两两不同
        vector<vector<long long>>f;
        f.resize(K+1,vector<long long>(20));
        for(int i=1;i<=K;i++){
            f[i][1]=1;
            for(int j=2;j<=MAXP;j++){
                for(int t:fac[i]){
                    f[i][j]=(f[i][j]+f[t][j-1])%MOD;
                }
            }
        }    
​
        //求组合数
        vector<vector<long long>>C;
        C.resize(n+1,vector<long long>(20));
​
        C[0][0]=C[1][0]=C[1][1]=1;
        for(int i=2;i<=n;i++){
            C[i][0]=1;
            for(int j=1;j<=i&&j<=MAXP;j++){
                C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
            }
        }
​
        //统计最终答案
​
        long long ans=0;
        for(int i=1;i<=K;i++){//终点
            for(int j=1;j<=MAXP;j++){//选几个数
                ans=(ans+C[n-1][j-1]*f[i][j])%MOD;
                //最终元素为i,从n个元素里面选取长度为j的不重复元素,将这j个不重复元素确定好位置,这个长度为n
                //的序列就确定了,那么第一个最小的元素肯定在位置1,那剩下来的n-1个位置,放置j-1个数就行了
                //因为最终元素为i,长度为j的序列中元素两两不同的方案书为f[i][j],选取的位置有C[n-1][j-1]
                //所以乘法原理即可
            }
        }
        return ans;
    }
};

ABC299

D - Find by Query

题目大意:

 

 

思路:

看到最多询问20次,长度为2e5,首先想到的应该是二分,怎么二分呢?

注意到S[1]='0',S[N]='1',那么每次查询中间的位置,如果query(l+r>>1)=='0',那就令l=l+r>>1,否则r=l+r>>1

,这样就能时刻保证S[l]='0',S[r]='1'

代码:

#include <bits/stdc++.h>
​
using namespace std;
​
int main()
{
    int n;
    cin >> n;
    int l = 1, r = n;
    int cnt = 20;
    while (cnt > 0)
    {
        cnt--;
        int mid = l + r >> 1;
        cout << "? " << mid << endl;
        char x;
        cin >> x;
        if (l + 1 == mid && x == '1')
        {
            cout << "! " << l << endl;
            return 0;
        }
        if (mid + 1 == r && x == '0')
        {
            cout << "! " << mid << endl;
            return 0;
        }
        if (x == '0')
        {
            l = mid;
        }
        else
        {
            r = mid;
        }
    }
    return 0;
}

E - Nearest Black Vertex

题目大意:

 

思路:

  1. 首先建图,然后跑最短路,堆优化迪杰斯特拉的时间复杂度为O(M*log(N)),但是这个题边权全为1,就不需要堆优化了,普通队列即可,所以求以每一个点s(1<=s<=n)为起点到其他点的最短路径的时间复杂度为O(NM)

  2. 读入k个限制,u,d,遍历以u为起点,到其他点(下面用v表示)的最短路径,如果

    dist[ u ][ v ] < d

    ,则这个点不可能是黑色点,标记

  3. 全部标记完之后,再次遍历k个限制,遍历每个限制是否有解即可

    即寻找dist[u][v]==d,是否有点满足,并且这个点v没有被标记为不能做为黑色点

    代码:代码写的与思路有一点不一样,我的代码在读入限制的时候就判断他有没有可行点解了,就是

dist[u][v]==d是否存在,如果已经找到一个点不满足就不接着做了,直接输出No即可,现在看来有点鸡肋了,即使这样做,等k个限制跑完之后,仍然需要再次跑k个限制看看是否满足条件,因为假如你
u1,找到某个唯一可以当作黑色点的v1,此时这个v1还没有被标记为不能当作黑点
接下来限制u2 d的时候,把v1标记做了不能当作黑点,只遍历一遍是不行的也就是说如果说只有这两个限制,只跑一边会输出Yes,然后输出可行解,但实际是No,因为u1的唯一可以当作黑点的v1被u2 hcak掉了
#include <bits/stdc++.h>
using namespace std;
​
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define PII pair<int, int>
#define de(a) cout << #a << " = " << a << "\n";
#define deg(a) cout << #a << " = " << a << " ";
#define endl "\n"
#define int long long
#define LL long long
const int mod = 1e9 + 7;
const int N = 1e6 + 5;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
​
vector<int> edge[N];
int dist[2005][2005];
int n, m;
void dijkstra(int s)
{
    vector<int> vis(n + 1, 0);
    dist[s][s] = 0;
    queue<int> q;
    q.push(s);
    while (q.size())
    {
        int t = q.front();
        q.pop();
        if (vis[t])
            continue;
        vis[t] = true;
        for (auto v : edge[t])
        {
            if (dist[s][v] > dist[s][t] + 1)
            {
                dist[s][v] = dist[s][t] + 1;
                q.push(v);
            }
        }
    }
}
​
void solve()
{
​
    cin >> n >> m;
    for (int i = 0; i <= n + 1; i++)
    {
        for (int j = 0; j <= n + 1; j++)
        {
            dist[i][j] = INT64_MAX;
        }
    }
    for (int i = 0; i < m; i++)
    {
        int u, v;
        cin >> u >> v;
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
    for (int i = 1; i <= n; i++)
    {
        dijkstra(i);
    }
    int k;
    vector<int> st(n + 1, 1);
    cin >> k;
    vector<PII> query;
    bool ok = true;
    for (int i = 0; i < k; i++)
    {
        int u, d;
        cin >> u >> d;
        query.emplace_back(u, d);
        bool f = 0;
        for (int v = 1; v <= n; v++)
        {
            if (dist[u][v] < d)
            {
                st[v] = 0; // 不能为黑色
            }
            else if (dist[u][v] == d && st[v] == 1) // 找到合法黑色点了
            {
                f = 1;
            }
        }
        if (!f) // 这个点u没有合法点当u
            ok = 0;
    }
​
    for (int i = 0; i < k; i++)
    {
        auto [u, d] = query.back();
        query.pop_back();
        bool f = 0;
        for (int v = 1; v <= n; v++)
        {
            if (dist[u][v] < d)
            {
                st[v] = 0; // 不能为黑色
            }
            else if (dist[u][v] == d && st[v] == 1) // 找到合法黑色点了
            {
                f = 1;
            }
        }
        if (!f) // 这个点u没有合法点当u
            ok = 0;
    }
​
    if (ok)
    {
        cout << "Yes\n";
        for (int i = 1; i <= n; i++)
        {
            cout << st[i];
        }
    }
    else
    {
        cout << "No\n";
    }
}
​
signed main()
{
    FAST;
    int t = 1;
    // cin >> t;
    while (t--)
        solve();
​
    return 0;
}

G - Minimum Permutation

题目:

有一个长度为 N 的序列,保证其中包含1~M,请你找到一个长M的子序列,使得其中每个数字都出现了一次,并使得排列的字典序最小。

思路:

贪心。考虑单调栈(定义s[i]表示栈中第i个元素是什么,tt表示现在的栈顶元素所在的位置),顺序枚举这个长度为N的序列。

假如我们现在处理第i个元素,那么前i-1个元素已经处理好了,对于第i个元素a[i],

  • 如果a[i]在栈里,直接跳过就行了

  • a[i]>s[tt](栈顶),直接加到栈里面就可以了

  • a[i]<s[tt](栈顶),判断当前栈顶所在元素在 [i +1~n]在后面是否出现过,如果出现过,可以放心的把栈顶去掉了,循环次操作,然后将a[i]加入栈顶就可以了。这样一定是正确的,因为我们去掉栈顶的条件是栈顶小于当前元素(保证字典序更小),后面出现过当前栈顶(保证后面可以把这个删去的栈顶加进来)

    #include <bits/stdc++.h>
    using namespace std;
    ​
    #define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
    #define PII pair<int, int>
    #define de(a) cout << #a << " = " << a << "\n";
    #define deg(a) cout << #a << " = " << a << " ";
    #define endl "\n"
    #define int long long
    #define LL long long
    const int mod = 1e9 + 7;
    const int N = 1e6 + 5;
    int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
    ​
    int n, m, a[N], s[N], tt, d[N];
    bool st[N];
    ​
    void solve()
    {
        int n, m;
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
        {
            cin >> a[i];
            d[a[i]]++;
        }
        for (int i = 1; i <= n; i++)
        {
            d[a[i]]--; // 这个数字出现过了一次
            if (st[a[i]])
                continue;
            while (s[tt] > a[i] && d[s[tt]]) // 栈顶大于当前元素,并且栈顶的元素在后面还有
                st[s[tt]] = 0, tt--;
            s[++tt] = a[i];
            st[a[i]] = 1;
        }
        for (int i = 1; i <= m; i++)
        {
            cout << s[i] << ' ';
        }
    }
    ​
    signed main()
    {
        FAST;
        int t = 1;
        // cin >> t;
        while (t--)
            solve();
    ​
        return 0;
    }

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

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

相关文章

C语言属刷题训练【第八天】

文章目录 &#x1fa97;1、如下程序的运行结果是&#xff08; &#xff09;&#x1f4bb;2、若有定义&#xff1a; int a[2][3]; &#xff0c;以下选项中对 a 数组元素正确引用的是&#xff08; &#xff09;&#x1f9ff;3、在下面的字符数组定义中&#xff0c;哪一个有语法错…

JavaScript、TypeScript、ES5、ES6之间的联系和区别

ECMAScript&#xff1a; 一个由 ECMA International 进行标准化&#xff0c;TC39 委员会进行监督的语言。通常用于指代标准本身。JavaScript&#xff1a; ECMAScript 标准的各种实现的最常用称呼。这个术语并不局限于某个特定版本的 ECMAScript 规范&#xff0c;并且可能被用于…

k8s RBAC授权普通系统用户对namespace访问权限

背景&#xff1a;最近遇到一个问题&#xff0c;那就是需要给别人共享一下 Kubernetes 的某个资源的使用和访问权限&#xff0c;这个仅仅存在于某个 namespace 下&#xff0c;但是我又不能把管理员权限全都给它&#xff0c;我想只给他授予这一个 Namespace 下的权限&#xff0c;…

【C++】红黑树模拟实现插入功能(包含旋转和变色)

红黑树模拟实现并封装为map和set 前言正式开始红黑树概念红黑树基本要求大致框架树节点树 调整红黑树使其平衡第一种&#xff1a;cur红&#xff0c;p红&#xff0c;g黑&#xff0c;u存在且为红第二种&#xff1a;cur红&#xff0c;p红&#xff0c;g黑&#xff0c;u不存在或为黑…

selenium.webdriver Python爬虫教程

文章目录 selenium安装和使用 selenium安装和使用 pip install selenium 下载对应的浏览器驱动 实例化浏览器 from selenium import webdriverbrowser webdriver.Chrome()元素定位 控制浏览器

echart图案例

效果 代码&#xff1a; index.vue <template><div class"pageBox"><div class"oneLineBox"><div class"fourColorImgBox"><div class"titleBox">企业风险四色图</div><div class"conte…

蝉妈妈:2023年抖音电商半年报(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 平台流量竞争从愈发激烈变为趋于愈加缓和商家直攝总时长与观众君播总时长的总体趋势并没有愈加激烈&#xff0c;从23年上半年各自流量的同比增速来看&#xff0c;观众看摄总时长增速高于商家直攝总时…

AD域机器KMS自动激活

1、打开AD域控&#xff0c;点击DNS管理 2、创建其它记录 3、选择服务位置 SRV 4、输入相关信息 服务&#xff1a;_VLMCS协议&#xff1a;_TCP权重&#xff1a;100端口号&#xff1a;1688KMS服务器地址&#xff1a;10.3.0.211 5、成功&#xff0c;这时域内主机重启后&#xff0…

全自动猫砂盆市场调查:2022年全球全自动猫砂盆市场销售额达到了2.31亿美元

全自动猫砂盆是一种使用先进技术来自动清洁的猫砂盆。这些猫砂盆通常有传感器或计时器&#xff0c;可以检测到猫何时使用了猫砂盆并启动清洁程序。一些型号的猫砂盆还加入了自清洁机制&#xff0c;通过耙子或筛子来清除猫砂的结块和碎片。 全自动猫砂盆的设计旨在减少维护猫砂…

vue3+antv x6自定义节点样式

先大致定下节点样式&#xff0c;需要展示标题&#xff0c;输入/输出连接桩&#xff0c; 参考样子大概是 https://x6.antv.antgroup.com/examples/showcase/practices#class 这是根据antv x6配置 非自定义节点 图表案例 结果 数据格式大概是 nodes:[{title:鸟,id:node1,ports…

逐步分解,一文教会你如何用 jenkins+docker 实现主从模式

♥ 前 言 jenkins 主从模式想必大家都不陌生&#xff0c;大家在学习过程中为了学习方便都在自己本地搭建了 jenkins 环境&#xff0c;然后通过 javaweb 方式实现&#xff0c;对于 docker 下实现主从模式大家好像兴趣挺大。今天就通过这篇文章给大家讲讲怎么玩&#xff0c;希…

【JavaEE进阶】Bean 作用域和生命周期

文章目录 一. 关于Bean作用域的实例1. lombok2. 实例代码 二. 作用域定义1. Bean的六种作用域2. 设置作用域 三. Spring 执行流程和 Bean 的生命周期1. Spring 执行流程2. Bean生命周期 一. 关于Bean作用域的实例 注意在此例子中需要用到lombok 1. lombok lombok是什么? Lo…

android ndk clang交叉编译ffmpeg动态库踩坑

1.ffmpeg默认使用gcc编译&#xff0c;在android上无法使用&#xff0c;否则各种报错&#xff0c;所以要用ndk的clang编译 2.下载ffmpeg源码 修改configure文件&#xff0c;增加命令 cross_prefix_clang 修改以下命令 cc_default"${cross_prefix}${cc_default}" cxx…

Jmeter请求接口返回值乱码解决

乱码示例 解决步骤&#xff1a; 1.打开Jmeter安装目录下的bin目录&#xff0c;找到jmeter.properties 2.使用记事本或其他编译工具打开jmeter.properties文件&#xff0c;然后全局搜索sampleresult.default.encoding 3.在文件中添加sampleresult.default.encodingutf-8,保存…

C++入门篇7---string类

所谓的string类&#xff0c;其实就是我们所说的字符串&#xff0c;本质和c语言中的字符串数组一样&#xff0c;但是为了更符合C面向对象的特性&#xff0c;特地将它写成了一个单独的类&#xff0c;方便我们的使用 对其定义有兴趣的可以去看string类的文档介绍&#xff0c;这里…

【在树莓派上安装cpolar内网穿透实战】

文章目录 前言1.在树莓派上安装cpolar2.查询cpolar版本号3.激活本地cpolar客户端4.cpolar记入配置文件 前言 树莓派作为一个超小型的电脑系统&#xff0c;虽然因其自身性能所限&#xff0c;无法如台式机或笔记本等准系统一样&#xff0c;运行大型软件或程序&#xff08;指望用…

ecology-自定义浏览按钮实现多处引用可定制不同查询条件。

1.新建ecode代码&#xff0c;前置加载&#xff0c;代码内容&#xff1a; ecodeSDK.overwritePropsFnQueueMapSet(WeaBrowser,{ //组件名fn:(newProps)>{ //newProps代表组件参数 if(newProps.type162 || newProps.type161){//console.log("自定义浏览框");if(!ne…

日常BUG——使用Long类型作id,后端返回给前段后精度丢失问题

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 数据库long类型Id: 前端返回的Id实体类: Data ApiModel("xxx") public class …

数据结构顺序表

今天主要讲解顺序表&#xff0c;实现顺序表的尾插&#xff0c;头插&#xff0c;头删&#xff0c;还有尾删等操作&#xff0c;和我们之前写的通讯录的增删查改有类似的功能。接下来让我们开始我们的学习吧。 1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特…

保证接口数据安全的10种方式

我们日常开发中&#xff0c;如何保证接口数据的安全性呢&#xff1f;个人觉得&#xff0c;接口数据安全的保证过程&#xff0c;主要体现在这几个方面&#xff1a;一个就是数据传输过程中的安全&#xff0c;还有就是数据到达服务端&#xff0c;如何识别数据&#xff0c;最后一点…