제출 #343495

#제출 시각아이디문제언어결과실행 시간메모리
34349512tqian가로등 (APIO19_street_lamps)C++17
0 / 100
471 ms31296 KiB
// #include <bits/stdc++.h> // using namespace std; // #define f1r(i, a, b) for (int i = a; i < b; ++i) // #define f0r(i, a) f1r(i, 0, a) // #define eb emplace_back // #define pb push_back // #define f first // #define s second // #define mp make_pair // #define sz(x) (int) (x).size() // #define all(x) (x).begin(), (x).end() // typedef long long ll; // typedef vector<int> vi; // typedef pair<int, int> pi; // typedef vector<pi> vpi; // typedef vector<ll> vl; #pragma GCC optimize ("O3") #pragma GCC target ("sse4") #include <algorithm> #include <array> #include <bitset> #include <cassert> #include <chrono> #include <cmath> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <iostream> #include <iomanip> #include <map> #include <numeric> #include <queue> #include <random> #include <set> #include <stack> #include <string> #include <unordered_map> #include <vector> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>; typedef long long ll; typedef long double ld; typedef double db; typedef string str; typedef pair<int, int> pi; typedef pair<ll, ll> pl; typedef pair<db, db> pd; typedef vector<int> vi; typedef vector<bool> vb; typedef vector<ll> vl; typedef vector<db> vd; typedef vector<str> vs; typedef vector<pi> vpi; typedef vector<pl> vpl; typedef vector<pd> vpd; #define mp make_pair #define f first #define s second #define sz(x) (int) (x).size() #define all(x) begin(x), end(x) #define rall(x) (x).rbegin(), (x).rend() #define sor(x) sort(all(x)) #define rsz resize #define resz resize #define ins insert #define ft front() #define bk back() #define pf push_front #define pb push_back #define eb emplace_back #define lb lower_bound #define ub upper_bound #define f1r(i, a, b) for (int i = (a); i < (b); ++i) #define f0r(i, a) f1r(i, 0, a) #define FOR(i, a, b) for (int i = (a); i < (b); ++i) #define F0R(i, a) FOR(i,0,a) #define ROF(i, a, b) for (int i = (b) - 1; i >= (a); --i) #define R0F(i, a) ROF(i, 0, a) #define trav(a, x) for (auto& a : x) mt19937 rng((uint32_t) chrono::steady_clock::now().time_since_epoch().count()); template<class T> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; } template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; } template<class T> using V = vector<T>; #ifdef LOCAL #define dbg(...) debug(#__VA_ARGS__, __VA_ARGS__); #else #define dbg(...) 17; #endif template<typename T, typename S> ostream& operator << (ostream &os, const pair<T, S> &p) { return os << "(" << p.first << ", " << p.second << ")"; } template<typename C, typename T = decay<decltype(*begin(declval<C>()))>, typename enable_if<!is_same<C, string>::value>::type* = nullptr> ostream& operator << (ostream &os, const C &c) { bool f = true; os << "{"; for (const auto &x : c) { if (!f) os << ", "; f = false; os << x; } return os << "}"; } template<typename T> void debug(string s, T x) { cerr << s << " = " << x << "\n"; } template<typename T, typename... Args> void debug(string s, T x, Args... args) { cerr << s.substr(0, s.find(',')) << " = " << x << " | "; debug(s.substr(s.find(',') + 2), args...); } constexpr int pct(int x) { return __builtin_popcount(x); } constexpr int bits(int x) { return 31 - __builtin_clz(x); } // floor(log2(x)) namespace input { template<class T> void re(complex<T>& x); template<class T1, class T2> void re(pair<T1, T2>& p); template<class T> void re(vector<T>& a); template<class T, int SZ> void re(array<T, SZ>& a); template<class T> void re(T& x) { cin >> x; } void re(double& x) { string t; re(t); x = stod(t); } void re(ld& x) { string t; re(t); x = stold(t); } template<class T, class... Ts> void re(T& t, Ts&... ts) { re(t); re(ts...); } template<class T> void re(complex<T>& x) { T a, b; re(a, b); x = cd(a, b); } template<class T1, class T2> void re(pair<T1, T2>& p) { re(p.f, p.s); } template<class T> void re(vector<T>& a) { F0R(i, sz(a)) re(a[i]); } template<class T, int SZ> void re(array<T, SZ>& a) { F0R(i, SZ) re(a[i]); } } using namespace input; namespace output { void pr(int x) { cout << x; } void pr(long x) { cout << x; } void pr(ll x) { cout << x; } void pr(unsigned x) { cout << x; } void pr(unsigned long x) { cout << x; } void pr(unsigned long long x) { cout << x; } void pr(float x) { cout << x; } void pr(double x) { cout << x; } void pr(ld x) { cout << x; } void pr(char x) { cout << x; } void pr(const char* x) { cout << x; } void pr(const string& x) { cout << x; } void pr(bool x) { pr(x ? "true" : "false"); } template<class T> void pr(const complex<T>& x) { cout << x; } template<class T1, class T2> void pr(const pair<T1, T2>& x); template<class T> void pr(const T& x); template<class T, class... Ts> void pr(const T& t, const Ts&... ts) { pr(t); pr(ts...); } template<class T1, class T2> void pr(const pair<T1,T2>& x) { pr("{", x.f, ", ", x.s, "}"); } template<class T> void pr(const T& x) { pr("{"); // const iterator needed for vector<bool> bool fst = 1; for (const auto& a: x) pr(!fst ? ", " : "", a), fst = 0; pr("}"); } void ps() { pr("\n"); } // print w/ spaces template<class T, class... Ts> void ps(const T& t, const Ts&... ts) { pr(t); if (sizeof...(ts)) pr(" "); ps(ts...); } void pc() { pr("]\n"); } // debug w/ commas template<class T, class... Ts> void pc(const T& t, const Ts&... ts) { pr(t); if (sizeof...(ts)) pr(", "); pc(ts...); } } using namespace output; namespace io { void setIn(string s) { freopen(s.c_str(), "r", stdin); } void setOut(string s) { freopen(s.c_str(), "w", stdout); } void setIO(string s = "") { cin.sync_with_stdio(0); cin.tie(0); if (sz(s)) { setIn(s + ".in"), setOut(s + ".out"); } } } using namespace io; const int MOD = 1e9 + 7; // 998244353; const ld PI = acos((ld) -1); typedef std::decay <decltype(MOD)>::type mod_t; struct mi { mod_t val; explicit operator mod_t() const { return val; } mi() { val = 0; } mi(const long long& v) { val = (-MOD <= v && v <= MOD) ? v : v % MOD; if (val < 0) val += MOD; } friend std::istream& operator >> (std::istream& in, mi& a) { long long x; std::cin >> x; a = mi(x); return in; } friend std::ostream& operator << (std::ostream& os, const mi& a) { return os << a.val; } friend void pr(const mi& a) { pr(a.val); } friend void re(mi& a) { long long x; cin >> x; a = mi(x); } friend bool operator == (const mi& a, const mi& b) { return a.val == b.val; } friend bool operator != (const mi& a, const mi& b) { return !(a == b); } friend bool operator < (const mi& a, const mi& b) { return a.val < b.val; } friend bool operator > (const mi& a, const mi& b) { return a.val > b.val; } friend bool operator <= (const mi& a, const mi& b) { return a.val <= b.val; } friend bool operator >= (const mi& a, const mi& b) { return a.val >= b.val; } mi operator - () const { return mi(-val); } mi& operator += (const mi& m) { if ((val += m.val) >= MOD) val -= MOD; return *this; } mi& operator -= (const mi& m) { if ((val -= m.val) < 0) val += MOD; return *this; } mi& operator *= (const mi& m) { val = (long long) val * m.val % MOD; return *this; } friend mi pow(mi a, long long p) { mi ans = 1; assert(p >= 0); for (; p; p /= 2, a *= a) if (p & 1) ans *= a; return ans; } friend mi inv(const mi& a) { assert(a != 0); return pow(a, MOD - 2); } mi& operator /= (const mi& m) { return (*this) *= inv(m); } friend mi operator + (mi a, const mi& b) { return a += b; } friend mi operator - (mi a, const mi& b) { return a -= b; } friend mi operator * (mi a, const mi& b) { return a *= b; } friend mi operator / (mi a, const mi& b) { return a /= b; } }; typedef pair<mi, mi> pmi; typedef vector<mi> vmi; typedef vector<pmi> vpmi; // template<class T> struct Offline2DBIT { // bool mode = 0; // mode = 1 -> initialized // int sz; // std::vector<std::pair<int, int>> todo; // std::vector<int> cnt, st, val; // std::vector<T> bit; // void init(int sz_) { // sz = sz_; // cnt.assign(sz, 0); // st.assign(sz, 0); // } // void build() { // assert(!mode); mode = 1; // std::vector<int> lst(sz, 0); // cnt.assign(sz, 0); // sort(todo.begin(), todo.end(), [](const std::pair<int, int>& a, const std::pair<int, int>& b) { // return a.second < b.second; }); // for (auto& t : todo) // for (int x = t.first; x < sz; x += x & -x) // if (lst[x] != t.second) // lst[x] = t.second, cnt[x]++; // int sum = 0; // for (int i = 0; i < sz; i++) // lst[i] = 0, st[i] = (sum += cnt[i]); // val.resize(sum); bit.resize(sum); // reverse(todo.begin(), todo.end()); // for (auto& t : todo) // for (int x = t.first; x < sz; x += x & -x) // if (lst[x] != t.second) // lst[x] = t.second, val[--st[x]] = t.second; // } // int rank(int y, int l, int r) { // return std::upper_bound(val.begin() + l, val.begin() + r, y) - val.begin() - l; // } // void inner_update(int x, int y, T t) { // for (y = rank(y, st[x], st[x] + cnt[x]); y <= cnt[x]; y += y & -y) // bit[st[x] + y - 1] += t; // } // void update(int x, int y, T t) { // if (!mode) todo.push_back({x, y}); // else // for (; x < sz; x += x & -x) // inner_update(x, y, t); // } // int inner_query(int x, int y) { // T res = 0; // for (y = rank(y, st[x], st[x] + cnt[x]); y; y -= y & -y) // res += bit[st[x] + y - 1]; // return res; // } // T query(int x, int y) { // assert(mode); // T res = 0; // for (; x; x -= x & -x) // res += inner_query(x, y); // return res; // } // T query(int xl, int xr, int yl, int yr) { // return query(xr, yr) - query(xl - 1, yr) - query(xr, yl - 1) + query(xl - 1, yl - 1); // } // }; template<class T, int SZ> struct OffBIT2D { bool mode = 0; // mode = 1 -> initialized vpi todo; // locations of updates to process int cnt[SZ], st[SZ]; vi val; vector<T> bit; // store all BITs in single vector void init() { assert(!mode); mode = 1; int lst[SZ]; F0R(i,SZ) lst[i] = cnt[i] = 0; sort(all(todo),[](const pi& a, const pi& b) { return a.s < b.s; }); trav(t,todo) for (int x = t.f; x < SZ; x += x&-x) if (lst[x] != t.s) lst[x] = t.s, cnt[x] ++; int sum = 0; F0R(i,SZ) lst[i] = 0, st[i] = (sum += cnt[i]); val.rsz(sum); bit.rsz(sum); reverse(all(todo)); trav(t,todo) for (int x = t.f; x < SZ; x += x&-x) if (lst[x] != t.s) lst[x] = t.s, val[--st[x]] = t.s; } int rank(int y, int l, int r) { return ub(begin(val)+l,begin(val)+r,y)-begin(val)-l; } void UPD(int x, int y, T t) { for (y = rank(y,st[x],st[x]+cnt[x]); y <= cnt[x]; y += y&-y) bit[st[x]+y-1] += t; } void update(int x, int y, T t) { if (!mode) todo.pb({x,y}); else for (;x<SZ;x+=x&-x) UPD(x,y,t); } int QUERY(int x, int y) { T res = 0; for (y = rank(y,st[x],st[x]+cnt[x]); y; y -= y&-y) res += bit[st[x]+y-1]; return res; } T query(int x, int y) { assert(mode); T res = 0; for (;x;x-=x&-x) res += QUERY(x,y); return res; } T query(int xl, int xr, int yl, int yr) { return query(xr,yr)-query(xl-1,yr) -query(xr,yl-1)+query(xl-1,yl-1); } }; int main() { // cin.tie(0)->sync_with_stdio(0); int n, q; cin >> n >> q; string s; cin >> s; set<pi> ranges; int i1 = 0; int i2 = 0; while (i1 != n) { while (i2 != n-1 && s[i2+1] == s[i1]) ++i2; if (s[i1] == '1') { ranges.emplace(i1+1, i2+1); } i1 = ++i2; } // Offline2DBIT<ll> O; OffBIT2D<ll, (1<<19)> O; // O.init(); vector<vector<array<int, 3>>> changes(q); vpi queries; queries.pb({-1, -1}); vi add(q + 1); f1r(i, 1, q + 1) { string t; cin >> t; if (t == "toggle") { int id; cin >> id; queries.eb(id, -1); auto it = ranges.lower_bound({id + 1, -1}); bool contained = false; if (it != ranges.begin()) { it = prev(it); if (it->f <= id && id <= it->s) { changes[i].pb({it->f, it->s, i}); O.update(it->f, it->s, i); int l1 = it->f; int r1 = id-1; int l2 = id+1; int r2 = it->s; if (l1 <= r1) { changes[i].pb({l1, r1, -i}); O.update(l1, r1, -i); } if (l2 <= r2) { changes[i].pb({l2, r2, -i}); O.update(l2, r2, -i); } contained = true; } } if (!contained) { pi bef = {-1, -1}; pi aft = {-1, -1}; pi cur = {id, id}; it = ranges.lower_bound({id, id}); if (it != ranges.end() && it->f == id + 1) { aft = *it; changes[i].pb({aft.f, aft.s, i}); O.update(aft.f, aft.s, i); cur.s = aft.s; } if (it != ranges.begin() && prev(it)->s == id - 1) { bef = *prev(it); changes[i].pb({bef.f, bef.s, i}); O.update(bef.f, bef.s, i); cur.f = bef.f; } changes[i].pb({cur.f, cur.s, -i}); O.update(cur.f, cur.s, -i); ranges.emplace(cur.f, cur.s); if (bef.f != -1) { ranges.erase(bef); } if (aft.f != -1) { ranges.erase(aft); } } } else { int l, r; cin >> l >> r; r--; queries.eb(l, r); auto it = ranges.lower_bound({l + 1, -1}); if (it != ranges.begin()) { it = prev(it); if (it->f <= l && r <= it->s) { add[i] += i; } } } } O.init(); // O.build(); f1r(i, 1, q+1) { if (queries[i].s == -1) { for (auto c : changes[i]) { O.update(c[0], c[1], c[2]); assert(c[0] >= 1 && c[1] >= 1 && c[0] <= c[1]); } } else { int l = queries[i].f; int r = queries[i].s; ll ans = O.query(1, l, r, n) + add[i]; cout << ans << '\n'; } } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

street_lamps.cpp: In function 'void io::setIn(std::string)':
street_lamps.cpp:171:35: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
  171 |     void setIn(string s) { freopen(s.c_str(), "r", stdin); }
      |                            ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
street_lamps.cpp: In function 'void io::setOut(std::string)':
street_lamps.cpp:172:36: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
  172 |     void setOut(string s) { freopen(s.c_str(), "w", stdout); }
      |                             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...