69,838
社区成员




各位大佬,下面这个题目,我试了好几次,程序能通过,但是总说超时。请各位大佬帮忙指点指点。
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串代表答案。
输入复制
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';
}
不是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;
}