链接:https://ac.nowcoder.com/acm/contest/56490/D 来源:牛客网 题目描述 给定序列 ( � 1 , � 2 . . . , � � ) = ( 1 , 2 , . . . , � ) , 即 � � = � (a 1 ,a 2 ...,a n )=(1,2,...,n),即a i =i 太湖学院的大黄对这个序列进行m次操作,每次可能是将 � 1 , � 2 . . . , � � a 1 ,a 2 ...,a q 降序排列,或者将 � � , � � + 1 . . . , � � a q ,a q+1 ...,a n 升序排列 请求出操作完成后的序列。 输入描述: 输入的第一行包含两个整数n, m,分别表示序列的长度和操作次数。 接下来的m行描述对序列的操作,其中第 i 行包含两个整数 � � , � � p i ,q i 表示操作类型和参数。当 � � = 0 p i =0时,表示将 � 1 , � 2 . . . , � � a 1 ,a 2 ...,a q 降序排列,当 � � = 1 p i =1时,表示将 � � , � � + 1 . . . , � � a q ,a q+1 ...,a n 升序排列。 输出描述: 输出一行,包含n个数,相邻的整数之间使用一个空格分隔,表示操作完成后的序列
时间: 2023-06-10 22:05:49 浏览: 215
好的,我明白了,你的问题是如何实现给定序列进行一系列操作后,输出最终的序列。这是一个简单的排序问题,可以使用快排、归并排序等算法来实现。具体实现方法可以参考以下代码:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int a[n];
for(int i=0;i<n;i++) a[i] = i+1; // 初始化序列
while(m--) {
int op, q;
cin >> op >> q;
if(op == 0) { // 降序排列
sort(a, a+q, greater<int>());
} else { // 升序排列
sort(a+q, a+n);
}
}
for(int i=0;i<n;i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
希望我的回答能够帮到你!
相关问题
链接:https://ac.nowcoder.com/acm/contest/61132/L 来源:牛客网 给定两个正整数n,m,再给定长度为n的正整数序列a, 保证n为奇数。接下来m行,每行两个正整数p, x。表示把a[p]修改为x。对于每次操作输出修改后的中位数。写个c++的代码
以下是使用C++编写的解答:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < m; i++) {
int p, x;
cin >> p >> x;
a[p] = x;
sort(a.begin(), a.end());
cout << a[n / 2] << endl;
}
return 0;
}
```
首先,我们读取输入的n和m,以及长度为n的正整数序列a。
然后,我们使用循环读取m行的操作。每次操作中,我们读取p和x,并将a[p]修改为x。接下来,我们对序列a进行排序,然后输出修改后的中位数a[n / 2]。
最后,我们返回0,表示程序顺利结束。
请注意,该代码假设输入是有效的,并且没有进行输入验证。如果需要对输入进行验证,请根据题目要求进行适当的修改。
链接:https://ac.nowcoder.com/acm/contest/61132/G 来源:牛客网 给定一个长度为n的01串,你需要选择一段任意长度(可以为0)的区间对其翻转,翻转后,求最长的一段连续的全是1的区间的长度。 输入描述: 输入共2行。 第一行一个整数n(1\leq n \leq 10^6)n(1≤n≤10 6 )。 第二行一个长度为n的01序列。 输出描述: 输出一个整数,表示最长的长度。 示例1 输入 复制 10 0111001011 输出 复制 5 说明 翻转区间[5,10],翻转为0111110100。
题目要求我们在一个长度为n的01串中选择一段任意长度的区间进行翻转,然后求翻转后最长的连续全为1的区间的长度。
我们可以使用一个变量count来记录当前连续全为1的区间的长度,使用一个变量maxCount来记录翻转后最长的连续全为1的区间的长度。
遍历整个01串,当遇到1时,count加1;当遇到0时,更新maxCount为count和maxCount的较大值,并将count重置为0。
最后返回maxCount即为所求的结果。
以下是示例代码实现:
```cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
string s;
cin >> n >> s;
int count = 0;
int maxCount = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '1') {
count++;
} else {
maxCount = max(count, maxCount);
count = 0;
}
}
maxCount = max(count, maxCount);
cout << maxCount << endl;
return 0;
}
```
希望能帮助到你!如果还有其他问题,请继续提问。
阅读全文