답안 #165390

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
165390 2019-11-26T18:53:00 Z theStaticMind Plahte (COCI17_plahte) C++14
160 / 160
569 ms 36640 KB
#include<bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define ii pair<int,int>
#define all(x) (x).begin(),(x).end()
#define INF 100000000000000000
#define modulo 1000000007
#define mod 998244353
using namespace std;
struct Rect{
      int dx,dy,ux,uy,id;
      Rect(int a,int b,int c,int d,int e){
            dx=a,dy=b,ux=c,uy=d,id=e;
      }
};
struct Ball{
      int x,y,color,id;
      Ball(int a,int b,int c,int d){
            x=a,y=b,color=c,id=d;
      }
};
vector<Rect> arr;
vector<Ball> shot;
vector<int> Xl;
map<int,int>ptr;
vector<int>seg;
set<int> data[100000];
vector<int> indeg(100000,0);
vector<int>adj[100000];
vector<int> ans(100000,0);
int S,ind=0;
struct W{
      int w,id;
      W(int a,int b){
            w=a,id=b;
      }
      bool operator<(W& A){
            int x,X;
            if(w)x=arr[id].ux;
            else x=shot[id].x;
            if(A.w)X=arr[A.id].ux;
            else X=shot[A.id].x;
            return x<X||(x==X&&w<A.w);
      }
};
vector<W>X;
bool sort_by_dx(int a,int b){
      return arr[a].dx<arr[b].dx;
}
void swap(map<int,int>& data,int w,int q){
      int e=data[w];
      data.erase(w);
      data[q]=e;
}
int get(int a,int b){
      if(a==-1)return b;
      if(b==-1)return a;
      if(arr[a].uy<arr[b].uy)return b;
      else return a;
}
void build(){
      S=(1<<(int)ceil(log2(seg.size())));
      int l=S-seg.size();
      for(int i=0;i<l;i++)seg.pb(-1);
      reverse(all(seg));
      for(int i=1;i<seg.size();i+=2){
            seg.pb(get(seg[i],seg[i-1]));
      }
      seg.pb(-1);
      reverse(all(seg));
}
void update(int j){
      while(j>0){
            seg[j]=get(seg[j*2],seg[j*2+1]);
            j/=2;
      }
}
void add(int id){
      int j=seg.size()-S+ptr[arr[id].dy];
      seg[j]=id;
      update(j/2);
}
void erase(int id){
      int j=seg.size()-S+ptr[arr[id].dy];
      seg[j]=-1;
      update(j/2);
}
int find(int j,int key){
      while(j*2<seg.size()){
            if(seg[j*2+1]!=-1&&arr[seg[j*2+1]].uy>=key)j=j*2+1;
            else if(seg[j*2]!=-1&&arr[seg[j*2]].uy>=key)j=j*2;
            else return -1;
      }
      if(seg[j]!=-1&&arr[seg[j]].uy>=key)
      return seg[j];
      else return -1;
}
int query(int j,int a,int b,int x,int y,int key){
      if(y<a||b<x)return -1;
      if(a<=x&&y<=b){
            return find(j,key);
      }
      int q=query(j*2+1,a,b,(x+y)/2+1,y,key);
      int w=query(j*2,a,b,x,(x+y)/2,key);
      if(q==-1)return w;
      else return q;
}
void dfs(int x){
      for(int i=0;i<adj[x].size();i++){
            int y=adj[x][i];
            dfs(y);
            if(data[x].size()<data[y].size())swap(data[x],data[y]);
            for(set<int>::iterator itr=data[y].begin();itr!=data[y].end();itr++)data[x].insert(*itr);
            data[y].clear();
      }
      ans[x]=data[x].size();
}
int32_t main(){
      ios_base::sync_with_stdio(false);
      cin.tie(NULL);
   //   freopen("q.gir","r",stdin);
   //   freopen("q.cik","w",stdout);
      int n,m;
      cin>>n>>m;
      for(int i=0;i<n;i++){
            int a,b,c,d;
            cin>>a>>b>>c>>d;
            arr.pb(Rect(a,b,c,d,i));
            Xl.pb(i);
            X.pb(W(1,i));
            ptr[b]=0;
      }
      for(int i=0;i<m;i++){
            int a,b,c;
            cin>>a>>b>>c;
            shot.pb(Ball(a,b,c,i));
            X.pb(W(0,i));
            ptr[b]=0;
      }
      sort(all(Xl),sort_by_dx);
      sort(all(X));
      for(map<int,int>::iterator itr=ptr.begin();itr!=ptr.end();itr++){
            itr->second=ind++;
      }
      seg.resize(ptr.size(),-1);
      build();
      ind=0;
      for(int i=0;i<n;i++){
            int id=Xl[i];
            while(ind<X.size()){
                  int w=X[ind].w,d=X[ind].id;
                  ///erasing part
                  if(w){
                        if(arr[d].ux<arr[id].dx){
                              erase(d);
                        }
                        else break;
                  }
                  ///query part
                  else{
                        if(shot[d].x<arr[id].dx){
                              int q=query(1,0,ptr[shot[d].y],0,S-1,shot[d].y);
                              if(q!=-1){
                                    data[q].insert(shot[d].color);
                              }
                        }
                        else break;
                  }
                  ind++;
            }
            int q=query(1,0,ptr[arr[id].dy],0,S-1,arr[id].uy);
            add(id);
            if(q!=-1){
                  adj[q].pb(id);
                  indeg[id]++;
            }
      }
      while(ind<X.size()){
            int w=X[ind].w,d=X[ind].id;
            if(w){
                  erase(d);
            }
            else{
                  int q=query(1,0,ptr[shot[d].y],0,S-1,shot[d].y);
                  if(q!=-1){
                        data[q].insert(shot[d].color);
                  }
            }
            ind++;
      }
      for(int i=0;i<n;i++){
            if(indeg[i]==0){
                  dfs(i);
            }
      }
      for(int i=0;i<n;i++)cout<<ans[i]<<"\n";
}

Compilation message

plahte.cpp: In function 'void build()':
plahte.cpp:66:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for(int i=1;i<seg.size();i+=2){
                   ~^~~~~~~~~~~
plahte.cpp: In function 'int find(int, int)':
plahte.cpp:89:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       while(j*2<seg.size()){
             ~~~^~~~~~~~~~~
plahte.cpp: In function 'void dfs(int)':
plahte.cpp:109:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for(int i=0;i<adj[x].size();i++){
                   ~^~~~~~~~~~~~~~
plahte.cpp: In function 'int32_t main()':
plahte.cpp:150:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(ind<X.size()){
                   ~~~^~~~~~~~~
plahte.cpp:178:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       while(ind<X.size()){
             ~~~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 148 ms 15756 KB Output is correct
2 Correct 168 ms 15500 KB Output is correct
3 Correct 9 ms 8184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 179 ms 17936 KB Output is correct
2 Correct 171 ms 16728 KB Output is correct
3 Correct 9 ms 8184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 332 ms 25668 KB Output is correct
2 Correct 320 ms 21852 KB Output is correct
3 Correct 9 ms 8184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 568 ms 36640 KB Output is correct
2 Correct 569 ms 30600 KB Output is correct
3 Correct 9 ms 8184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 558 ms 34692 KB Output is correct
2 Correct 522 ms 29788 KB Output is correct
3 Correct 9 ms 8184 KB Output is correct