제출 #1163562

#제출 시각아이디문제언어결과실행 시간메모리
1163562guagua0407Escape Route 2 (JOI24_escape2)C++20
90 / 100
3092 ms62852 KiB
#pragma GCC optimize("O4") #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=250; 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; int K=(mxn+B-1)/B+5; 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); vector<vector<int>> to2(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=2;i<n;i++){ to2[i]=vector<int>((int)a[i].size(),-1); for(int j=0;j<(int)a[i].size();j++){ to2[i][j]=upper_bound(all(b[i-1]),make_pair(a[i][j].f,inf2))-b[i-1].begin()-1; } } for(int i=1;i<n;i++){ sum[i]=vector<vector<ll>>(m[i],vector<ll>(17)); nxt[i]=vector<vector<int>>(m[i],vector<int>(17)); 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<17;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<ll>> ansbig(n); for(int i=1;i<n;i++){ if((int)a[i].size()<=B) continue; int sz=(int)a[i].size(); ansbig[i]=vector<ll>(K+1,inf); for(int j=0;j<sz;j++){ //cout<<"i j "<<i<<' '<<j<<'\n'; ll cursum=a[i][j].s-a[i][j].f; int id=j; ansbig[i][1]=min(ansbig[i][1],cursum); for(int k=2;k<=K and i+k<=n;k++){ int t=to[i+k-2][id]; ll tmp=0; if(t==(int)a[i+k-1].size()){ t=0; tmp+=T; } cursum+=(a[i+k-1][t].s-a[i+k-2][id].s)+tmp; id=t; ansbig[i][k]=min(ansbig[i][k],cursum); } } } 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=16;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=to2[cur][id]; 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

컴파일 시 표준 에러 (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...