Submission #1163015

#TimeUsernameProblemLanguageResultExecution timeMemory
1163015guagua0407Escape Route 2 (JOI24_escape2)C++20
54 / 100
1421 ms461504 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; const int B=400; int n,T; const ll inf=(ll)1e18; const int inf2=1e9+5; 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; } bool comp2(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<vector<pair<int,int>>> a(n); vector<vector<pair<int,int>>> b(n); vector<int> m(n); 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]); } b[i]=a[i]; for(auto &v:b[i]){ swap(v.f,v.s); } m[i]=(int)a[i].size(); } vector<vector<vector<ll>>> sum(n); vector<vector<vector<int>>> nxt(n); vector<vector<int>> to(n); for(int i=1;i<n;i++){ to[i]=vector<int>((int)a[i].size(),-1); if(i==n-1) break; for(int j=0;j<(int)a[i].size();j++){ to[i][j]=lower_bound(all(a[i+1]),make_pair(a[i][j].s,0))-a[i+1].begin(); } } for(int i=1;i<n;i++){ sum[i]=vector<vector<ll>>(m[i],vector<ll>(20)); nxt[i]=vector<vector<int>>(m[i],vector<int>(20)); for(int j=0;j<m[i];j++){ sum[i][j][0]=a[i][j].s-a[i][j].f; nxt[i][j][0]=j; } } for(int k=1;k<20;k++){ for(int i=1;i+(1<<k)<=n;i++){ for(int j=0;j<m[i];j++){ int t=to[i+(1<<(k-1))-1][nxt[i][j][k-1]]; ll tmp=0; if(t==(int)a[i+(1<<(k-1))].size()){ t=0; tmp+=T; } nxt[i][j][k]=nxt[i+(1<<(k-1))][t][k-1]; sum[i][j][k]=sum[i][j][k-1]+sum[i+(1<<(k-1))][t][k-1]+(a[i+(1<<(k-1))][t].f-a[i+(1<<(k-1))-1][nxt[i][j][k-1]].s)+tmp; //cout<<i<<' '<<j<<' '<<k<<' '<<sum[i][j][k]<<'\n'; } } } vector<vector<vector<ll>>> sum2(n); vector<vector<vector<int>>> nxt2(n); vector<vector<ll>> ansbig(n); for(int i=1;i<n;i++){ if((int)a[i].size()<=B) continue; int sz=(int)a[i].size(); sum2[i]=vector<vector<ll>>(sz,vector<ll>(B+1)); nxt2[i]=vector<vector<int>>(sz,vector<int>(B+1)); ansbig[i]=vector<ll>(B+1,inf); for(int j=0;j<sz;j++){ sum2[i][j][1]=a[i][j].s-a[i][j].f; nxt2[i][j][1]=j; ansbig[i][1]=min(ansbig[i][1],sum2[i][j][1]); for(int k=2;k<=B and i+k<=n;k++){ int t=to[i+k-2][nxt2[i][j][k-1]]; ll tmp=0; if(t==(int)a[i+k-1].size()){ t=0; tmp+=T; } nxt2[i][j][k]=t; sum2[i][j][k]=sum2[i][j][k-1]+(a[i+k-1][t].f-a[i+k-2][nxt2[i][j][k-1]].s)+tmp; ansbig[i][k]=min(ansbig[i][k],sum2[i][j][k]); } } } int q; cin>>q; for(int t=0;t<q;t++){ int l,r; cin>>l>>r; if(l+1==r){ cout<<mnn[l]<<'\n'; continue; } int pos=-1; for(int i=l;i<r;i++){ if((int)a[i].size()<=B){ pos=i; break; } } if(pos==-1){ cout<<ansbig[l][r-l]<<'\n'; continue; //pos=r-1; } ll mn=inf; int sz=(int)a[pos].size(); for(int i=0;i<sz;i++){ int cur=pos; int id=i; ll ans=0; for(int k=19;k>=0;k--){ if(cur+(1<<k)>r) continue; ans+=sum[cur][id][k]; if(cur+(1<<k)<r) ans-=a[cur+(1<<k)-1][nxt[cur][id][k]].s; id=to[cur+(1<<k)-1][nxt[cur][id][k]]; cur+=(1<<k); if(cur<r and id==(int)a[cur].size()){ id=0; ans+=T; } if(cur<r) ans+=a[cur][id].f; } cur=pos; id=i; while(cur>l){ int t=upper_bound(all(b[cur-1]),make_pair(a[cur][id].f,inf2))-b[cur-1].begin()-1; if(t==-1){ t=(int)b[cur-1].size()-1; ans+=T; } ans+=(a[cur][id].f-a[cur-1][t].f); id=t; cur--; } mn=min(mn,ans); } cout<<mn<<'\n'; } return 0; } //maybe its multiset not set //yeeorz //diaoborz /* 48 126 11 167 95 298 142 61 20 349 10 100 2 44 80 77 84 3 6 28 0 15 64 75 2 47 92 24 66 3 7 42 59 70 38 70 3 0 7 44 65 42 72 2 12 20 13 50 5 78 83 3 28 61 75 39 80 46 98 4 47 86 13 26 12 97 43 85 4 66 85 64 99 5 18 93 96 1 2 5 */

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...