变量
void _debug(ostream& os) { os << '\n'; }
template<typename T, typename... Args> void _debug(ostream& os, const T& t, const Args&... args) {
os << t;
if (sizeof...(args)) {
os << ", ";
}
_debug(os, args...);
}
#define debug(args...) cerr << #args << " = ", _debug(cout, ##args)
数组
template<typename T> void outArray(T a[], int l, int r) {
cout << '[';
for (int i = l; i <= r; ++i) {
cout << a[i];
if (i != r) {
cout << ", ";
}
}
cout << "]\n";
}
pair
template<typename A, typename B> ostream& operator <<(ostream& os, const pair<A, B>& M) {
os << '<' << M.first << ", " << M.second << '>';
return os;
}
vector
template<typename T> ostream& operator <<(ostream& os, const vector<T>& V) {
os << '[';
for (int i = 0; i < V.size(); ++i) {
os << V[i];
if (i + 1 != V.size()) {
os << ", ";
}
}
os << ']';
return os;
}
map
template<typename A, typename B> ostream& operator <<(ostream& os, const map<A, B>& M) {
os << '[';
for (auto it = M.begin(); it != M.end(); ++it) {
os << '(' << it -> first << ": " << it -> second << ')';
if (++it != M.end()) {
os << ", ";
}
--it;
}
os << ']';
return os;
}
unordered_map
template<typename A, typename B> ostream& operator <<(ostream& os, const unordered_map<A, B>& M) {
os << '[';
for (auto it = M.begin(); it != M.end(); ++it) {
os << '(' << it -> first << ": " << it -> second << ')';
if (++it != M.end()) {
os << ", ";
}
--it;
}
os << ']';
return os;
}
set
template<typename T> ostream& operator <<(ostream& os, const set<T>& S) {
os << '{';
for (auto it = S.begin(); it != S.end(); ++it) {
os << *it;
if (++it != S.end()) {
os << ", ";
}
--it;
}
os << '}';
return os;
}
unordered_set
template<typename T> ostream& operator <<(ostream& os, const unordered_set<T>& S) {
os << '{';
for (auto it = S.begin(); it != S.end(); ++it) {
os << *it;
if (++it != S.end()) {
os << ", ";
}
--it;
}
os << '}';
return os;
}
multiset
template<typename T> ostream& operator <<(ostream& os, const multiset<T>& S) {
os << '{';
for (auto it = S.begin(); it != S.end(); ++it) {
os << *it;
if (++it != S.end()) {
os << ", ";
}
--it;
}
os << '}';
return os;
}
stack
template<typename T> ostream& operator <<(ostream& os, stack<T> S) {
os << '[';
while (!S.empty()) {
os << S.top();
S.pop();
if (!S.empty()) {
os << ", ";
}
}
os << ']';
return os;
}
queue
template<typename T> ostream& operator <<(ostream& os, queue<T> Q) {
os << '[';
while (!Q.empty()) {
os << Q.front();
Q.pop();
if (!Q.empty()) {
os << ", ";
}
}
os << ']';
return os;
}
priority_queue
template<typename T> ostream& operator <<(ostream& os, priority_queue<T> Q) {
os << '[';
while (!Q.empty()) {
os << Q.top();
Q.pop();
if (!Q.empty()) {
os << ", ";
}
}
os << ']';
return os;
}
template<typename T> ostream& operator <<(ostream& os, priority_queue<T, vector<T>, greater<T>> Q) {
os << '[';
while (!Q.empty()) {
os << Q.top();
Q.pop();
if (!Q.empty()) {
os << ", ";
}
}
os << ']';
return os;
}
deque
template<typename T> ostream& operator <<(ostream& os, deque<T> Q) {
os << '[';
while (!Q.empty()) {
os << Q.front();
Q.pop_front();
if (!Q.empty()) {
os << ", ";
}
}
os << ']';
return os;
}
all
template<typename A, typename B> ostream& operator <<(ostream& os, const pair<A, B>& M) {
os << '<' << M.first << ", " << M.second << '>';
return os;
}
template<typename T> ostream& operator <<(ostream& os, const vector<T>& V) {
os << '[';
for (int i = 0; i < V.size(); ++i) {
os << V[i];
if (i + 1 != V.size()) {
os << ", ";
}
}
os << ']';
return os;
}
template<typename A, typename B> ostream& operator <<(ostream& os, const map<A, B>& M) {
os << '[';
for (auto it = M.begin(); it != M.end(); ++it) {
os << '(' << it -> first << ": " << it -> second << ')';
if (++it != M.end()) {
os << ", ";
}
--it;
}
os << ']';
return os;
}
template<typename A, typename B> ostream& operator <<(ostream& os, const unordered_map<A, B>& M) {
os << '[';
for (auto it = M.begin(); it != M.end(); ++it) {
os << '(' << it -> first << ": " << it -> second << ')';
if (++it != M.end()) {
os << ", ";
}
--it;
}
os << ']';
return os;
}
template<typename T> ostream& operator <<(ostream& os, const set<T>& S) {
os << '{';
for (auto it = S.begin(); it != S.end(); ++it) {
os << *it;
if (++it != S.end()) {
os << ", ";
}
--it;
}
os << '}';
return os;
}
template<typename T> ostream& operator <<(ostream& os, const unordered_set<T>& S) {
os << '{';
for (auto it = S.begin(); it != S.end(); ++it) {
os << *it;
if (++it != S.end()) {
os << ", ";
}
--it;
}
os << '}';
return os;
}
template<typename T> ostream& operator <<(ostream& os, const multiset<T>& S) {
os << '{';
for (auto it = S.begin(); it != S.end(); ++it) {
os << *it;
if (++it != S.end()) {
os << ", ";
}
--it;
}
os << '}';
return os;
}
template<typename T> ostream& operator <<(ostream& os, stack<T>& S) {
os << '[';
while (!S.empty()) {
os << S.top();
S.pop();
if (!S.empty()) {
os << ", ";
}
}
os << ']';
return os;
}
template<typename T> ostream& operator <<(ostream& os, queue<T> Q) {
os << '[';
while (!Q.empty()) {
os << Q.front();
Q.pop();
if (!Q.empty()) {
os << ", ";
}
}
os << ']';
return os;
}
template<typename T> ostream& operator <<(ostream& os, priority_queue<T> Q) {
os << '[';
while (!Q.empty()) {
os << Q.top();
Q.pop();
if (!Q.empty()) {
os << ", ";
}
}
os << ']';
return os;
}
template<typename T> ostream& operator <<(ostream& os, priority_queue<T, vector<T>, greater<T>> Q) {
os << '[';
while (!Q.empty()) {
os << Q.top();
Q.pop();
if (!Q.empty()) {
os << ", ";
}
}
os << ']';
return os;
}
template<typename T> ostream& operator <<(ostream& os, deque<T> Q) {
os << '[';
while (!Q.empty()) {
os << Q.front();
Q.pop_front();
if (!Q.empty()) {
os << ", ";
}
}
os << ']';
return os;
}
template<typename T> void outArray(T a[], int l, int r) {
cout << '[';
for (int i = l; i <= r; ++i) {
cout << a[i];
if (i != r) {
cout << ", ";
}
}
cout << "]\n";
}
void _debug(ostream& os) { os << '\n'; }
template<typename T, typename... Args> void _debug(ostream& os, const T& t, const Args&... args) {
os << t;
if (sizeof...(args)) {
os << ", ";
}
_debug(os, args...);
}
#define debug(args...) cerr << #args << " = ", _debug(cout, ##args)