結果
問題 | No.230 Splarraay スプラレェーイ |
ユーザー | cutmdo |
提出日時 | 2019-03-12 23:05:38 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
CE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 7,477 bytes |
コンパイル時間 | 948 ms |
コンパイル使用メモリ | 114,708 KB |
最終ジャッジ日時 | 2024-11-14 21:18:33 |
合計ジャッジ時間 | 1,486 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
main.cpp:92:107: error: redefinition of default argument for 'typename std::enable_if<(! has_begin<T>::value), std::nullptr_t>::type <anonymous>' 92 | template<class Primitive, class... Tail, std::enable_if_t<!has_begin<Primitive>::value, std::nullptr_t> = nullptr>inline void print(std::list<std::string>& str, const Primitive& x, const Tail&... tail) { std::cout << *str.begin() << ":" << x << " "; if (sizeof...(tail) > 0) { std::cout << "\n"; str.pop_front(); print(str, tail...); } } | ^~~~~~~ main.cpp:88:155: note: original definition appeared here 88 | inline void print(std::list<std::string>& str); template<class Primitive, class... Tail, std::enable_if_t<!has_begin<Primitive>::value, std::nullptr_t> = nullptr>inline void print(std::list<std::string>& str, const Primitive& x, const Tail&... tail); template<class Container, class... Tail>inline auto print(std::list<std::string>& str, const Container& c, const Tail&... tail) -> decltype(c.begin()); template<class... Tail>inline void print(std::list<std::string>& str, const std::string& s, const Tail&... tail); | ^~~~~~~
ソースコード
#include <iostream> #include <iomanip> #include <string> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <map> #include <unordered_map> #include <unordered_set> #include <list> #include <stack> #include <queue> #include <bitset> #include <numeric> /* (=^o^=) */ #define int ll; // #define private public /* macro */ #define FOR(i, b, e) for(ll i = (ll)(b); i < (ll)(e); ++i) #define RFOR(i, b, e) for(ll i = (ll)(e-1); i >= (ll)(b); --i) #define REP(i, n) FOR(i, 0, n) #define RREP(i, n) RFOR(i, 0, n) #define REPC(x,c) for(const auto& x:(c)) #define REPI2(it,b,e) for(auto it = (b); it != (e); ++it) #define REPI(it,c) REPI2(it, (c).begin(), (c).end()) #define RREPI(it,c) REPI2(it, (c).rbegin(), (c).rend()) #define REPI_ERACE2(it, b, e) for(auto it = (b); it != (e);) #define REPI_ERACE(it, c) REPI_ERACE2(it, (c).begin(), (c).end()) #define ALL(x) (x).begin(),(x).end() #define cauto const auto& /* macro func */ #define SORT(x) do{sort(ALL(x));}while(false) #define RSORT(x) do{sort((x).rbegin(),(x).rend());}while(false) #define UNIQUE(v) do{v.erase( unique(v.begin(), v.end()), v.end() );}while(false) #define MAX(x,y) do{x = std::max(x,y);}while(false) #define MIN(x,y) do{x = std::min(x,y);}while(false) #define BR do{cout<<"\n";}while(false) #define dump(...) do{ auto __DUMP_NAME_LIST__ = split(#__VA_ARGS__,','); print(__DUMP_NAME_LIST__, __VA_ARGS__);BR;}while(false) /* type define */ using ll = long long; using PAIR = std::pair<ll, ll>; using VS = std::vector<std::string>; using VL = std::vector<long long>; using VVL = std::vector<VL>; using VVVL = std::vector<VVL>; using VD = std::vector<double>; /* using std */ using std::cout; constexpr char endl = '\n'; using std::cin; using std::sort; using std::pair; using std::string; using std::stack; using std::queue; using std::vector; using std::list; using std::map; using std::unordered_map; using std::multimap; using std::unordered_multimap; using std::set; using std::unordered_set; using std::unordered_multiset; using std::multiset; using std::bitset; using std::priority_queue; /* constant value */ constexpr ll MOD = 1000000007; //constexpr ll MOD = 998244353; /* Initial processing */ struct Preprocessing { Preprocessing() { std::cin.tie(0); std::ios::sync_with_stdio(0); }; }_Preprocessing; /* input output */ template<class T> std::istream& operator >> (std::istream& is, vector<T>& vec) { for (T& x : vec) is >> x; return is; } template<class S, class T>std::ostream& operator<<(std::ostream& os, const std::pair<S, T>& p) { os << "(" << p.first << ", " << p.second << ")"; return os; } /* for dump function */ inline std::list<std::string> split(std::string str, char del) { std::list<std::string> sList; string s = ""; for (const auto& c : str) { if (c == del) { sList.emplace_back(s); s = ""; } else { if (c != ' ' || del == ' ') { s += c; } } }sList.emplace_back(s); return sList; } template<class T>struct has_begin { private: template <class U> static auto check(U x) -> decltype(x.begin(), std::true_type{}); static std::false_type check(...); public: static bool const value = decltype(check(std::declval<T>()))::value; }; inline void print(std::list<std::string>& str); template<class Primitive, class... Tail, std::enable_if_t<!has_begin<Primitive>::value, std::nullptr_t> = nullptr>inline void print(std::list<std::string>& str, const Primitive& x, const Tail&... tail); template<class Container, class... Tail>inline auto print(std::list<std::string>& str, const Container& c, const Tail&... tail) -> decltype(c.begin()); template<class... Tail>inline void print(std::list<std::string>& str, const std::string& s, const Tail&... tail); template<class Container>inline auto printSingle(const Container& c) ->decltype(c.begin()) { for (const auto& x : c) { std::cout << x << " "; }std::cout << "\n"; return c.begin(); } template<class Primitive, std::enable_if_t<!has_begin<Primitive>::value, std::nullptr_t> = nullptr>inline void printSingle(const Primitive& x) { std::cout << x << " "; } inline void print(std::list<std::string>& str) {} template<class Primitive, class... Tail, std::enable_if_t<!has_begin<Primitive>::value, std::nullptr_t> = nullptr>inline void print(std::list<std::string>& str, const Primitive& x, const Tail&... tail) { std::cout << *str.begin() << ":" << x << " "; if (sizeof...(tail) > 0) { std::cout << "\n"; str.pop_front(); print(str, tail...); } } template<class Container, class... Tail>inline auto print(std::list<std::string>& str, const Container& c, const Tail&... tail) ->decltype(c.begin()) { std::cout << "-- " << *str.begin() << " --\n"; for (const auto& x : c) { printSingle(x); BR; }std::cout << "\n"; str.pop_front(); print(str, tail...); return c.begin(); } template<class... Tail>inline void print(std::list<std::string>& str, const std::string& s, const Tail&... tail) { std::cout << *str.begin() << ":" << s << "\n"; str.pop_front(); print(str, tail...); } //============================================================================================= /** * 遅延セグメント木を構成する * 4methodの変更により調整 */ template<class T> class LazySegmentTree { private: const T initialValue = { 0,0 }; const T ignoreValue = { 0,0 }; const T lazyIgnoreValue = { 0,0 }; const ll m_size; std::vector<T> m_node; std::vector<T> m_lazy; ll calcSize(ll n) { ll size = 1; while (size < n) { size *= 2; } return size; } void spreadLazy(ll k) { if (k >= m_size - 1) { return; } m_lazy[2 * k + 1] = { m_lazy[k].first / 2,m_lazy[k].second / 2 }; m_lazy[2 * k + 2] = { m_lazy[k].first / 2,m_lazy[k].second / 2 }; } void reflectLazy(ll k) { m_node[k] = m_lazy[k]; } T merge(T xl, T xr) { return { xl.first + xr.first,xl.second + xr.second }; } T rangeUpdate(T x, ll l, ll r) { return { x.first * (r - l) ,x.second*(r - l) }; } public: LazySegmentTree() = delete; LazySegmentTree(ll n) : m_size(calcSize(n)), m_node(m_size * 2 - 1, initialValue), m_lazy(m_size * 2 - 1, lazyIgnoreValue) { } void add(ll a, ll b, T x) { add(a, b + 1, x, 0, 0, m_size); /** cout << "-- tree -- " << endl; REP(i, 2 * m_size - 1) { cout << m_node[i] << " " << m_lazy[i] << endl; } /*//**/ } void add(ll a, ll b, T x, ll k, ll l, ll r) { eval(k); if (r <= a || b <= l) { return; } if (a <= l && r <= b) { m_lazy[k] = rangeUpdate(x, l, r); eval(k); return; } add(a, b, x, 2 * k + 1, l, (l + r) / 2); add(a, b, x, 2 * k + 2, (l + r) / 2, r); m_node[k] = merge(m_node[2 * k + 1], m_node[2 * k + 2]); } void eval(ll k) { if (m_lazy[k] == lazyIgnoreValue) { return; } reflectLazy(k); spreadLazy(k); m_lazy[k] = lazyIgnoreValue; } T query(ll a, ll b) { return query(a, b + 1, 0, 0, m_size); } T query(ll a, ll b, ll k, ll l, ll r) { if (r <= a || b <= l) { return ignoreValue; } eval(k); if (a <= l && r <= b) { return m_node[k]; } return merge( query(a, b, 2 * k + 1, l, (l + r) / 2), query(a, b, 2 * k + 2, (l + r) / 2, r) ); } }; signed main() { ll n, q; cin >> n >> q; auto tree = LazySegmentTree<PAIR>(n); ll sa = 0, sb = 0; REP(_, q) { ll k, l, r; cin >> k >> l >> r; if (k > 0) { tree.add(l, r, { k == 1,k == 2 }); } else { auto p = tree.query(l, r); if (p.first > p.second) { sa += p.first; } else if (p.first < p.second) { sb += p.second; } } } auto p = tree.query(0, n - 1); sa += p.first; sb += p.second; cout << sa << " " << sb << endl; }