QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#78420#4219. InsectschenshiWA 4ms11468kbC++2.7kb2023-02-18 19:40:102023-02-18 19:40:12

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-02-18 19:40:12]
  • 评测
  • 测评结果:WA
  • 用时:4ms
  • 内存:11468kb
  • [2023-02-18 19:40:10]
  • 提交

answer

#include<cstdio>
#include<vector>
#include<algorithm>
#include<set>
#include<queue>
using namespace std;
const int o=2e5+10,O=1e7;
int n,m,p[o],q[o],x[o],y[o],h[o],cnt,ls[O],rs[O],tot,ans[o];bool vis[O];vector<int> vec1,vec2;
struct Edge{int v,p;}e[O];
inline void ad(int U,int V){e[++cnt].v=V;e[cnt].p=h[U];h[U]=cnt;}
inline bool Cmp(int A,int B){return x[A]<x[B];}
inline bool cmp(int A,int B){if(x[A]^x[B]) return x[A]<x[B];return A<B;}
void modify(int&id1,int id2,int pos,int val,int l=1,int r=n){
	if(l==r){if(val>0) id1=pos;else id1=0;return;}
	id1=++tot;ls[id1]=ls[id2];rs[id1]=rs[id2];
	int md=l+r>>1;
	if(pos<=md) modify(ls[id1],ls[id2],pos,val,l,md);
	else modify(rs[id1],rs[id2],pos,val,md+1,r);
	if(ls[id1]) ad(id1,ls[id1]);
	if(rs[id1]) ad(id1,rs[id1]);
}
void query(int id,int val,int l=1,int r=n){
	if(!id||x[p[l]]>x[val]) return;
	if(x[p[r]]<=x[val]){ad(val,id);return;}
	int md=l+r>>1;
	query(ls[id],val,l,md);query(rs[id],val,md+1,r);
}
vector<int> Intersect(vector<int> a,vector<int> b){
	int i=0,sz=b.size();vector<int> res;
	for(auto x:a){
		for(;i<sz&&b[i]<x;++i);
		if(i<sz&&b[i]==x) res.push_back(x);
	}
	return res;
}
void slv(vector<int> S1,vector<int> S2,vector<int> S3){
	int sx=(S1.size()+1)/2;vector<int> X(S1.begin(),S1.begin()+sx),Y(S1.begin()+sx,S1.end());
	vector<int> al,ar,bl,br,vec=X;queue<int> Q;set<pair<int,int> > S;int rt=0,mat=0;
	for(auto i:S2) vec.push_back(i);
	for(auto i:S3) vec.push_back(i);
	sort(vec.begin(),vec.end(),cmp);
	tot=n+m;cnt=0;
	for(auto i:vec)
		if(i<=n) S.insert(make_pair(y[i],i)),modify(rt,rt,q[i],1);
		else{
			auto it=S.lower_bound(make_pair(y[i],i));
			if(it!=S.begin()) modify(rt,rt,q[(*--it).second],-1),ad((*it).second,i),S.erase(it),++mat;
			else Q.push(i),vis[i]=1;
			query(rt,i);
		}
	for(;!Q.empty();Q.pop()){
		for(int i=h[Q.front()];i;i=e[i].p) if(!vis[e[i].v]) vis[e[i].v]=1,Q.push(e[i].v);
		if(Q.front()<=n) ar.push_back(Q.front());
		else if(Q.front()<=n+m) al.push_back(Q.front());
	}
	for(auto i:vec){
		if(!vis[i]) if(i<=n) br.push_back(i);else bl.push_back(i);
		else vis[i]=0;
		h[i]=0;
	}
	for(int i=n+m+1;i<=tot;++i) h[i]=vis[i]=0;
	if(Y.empty()){for(auto i:S2) ++ans[i-n];if(mat>(int)S2.size()) ++ans[S1[0]-n];return;}
	sort(al.begin(),al.end());sort(ar.begin(),ar.end());sort(bl.begin(),bl.end());sort(br.begin(),br.end());
	slv(Intersect(al,S1),Intersect(al,S2),ar);slv(Y,bl,br);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d%d",&x[i],&y[i]),vec1.push_back(i),p[i]=i;
	sort(p+1,p+n+1,Cmp);
	for(int i=1;i<=n;++i) q[p[i]]=i;
	scanf("%d",&m);
	for(int i=1;i<=m;++i) scanf("%d%d",&x[i+n],&y[i+n]),vec2.push_back(i+n);
	slv(vec2,vector<int>(),vec1);
	for(int i=1;i<=m;++i) printf("%d\n",ans[i]+=ans[i-1]);
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 3ms
memory: 9260kb

input:

3
0 0
1 1
2 2
4
0 0
1 1
0 0
3 3

output:

1
2
2
3

result:

ok 4 number(s): "1 2 2 3"

Test #2:

score: 0
Accepted
time: 4ms
memory: 11468kb

input:

9
22 44
7 6
10 48
46 20
21 35
33 16
36 41
29 4
45 22
7
46 39
44 32
1 48
43 19
28 34
8 48
15 18

output:

1
2
2
3
4
4
4

result:

ok 7 numbers

Test #3:

score: -100
Wrong Answer
time: 2ms
memory: 11312kb

input:

7
25 13
38 45
30 28
28 29
16 34
45 4
47 13
8
24 16
10 18
8 28
40 47
28 35
5 25
29 0
41 17

output:

0
0
0
1
2
2
2
2

result:

wrong answer 8th numbers differ - expected: '3', found: '2'