제출 #794084

#제출 시각아이디문제언어결과실행 시간메모리
794084JakobZorzThe Potion of Great Power (CEOI20_potion)C++14
17 / 100
820 ms262148 KiB
#include<iostream> #include<vector> #include<unordered_set> #include<unordered_map> using namespace std; typedef long long ll; const int TREE_SIZE=1<<30; const int NUM_NODES=1e8; int val[NUM_NODES]; int ch1[NUM_NODES]; int ch2[NUM_NODES]; vector<int>*elements[NUM_NODES]; int curr_node=1; void collect_fn(int node,int l,int r){ if(l==r-1){ if(val[node]!=0){ elements[node]=new vector<int>; elements[node]->push_back(l); } return; } int m=(l+r)/2; if(ch1[node]!=0) collect_fn(ch1[node],l,m); if(ch2[node]!=0) collect_fn(ch2[node],m,r); if(elements[ch1[node]]==nullptr) elements[node]=elements[ch2[node]]; else if(elements[ch2[node]]==nullptr) elements[node]=elements[ch1[node]]; else{ vector<int>*a=elements[ch1[node]],*b=elements[ch2[node]]; elements[node]=new vector<int>(a->begin(),a->end()); elements[node]->insert(elements[node]->end(),b->begin(),b->end()); } } void collect(int node){ collect_fn(node,0,TREE_SIZE); } int insert_fn(int old_node,int x,int q,int l,int r){ if(x<l||r<=x) return old_node; int node=curr_node++; if(old_node){ ch1[node]=ch1[old_node]; ch2[node]=ch2[old_node]; val[node]=val[old_node]; } if(l==r-1){ val[node]+=q; }else{ int m=(l+r)/2; ch1[node]=insert_fn(ch1[node],x,q,l,m); ch2[node]=insert_fn(ch2[node],x,q,m,r); } if(ch1[node]==0&&ch2[node]==0&&val[node]==0) return 0; return node; } int insert(int old_node,int x,int q){ return insert_fn(old_node,x,q,0,TREE_SIZE); } // time travelling multiset class TTMS{ vector<int>days; vector<int>sets; public: TTMS(){ days={-1}; sets={curr_node++}; } void add_new_day(int day){ days.push_back(day); sets.push_back(sets.back()); } void insert(int el){ sets.back()=::insert(sets.back(),el,1); } void remove(int el){ sets.back()=::insert(sets.back(),el,-1); } vector<int>* get(int day){ int l=0,r=(int)sets.size(); while(l!=r-1){ int m=(l+r)/2; if(day<days[m]) r=m; else l=m; } collect(sets[l]); return elements[sets[l]]; } }; int get_closest(vector<int>&a,vector<int>&b){ int res=1e9; int i=0,j=0; while(i<(int)a.size()&&j<(int)b.size()){ res=min(res,abs(a[i]-b[j])); if(i<(int)a.size()&&a[i]<=b[j]) i++; else if(j<(int)b.size()&&b[j]<=a[i]) j++; } return res; } int n; int heights[100000]; TTMS ttms[100000]; void init(int N, int D, int H[]) { n=N; for(int i=0;i<n;i++) heights[i]=H[i]; } ll to(int a,int b){ if(a<b) swap(a,b); return a+((ll)b<<32); } void curseChanges(int U, int A[], int B[]) { unordered_set<ll>conns; for(int day=0;day<U;day++){ int a=A[day],b=B[day]; ll conn=to(a,b); ttms[a].add_new_day(day+1); ttms[b].add_new_day(day+1); if(conns.find(conn)==conns.end()){ conns.insert(conn); ttms[a].insert(heights[b]); ttms[b].insert(heights[a]); }else{ conns.erase(conn); ttms[a].remove(heights[b]); ttms[b].remove(heights[a]); } } } //unordered_map<ll,int>dp; int question(int x, int y, int v) { /*ll k=x+(ll)1e5*y+(ll)1e10*v; if(dp.find(k)!=dp.end()) return dp[k];*/ vector<int>*a=ttms[x].get(v); vector<int>*b=ttms[y].get(v); if(a==nullptr||b==nullptr) return 1e9; int res=get_closest(*a,*b); //dp[k]=res; return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...