Submission #675800

#TimeUsernameProblemLanguageResultExecution timeMemory
675800guagua0407Railway Trip 2 (JOI22_ho_t4)C++17
27 / 100
2077 ms6836 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); void setIO(string s) { freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout); } struct node{ int mx=-1, mn=1e5+5; int stmx=-1,stmn=1e5+5; }; const int mxn=1e5+5; pair<int,int> jump[20][mxn]; int n,k,m; node segtree[mxn*4]; void push(int v){ segtree[v*2].mn=min(segtree[v*2].mn,segtree[v].stmn); segtree[v*2+1].mn=min(segtree[v*2+1].mn,segtree[v].stmn); segtree[v*2].mx=max(segtree[v*2].mx,segtree[v].stmx); segtree[v*2+1].mx=max(segtree[v*2+1].mx,segtree[v].stmx); segtree[v*2].stmn=min(segtree[v*2].stmn,segtree[v].stmn); segtree[v*2+1].stmn=min(segtree[v*2+1].stmn,segtree[v].stmn); segtree[v*2].stmx=max(segtree[v*2].stmx,segtree[v].stmx); segtree[v*2+1].stmx=max(segtree[v*2+1].stmx,segtree[v].stmx); segtree[v].stmn=1e5+5; segtree[v].stmx=-1; } void init(int l=1,int r=n,int v=1){ segtree[v].mn=l,segtree[v].mx=r; if(l==r){ return; } int mid=(l+r)/2; init(l,mid,v*2); init(mid+1,r,v*2+1); } void update1(int tl,int tr,int val,int l=1,int r=n,int v=1){ if(tl>tr){ return; } if(tl<=l and r<=tr){ segtree[v].stmx=max(segtree[v].stmx,val); segtree[v].mx=max(segtree[v].mx,val); return; } push(v); int mid=(l+r)/2; update1(tl,min(mid,tr),val,l,mid,v*2); update1(max(mid+1,tl),tr,val,mid+1,r,v*2+1); segtree[v].mx=max(segtree[v*2].mx,segtree[v*2+1].mx); segtree[v].mn=min(segtree[v*2].mn,segtree[v*2+1].mn); } void update2(int tl,int tr,int val,int l=1,int r=n,int v=1){ if(tl>tr){ return; } if(tl<=l and r<=tr){ segtree[v].stmn=min(segtree[v].stmn,val); segtree[v].mn=min(segtree[v].mn,val); return; } push(v); int mid=(l+r)/2; update2(tl,min(mid,tr),val,l,mid,v*2); update2(max(mid+1,tl),tr,val,mid+1,r,v*2+1); segtree[v].mn=min(segtree[v*2].mn,segtree[v*2+1].mn); segtree[v].mx=max(segtree[v*2].mx,segtree[v*2+1].mx); } pair<int,int> query(int tl,int tr,int l=1,int r=n,int v=1){ if(tl>tr){ return {n+1,-1}; } if(tl<=l and r<=tr){ return {segtree[v].mn,segtree[v].mx}; } push(v); int mid=(l+r)/2; pair<int,int> x=query(tl,min(mid,tr),l,mid,v*2); pair<int,int> y=query(max(mid+1,tl),tr,mid+1,r,v*2+1); return {min(x.f,y.f),max(x.s,y.s)}; } int main() {_ //setIO("wayne"); cin>>n>>k; cin>>m; init(); for(int i=0;i<m;i++){ int a,b; cin>>a>>b; if(a<b){ int tmp=min(a+k-1,b); update1(a,tmp,b); } else{ int tmp=max(a-k+1,b); update2(tmp,a,b); } } int q; cin>>q; for(int i=0;i<q;i++){ int a,b; cin>>a>>b; int l=a,r=a; int ans=0; while(b<l or b>r){ //cout<<l<<' '<<r<<'\n'; pair<int,int> tmp=query(l,r); l=tmp.f,r=tmp.s; ans++; if(ans>n){ cout<<-1<<'\n'; break; } } if(ans<=n) cout<<ans<<'\n'; } return 0; } //maybe its multiset not set

Compilation message (stderr)

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