AtCoder Beginner Contest 217
维护一个空序列 A ,有 Q 次查询:
- 在 A 的最后插入一个元素一个元素 x
- 输出 A 的第一个元素并删除这个元素
- 将这个序列排序
用 deque 和 multiset 维护,复杂度应该是$O(\space log(\space n \space)\space)$的
虽然操作三要把deque全部元素丢到multiset里, 但是最多只是两倍常数而已
#include<bits/stdc++.h> using namespace std; #define endl "\n" typedef long long ll; //复杂度应该是O(log(n))的,虽然操作三要把deque全部元素丢到multiset里 //但是最多只是两倍常数而已 int main(){ ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T = 1; cin >> T; multiset<int> s; deque<int> q; while(T--){ int op; cin >> op; if(op == 1){ int x; cin >> x; q.push_back(x); }else if(op == 2){ if((int)s.size()){ cout << *s.begin() << endl; s.erase(s.begin()); }else{ cout << q.front() << endl; q.pop_front(); } }else{ while((int)q.size()){ s.insert(q.front()); q.pop_front(); } } } return 0; }
对于$\forall k \in [1,n]$,求出把 [1,n] 中的 n 个整数分为非空的 k 组, 每组任意两个数模 m 不同余的方案数。
两个方案不同,当且仅当存在两个数,一种方案中它们在同一组, 但在另一种方案中,它们不同组。
对 998244353 取模。
$2 \le M \le N \le 5000$