結果
問題 |
No.3059 Range Tournament
|
ユーザー |
![]() |
提出日時 | 2025-03-14 22:47:49 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,059 bytes |
コンパイル時間 | 2,337 ms |
コンパイル使用メモリ | 202,828 KB |
実行使用メモリ | 48,140 KB |
最終ジャッジ日時 | 2025-03-14 22:48:09 |
合計ジャッジ時間 | 19,367 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 2 WA * 25 |
ソースコード
#include <bits/stdc++.h> using namespace std; typedef long long ll; template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; } template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; } #define vi vector<int> #define vl vector<ll> #define vii vector<pair<int,int>> #define vll vector<pair<ll,ll>> #define vvi vector<vector<int>> #define vvl vector<vector<ll>> #define vvii vector<vector<pair<int,int>>> #define vvll vector<vector<pair<ll,ll>>> #define vst vector<string> #define pii pair<int,int> #define pll pair<ll,ll> #define pb push_back #define all(x) (x).begin(),(x).end() #define mkunique(x) sort(all(x));(x).erase(unique(all(x)),(x).end()) #define fi first #define se second #define mp make_pair #define si(x) int(x.size()) const int mod=998244353,MAX=400005,INF=15<<26; template<typename T> struct SparseTable{ using F=function<T(T,T)>; int n,logn; vector<vector<T>> dat; vector<int> loglen; F f; T ti; SparseTable(int n_,F f,T ti) :f(f),ti(ti){ n=1; logn=1; while(n<n_){ n*=2; logn++; } loglen.resize(n+3); n=n_; int j=0; for(int i=1;i<n+3;i++){ loglen[i]=j; if(i+1>(1<<(j+1))) j++; } dat.resize(logn); for(int i=0;i<logn;i++){ dat[i].assign(n+1,ti); } } void set(vector<T> &v){ for(int j=0;j<n+1;j++){ if(j<si(v)) dat[0][j]=v[j]; } } void set(int j,T x){ dat[0][j]=x; } void built(){ for(int i=1;i<logn;i++){ for(int j=0;j<n+1;j++){ T vls=dat[i-1][j],vr; if(j+(1<<(i-1))>=n+1) vr=ti; else vr=dat[i-1][j+(1<<(i-1))]; dat[i][j]=f(vls,vr); } } } T query(int l,int r){ if(l>=r) return ti; T vls=dat[loglen[r-l]][l],vr=dat[loglen[r-l]][r-(1<<loglen[r-l])]; return f(vls,vr); } }; int imo[22][MAX]; int ad[MAX]; void solve(int t,int l,int r,int pl,int pr,int dl,int dr,SparseTable<int> &spa){ //cout<<t<<" "<<l<<" "<<r<<" "<<pl<<" "<<pr<<endl; int len=1<<t; int cn=r-l; assert(cn%len==0); cn/=len; if(pl+pr) cn++; if(cn==1) return; //cout<<t<<" "<<l<<" "<<r<<" "<<pl<<" "<<pr<<endl; if(pl+pr){ int ma=max(spa.query(dr-pl,dr),spa.query(dl,dl+pr+len)); //cout<<ma<<endl; ad[ma]++; if(cn==2) return; imo[t][l+len]++; imo[t][l+len+len*((cn-2)/2*2)]--; if(cn&1){ ma=max(spa.query(l+len+len*((cn-2)/2*2),dr),spa.query(dl,dl+pr+len)); ad[ma]++; solve(t+1,l+len,l+len+len*((cn-2)/2*2),dr-(l+len+len*((cn-2)/2*2)),l+len,dl,dr,spa); }else{ solve(t+1,l+len,l+len+len*((cn-2)/2*2),dr-(l+len+len*((cn-2)/2*2)),l+len,dl,dr,spa); } }else{ if(cn&1){ imo[t][l]++; imo[t][r-len]--; solve(t+1,l,r-len,len,pr,dl,dr,spa); }else{ imo[t][l]++; imo[t][r]--; solve(t+1,l,r,pl,pr,dl,dr,spa); } } } int main(){ std::ifstream in("text.txt"); std::cin.rdbuf(in.rdbuf()); cin.tie(0); ios::sync_with_stdio(false); int N;cin>>N; vi P(N); for(int i=0;i<N;i++){ int x;cin>>x;x--; P[i]=x; } SparseTable<int> spa(N,[&](int a,int b){return max(a,b);},-INF); spa.set(P); spa.built(); int Q;cin>>Q; while(Q--){ int l,r;cin>>l>>r; l--; solve(0,l,r,0,0,l,r,spa); } for(int q=0;q<21;q++){ for(int i=0;i<N;i++){ if(i>=(1<<(q+1))) imo[q][i]+=imo[q][i-(1<<(q+1))]; if(imo[q][i]) ad[spa.query(i,min(N,i+(1<<(q+1))))]+=imo[q][i]; } } for(int i=0;i<N;i++){ cout<<ad[i]<<"\n"; } }