01字串排序问题求教

aixbonbon 2024-09-28 20:24:47

各位大佬,下面这个题目,我试了好几次,程序能通过,但是总说超时。请各位大佬帮忙指点指点。

Zeratul给出了一个01串s1…ns1…n​。接下来Zeratul会给出mm次操作,第ii次操作会将[Li,Ri][Li​,Ri​]的区间从小到大排序。这些区间满足:对于所有的i>1i>1,有Li≥Li−1Li​≥Li−1​且Ri≥Ri−1Ri​≥Ri−1​。

你需要输出所有操作结束之后的结果。

输入描述

第一行包括两个整数n,mn,m,代表01串的长度和操作数。

第二行包括一个长度为nn的01串s1…ns1…n​。

接下来mm行,每行两个整数Li,RiLi​,Ri​,代表对区间[Li,Ri][Li​,Ri​]排序。

输出描述

一个长度为nn的01串代表答案。

样例1

输入复制

10 3 1111100000 2 6 4 7 7 10

输出

1010110001

 

以下是我的代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    cin.tie(nullptr);
    int m=0;
    scanf("%*d%d",&m);
    string s;cin >> s;
    int la=0,lb=0;
    while(m--)
    {
        int a=0,b=0;scanf("%d%d",&a,&b);
        if(a>=la and b<=lb) continue;
        else if(a<lb and a>la and b>lb) 
        sort(s.begin()+a-1,s.begin()+b);
        else if(a<la and b<=lb and b>la) 
        sort(s.begin()+a-1,s.begin()+b);
		else 
        sort(s.begin()+a-1,s.begin()+b);
        la=a;lb=b;
    };cout << s << '\n';
}

 

...全文
150 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

不是0就是1,直接计数就可以了,不要sort。

#include <iostream>
#include <string>

int main()
{
  int n, m, l, r;
  std::string s;

  std::cin >> n >> m >> s;
  for (int i = 0, j, k; i < m; i++)
  {
    std::cin >> l >> r;
    for (j = l - 1, k = 0; j < r; j++) s[j] == '0' ? k++ : 0;
    s.replace(l - 1, k, k, '0');
    s.replace(l + k - 1, r - l - k + 1, r - l - k + 1, '1');
  }
  std::cout << s << std::endl;

  return 0;
}

69,838

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧