QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#78420 | #4219. Insects | chenshi | WA | 4ms | 11468kb | C++ | 2.7kb | 2023-02-18 19:40:10 | 2023-02-18 19:40:12 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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'