結果
問題 | No.255 Splarrraaay スプラーレェーーイ |
ユーザー |
![]() |
提出日時 | 2018-11-20 19:40:47 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2,899 ms / 10,000 ms |
コード長 | 4,083 bytes |
コンパイル時間 | 2,553 ms |
コンパイル使用メモリ | 223,396 KB |
最終ジャッジ日時 | 2025-01-06 16:59:24 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 10 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:98:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 98 | scanf("%lld %lld",&n,&q); | ~~~~~^~~~~~~~~~~~~~~~~~~ main.cpp:102:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 102 | scanf("%lld %lld %lld",&xs[i],&ls[i],&rs[i]); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include<bits/stdc++.h>using namespace std;using Int = long long;template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}template <typename T,typename E>struct SegmentTree{using F = function<T(T,T)>;using G = function<T(T,E)>;using H = function<E(E,E)>;Int n,height;F f;G g;H h;T ti;E ei;vector<T> dat;vector<E> laz;SegmentTree(F f,G g,H h,T ti,E ei):f(f),g(g),h(h),ti(ti),ei(ei){}void init(Int n_){n=1;height=0;while(n<n_) n<<=1,height++;dat.assign(2*n,ti);laz.assign(2*n,ei);}void build(const vector<T> &v){Int n_=v.size();init(n_);for(Int i=0;i<n_;i++) dat[n+i]=v[i];for(Int i=n-1;i;i--)dat[i]=f(dat[(i<<1)|0],dat[(i<<1)|1]);}inline T reflect(Int k){return laz[k]==ei?dat[k]:g(dat[k],laz[k]);}inline void eval(Int k){if(laz[k]==ei) return;laz[(k<<1)|0]=h(laz[(k<<1)|0],laz[k]);laz[(k<<1)|1]=h(laz[(k<<1)|1],laz[k]);dat[k]=reflect(k);laz[k]=ei;}inline void thrust(Int k){for(Int i=height;i;i--) eval(k>>i);}inline void recalc(Int k){while(k>>=1)dat[k]=f(reflect((k<<1)|0),reflect((k<<1)|1));}void update(Int a,Int b,E x){thrust(a+=n);thrust(b+=n-1);for(Int l=a,r=b+1;l<r;l>>=1,r>>=1){if(l&1) laz[l]=h(laz[l],x),l++;if(r&1) --r,laz[r]=h(laz[r],x);}recalc(a);recalc(b);}void set_val(Int a,T x){thrust(a+=n);dat[a]=x;laz[a]=ei;recalc(a);}T query(Int a,Int b){thrust(a+=n);thrust(b+=n-1);T vl=ti,vr=ti;for(Int l=a,r=b+1;l<r;l>>=1,r>>=1) {if(l&1) vl=f(vl,reflect(l++));if(r&1) vr=f(reflect(--r),vr);}return f(vl,vr);}};template<typename T>vector<T> compress(vector<T> v){sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());return v;}template<typename T>map<T, Int> dict(const vector<T> &v){map<T, Int> res;for(Int i=0;i<(Int)v.size();i++)res[v[i]]=i;return res;}//INSERT ABOVE HEREsigned main(){Int n,q;scanf("%lld %lld",&n,&q);vector<Int> xs(q),ls(q),rs(q);for(Int i=0;i<q;i++)scanf("%lld %lld %lld",&xs[i],&ls[i],&rs[i]);vector<Int> vs({0,n});for(Int i=0;i<q;i++){vs.emplace_back(ls[i]);vs.emplace_back(++rs[i]);}vs=compress(vs);auto dc=dict(vs);const Int MOD = Int(1e18)+Int(9);auto add=[&](Int a,Int b){a+=b;return a>=MOD?a-MOD:a;};auto mul=[&](Int a,Int b){Int r=0;while(b){if(b&1) r=add(r,a);a=add(a,a);b>>=1;}return r;};using T = pair<Int, Int>;using E = pair<Int, Int>;T ti(0,0);E ei(1,0);auto f=[&](T a,T b){return T(add(a.first,b.first),add(a.second,b.second));};auto g=[&](T a,E b){return T(add(a.first*b.first,mul(a.second,b.second)),a.second);};auto h=[&](E a,E b){return E(a.first*b.first,add(a.second*b.first,b.second));};vector<SegmentTree<T, E> > segs;for(Int k=0;k<6;k++)segs.emplace_back(f,g,h,ti,ei);vector<T> vt;for(Int i=0;i+1<(Int)vs.size();i++)vt.emplace_back(0,vs[i+1]-vs[i]);for(Int k=0;k<6;k++) segs[k].build(vt);vector<Int> ans(6,0);for(Int i=0;i<q;i++){Int x=xs[i],l=dc[ls[i]],r=dc[rs[i]];if(x==0){vector<Int> res(6,0);for(Int k=0;k<6;k++)res[k]=segs[k].query(l,r).first;map<Int, Int> m;for(Int k=0;k<6;k++) m[res[k]]++;Int v=(--m.end())->first;if(m[v]!=1) continue;for(Int k=0;k<6;k++)if(v==res[k]) ans[k]=add(ans[k],res[k]);}else{for(Int k=0;k<6;k++){if(k==x) segs[k].update(l,r,E(1,1));else segs[k].update(l,r,E(0,0));}}}for(Int k=0;k<6;k++)ans[k]=add(ans[k],segs[k].query(0,dc[n]).first);printf("%lld %lld %lld %lld %lld\n",ans[1],ans[2],ans[3],ans[4],ans[5]);return 0;}