제출 #1265901

#제출 시각아이디문제언어결과실행 시간메모리
1265901thelegendary08Fish 3 (JOI24_fish3)C++17
28 / 100
564 ms93104 KiB
#include<bits/stdc++.h> #define pb push_back #define mp make_pair #define int long long #define vi vector<int> #define vvi vector<vector<int>> #define pii pair<int, int> #define vpii vector<pair<int, int>> #define vc vector<char> #define vb vector<bool> #define mii map<int,int> #define f0r(i,n) for(int i=0;i<n;i++) #define FOR(i,k,n) for(int i=k;i<n;i++) #define all(v) (v).begin(),(v).end() #define rall(v) (v).rbegin(),(v).rend() #define in(a) int a; cin>>a #define in2(a,b) int a,b; cin>>a>>b #define in3(a,b,c) int a,b,c; cin>>a>>b>>c #define in4(a,b,c,d) int a,b,c,d; cin>>a>>b>>c>>d #define vin(v,n); vi v(n); f0r(i,n){cin>>v[i];} #define out(a) cout<<a<<'\n' #define out2(a,b) cout<<a<<' '<<b<<'\n' #define out3(a,b,c) cout<<a<<' '<<b<<' '<<c<<'\n' #define out4(a,b,c,d) cout<<a<<' '<<b<<' '<<c<<' '<<d<<'\n' #define pout(a) cout<<a.first<<' '<<a.second<<'\n' #define vout(v) for(auto u : v){cout<<u<<' ';} cout<<endl #define dout(a) cout<<a<<' '<<#a<<endl #define dout2(a,b) cout<<a<<' '<<#a<<' '<<b<<' '<<#b<<endl #define yn(x); if(x){cout<<"YES"<<'\n';}else{cout<<"NO"<<'\n';} const int leg = 1e9 + 7; const int mod = 998244353; using namespace std; struct query{ int l, r, d; bool operator<(const query &x){ return r < x.r; } }; struct segtree{ vi tree, lz, tl, tr; int n; segtree(int x){ n = x; tree.resize(n * 4 + 5); tr.resize(n * 4 + 5); tl.resize(n * 4 + 5); lz.resize(n * 4 + 5); build(1, 0, n-1); } void build(int v, int l, int r){ tl[v] = l; tr[v] = r; if(l == r)return; int mid = l + r >> 1; build(v*2, l, mid); build(v*2+1, mid+1, r); } void pull(int v){ tree[v] = tree[v*2] + tree[v*2 + 1]; } int sz(int v){ return tr[v] - tl[v] + 1; } void sett(int v, int x){ tree[v] = sz(v) * x; lz[v] = x; } void push(int v){ if(lz[v] != -1){ sett(v*2, lz[v]); sett(v*2+1, lz[v]); lz[v] = -1; } } void update(int v, int l, int r, int x){ // out4(v,l,r,x); if(tl[v] > r || tr[v] < l)return; if(tl[v] >= l && tr[v] <= r){ sett(v, x); return; } push(v); update(v*2, l, r, x); update(v*2+1, l, r, x); pull(v); } int quer(int v, int l, int r){ if(tl[v] > r || tr[v] < l)return 0; if(tl[v] >= l && tr[v] <= r){ return tree[v]; } push(v); int ret = quer(v*2,l,r) + quer(v*2+1,l,r); pull(v); return ret; } }; signed main(){ ios::sync_with_stdio(false); cin.tie(NULL); //ifstream cin(".in"); //ofstream cout(".out"); in2(n,D); vin(v,n); in(q); vector<query> quers; f0r(i,q){ in2(l,r); l--; r--; quers.pb({l,r,i}); } sort(all(quers)); vi anss(q); stack<pii>s; int ptr = 0; segtree S = segtree(n); segtree T = segtree(n); f0r(i,n)T.update(1, i, i, v[i]); f0r(i, q){ int l = quers[i].l; int r = quers[i].r; // dout2(l,r); while(r >= ptr){ int lst = ptr; while(!s.empty() && s.top().first > v[ptr]){ lst = s.top().second; s.pop(); } if(s.empty())lst = 0; else lst = s.top().second + 1; s.push(mp(v[ptr], ptr)); // dout2(lst,ptr); S.update(1, lst, ptr, v[ptr]); // cout<<'\n'; // dout2(ptr, S.quer(1, 0, 0)); ptr++; // f0r(j, n)cout<<S.quer(1, j, j)<<' '; // cout<<'\n'; } int ans = T.quer(1, l, r) - S.quer(1, l, r); anss[quers[i].d] = ans; } f0r(i, q)cout<<anss[i]<<'\n'; }
#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...