1 条题解

  • 0
    @ 2026-7-4 11:57:39

    #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
    上传者