Submission #1162317

#TimeUsernameProblemLanguageResultExecution timeMemory
1162317guagua0407Escape Route 2 (JOI24_escape2)C++20
23 / 100
1929 ms51076 KiB
//#pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int,int> #define f first #define s second #define all(x) x.begin(),x.end() #define _ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; void setIO(string s) { freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout); } const int mxn=1e5+5; struct node{ vector<int> id; vector<ll> sum; int l,r; void init(int n){ id=vector<int>(n,0); sum=vector<ll>(n,0); } node(){} }; vector<node> st(mxn*4); vector<vector<pair<int,int>>> a(mxn); vector<int> m(mxn); int n,t; const ll inf=(ll)1e18; const int inf2=1e9; node comb(node L,node R){ if(L.id.empty()) return R; else if(R.id.empty()) return L; node ans; int sz=(int)L.id.size(); int sz2=(int)R.id.size(); ans.init(sz); ans.l=L.l; ans.r=R.r; //cout<<L.l<<' '<<L.r<<' '<<R.l<<' '<<R.r<<'\n'; for(int i=0;i<sz;i++){ int r=a[L.r][L.id[i]].s; int pos=lower_bound(all(a[R.l]),make_pair(r,0))-a[R.l].begin(); if(pos==(int)a[R.l].size()) pos=0; ll tmp=L.sum[i]+R.sum[pos]; tmp+=a[R.l][pos].f-r; if(a[R.l][pos].f<r) tmp+=t; ans.sum[i]=tmp; ans.id[i]=R.id[pos]; } return ans; } void build(int l=1,int r=n,int v=1){ if(l==r){ st[v].init((int)a[l].size()); for(int i=0;i<(int)a[l].size();i++){ st[v].id[i]=i; st[v].sum[i]=a[l][i].s-a[l][i].f; } st[v].l=l; st[v].r=l; return; } int mid=(l+r)/2; build(l,mid,v*2); build(mid+1,r,v*2+1); st[v]=comb(st[v*2],st[v*2+1]); } node query(int tl,int tr,int l=1,int r=n,int v=1){ if(r<tl or tr<l){ return node(); } if(tl<=l and r<=tr){ return st[v]; } int mid=(l+r)/2; return comb(query(tl,min(mid,tr),l,mid,v*2),query(max(mid+1,tl),tr,mid+1,r,v*2+1)); } bool comp(pair<int,int> x,pair<int,int> y){ if(x.f!=y.f) return x.f<y.f; return x.s>y.s; } int main() {_ cin>>n>>t; vector<int> mnn(n,inf2); for(int i=1;i<n;i++){ cin>>m[i]; for(int j=0;j<m[i];j++){ int l,r; cin>>l>>r; a[i].push_back({l,r}); mnn[i]=min(mnn[i],r-l); } { sort(all(a[i]),comp); vector<pair<int,int>> tmp; for(auto v:a[i]){ while(!tmp.empty() and tmp.back().s>=v.s){ tmp.pop_back(); } tmp.push_back(v); } swap(tmp,a[i]); } } vector<vector<pair<int,int>>> b=a; for(int i=1;i<n;i++){ for(auto &v:b[i]){ swap(v.f,v.s); } sort(all(b[i])); } for(int i=1;i<n-1;i++){ { vector<bool> used((int)a[i+1].size()); used[0]=true; for(auto v:a[i]){ int pos=lower_bound(all(a[i+1]),make_pair(v.s,0))-a[i+1].begin(); if(pos==(int)a[i+1].size()) pos=0; used[pos]=true; } vector<pair<int,int>> tmp; for(int j=0;j<(int)a[i+1].size();j++){ if(used[j]) tmp.push_back(a[i+1][j]); } swap(tmp,a[i+1]); } } build(); int q; cin>>q; for(int i=0;i<q;i++){ int l,r; cin>>l>>r; if(l+1==r){ cout<<mnn[l]<<'\n'; continue; } node ans=query(l+1,r-1); ll mn=inf; for(int j=0;j<(int)a[l+1].size();j++){ int pos=upper_bound(all(b[l]),make_pair(a[l+1][j].f,inf2))-b[l].begin()-1; ll tmp=ans.sum[j]; if(pos==-1){ pos=(int)a[l+1].size()-1; tmp+=t; } tmp+=(a[l+1][j].f-b[l][pos].s); mn=min(mn,tmp); } cout<<mn<<'\n'; } return 0; } //maybe its multiset not set //yeeorz //diaoborz

Compilation message (stderr)

Main.cpp: In function 'void setIO(std::string)':
Main.cpp:15:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   15 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:16:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |     freopen((s + ".out").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...
#Verdict Execution timeMemoryGrader output
Fetching results...