結果
| 問題 |
No.945 YKC饅頭
|
| コンテスト | |
| ユーザー |
Rubikun
|
| 提出日時 | 2019-12-08 00:07:47 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 470 ms / 2,000 ms |
| コード長 | 3,156 bytes |
| コンパイル時間 | 2,021 ms |
| コンパイル使用メモリ | 175,600 KB |
| 実行使用メモリ | 7,424 KB |
| 最終ジャッジ日時 | 2024-12-26 18:30:53 |
| 合計ジャッジ時間 | 12,359 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 74 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(),(x).end()
const int mod=998244353,MAX=200005;
const ll INF=1LL<<60;
template<typename T,typename E>
struct LazySegmentTree{
using F=function<T(T,T)>;
using G=function<T(T,E)>;
using H=function<E(E,E)>;
int n;
vector<T> dat;
vector<E> lazy;
F f;
G g;
H h;
T ti;
E ei;
LazySegmentTree(int n_,F f,G g,H h,T ti,E ei) :f(f),g(g),h(h),ti(ti),ei(ei){
n=1;
while(n<n_) n*=2;
dat.assign(2*n-1,ti);
lazy.assign(2*n-1,ei);
}
LazySegmentTree(int n_,vector<T> &v,F f,G g,H h,T ti,E ei) :f(f),g(g),h(h),ti(ti),ei(ei){
n=1;
while(n<n_) n*=2;
dat.assign(2*n-1,ti);
for(int i=n-1;i-(n-1)<v.size();i++) dat[i]=v[i-(n-1)];
for(int i=n-2;i>=0;i--) dat[i]=f(dat[i*2+1],dat[i*2+2]);
lazy.assign(2*n-1,ei);
}
inline void eval(int k,int l,int r){
if(lazy[k]==ei) return;
dat[k]=g(dat[k],lazy[k]);
if(r-l>1){
lazy[k*2+1]=h(lazy[k*2+1],lazy[k]);
lazy[k*2+2]=h(lazy[k*2+2],lazy[k]);
}
lazy[k]=ei;
}
void update_(int a,int b,E x,int k,int l,int r){
eval(k,l,r);
if(r<=a||b<=l) return;
if(a<=l&&r<=b){
lazy[k]=h(lazy[k],x);
eval(k,l,r);
}
else{
update_(a,b,x,2*k+1,l,(l+r)/2);
update_(a,b,x,2*k+2,(l+r)/2,r);
dat[k]=f(dat[2*k+1],dat[2*k+2]);
}
}
void update(int a,int b,E x){
return update_(a,b,x,0,0,n);
}
T query_(int a,int b,int k,int l,int r){
eval(k,l,r);
if(r<=a||b<=l) return ti;
if(a<=l&&r<=b) return dat[k];
T vl=query_(a,b,2*k+1,l,(l+r)/2);
T vr=query_(a,b,2*k+2,(l+r)/2,r);
return f(vl,vr);
}
T query(int a,int b){
return query_(a,b,0,0,n);
}
};
//区間和はTをpair<ll,int>にするa
int main(){
std::ifstream in("text.txt");
std::cin.rdbuf(in.rdbuf());
cin.tie(0);
ios::sync_with_stdio(false);
int N,M;cin>>N>>M;
auto f=[&](int a,int b){return max(a,b);};
auto g=[&](int a,int b){
if(a==0) return b;
else return a;
};
auto h=[&](int a,int b){
if(a==0) return b;
else return a;
};
LazySegmentTree<int,int> seg(N,
f,
g,
h,
0,
0);
for(int i=0;i<M;i++){
int a,b;char c;cin>>a>>b>>c;
if(c=='Y') seg.update(a-1,b,1);
if(c=='K') seg.update(a-1,b,2);
if(c=='C') seg.update(a-1,b,3);
}
vector<int> ans(4);
for(int i=0;i<N;i++){
ans[seg.query(i,i+1)]++;
}
for(int i=1;i<=3;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
Rubikun