题目描述
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) //a在中间,b还未排
sort(s.begin()+lb-1,s.begin()+b);
else if(a<la and b<=lb and b>la) //a还未排,b在中间
sort(s.begin()+a-1,s.begin()+la);
else //其它情况
sort(s.begin()+a-1,s.begin()+b);
la=a;lb=b;
};cout << s << '\n';
}
1590

被折叠的 条评论
为什么被折叠?



