1 条题解
-
0

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int M = 100005; #define pii pair<int,int> #define pb push_back #define x first #define y second int read() { int x=0,f=1;char c; while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;} while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } int n,m,a[M],b[M],c[M],s[M],ad[M],ans[M],use[M]; priority_queue<pii> q;vector<int> v[M]; void lisan(int &x) {x=lower_bound(c+1,c+1+n,x)-c;} signed main() { n=read()+1; for(int i=1;i<n;i++) a[i]=read(),b[i]=read(); for(int i=1;i<=n;i++) c[i]=read(); sort(c+1,c+1+n);m=read(); for(int i=1;i<n;i++) lisan(a[i]),lisan(b[i]); for(int i=1;i<n;i++) s[a[i]]++; for(int i=1;i<=n;i++) s[i]+=s[i-1]-1; //intervals for(int i=1;i<n;i++) { if(a[i]>b[i]) v[a[i]-1].pb(i); else use[i]=1; } //cover I for(int i=n,nw=0;i>=1;i--) { for(int x:v[i]) q.push({-b[x],x}); nw+=ad[i]; while(s[i]+nw<-1) { while(!q.empty() && -q.top().x>i) q.pop(); if(q.empty()) {while(m--)puts("-1");return 0;} int x=q.top().y;q.pop(); use[x]=1;ans[1]++; nw++;ad[a[x]-1]++;ad[b[x]-1]--; } } while(!q.empty()) q.pop(); for(int i=n;i>=1;i--) s[i]+=(ad[i]+=ad[i+1]); //cover II for(int i=1;i<=n;i++) v[i].clear(),ad[i]=0; for(int i=1;i<n;i++) if(!use[i]) v[b[i]].pb(i); for(int i=1,nw=0;i<=n;i++) { for(int x:v[i]) q.push({a[x],x}); ans[i+1]=ans[i];nw+=ad[i]; while(s[i]+nw==-1) { while(!q.empty() && q.top().x<i) q.pop(); if(q.empty()) { for(int j=i+1;j<=n+1;j++) ans[j]=n+1; goto yhpyyds; } int x=q.top().y;q.pop(); ans[i+1]++;nw++; ad[b[x]]++;ad[a[x]]--; } } yhpyyds:; while(m--) { int u=read(),v=read(),zxy=-1; lisan(u);lisan(v); zxy=max(zxy,n-ans[u]); zxy=max(zxy,n-ans[v]-1); printf("%d\n",zxy); } }
- 1
信息
- ID
- 8734
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者