제출 #762979

#제출 시각아이디문제언어결과실행 시간메모리
762979vjudge1Just Long Neckties (JOI20_ho_t1)C++11
100 / 100
152 ms16948 KiB
#include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> #define int long long #define f first #define s second #define pii pair<int,int> #define piii pair<int,pair<int,int>> #define vii vector<vector<int>> #define vi vector<int> #define cd complex<double> #define endl '\n' //#define multipletest using namespace std; const int LIM=2e5; const int INF = 1e18; const string name="neckties"; int n,m; int b[LIM+5]; int ans[LIM+5]; vector<pii> a; int st1[4*LIM+5]; int st2[4*LIM+5]; int bound; int merge(int a,int b){ //CODE MERGE return max(a,b); } void build1(int id,int ss,int se){ //BUID INITTIALLY TREE if(ss==se){ st1[id]=max(0ll,a[ss].f - b[ss-1]); return; } int mid=(ss+se)>>1; build1(2*id+1,ss,mid); build1(2*id+2,mid+1,se); st1[id]=merge(st1[2*id+1],st1[2*id+2]); } int _query1(int id,int ss,int se,int qs,int qe){ //PROCESS if(ss>qe || se<qs){ return -INF; } if(qs<=ss && qe>=se){ // UPDATE NODE; return st1[id]; } int mid=(ss+se)>>1; int left_child=_query1(2*id+1,ss,mid,qs,qe); int right_child=_query1(2*id+2,mid+1,se,qs,qe); return merge(left_child,right_child); } int query1(int qs,int qe){ return _query1(0,1,bound,qs,qe); } void build2(int id,int ss,int se){ //BUID INITTIALLY TREE if(ss==se){ st2[id]=max(0ll,a[ss].f - b[ss]); return; } int mid=(ss+se)>>1; build2(2*id+1,ss,mid); build2(2*id+2,mid+1,se); st2[id]=merge(st2[2*id+1],st2[2*id+2]); } int _query2(int id,int ss,int se,int qs,int qe){ //PROCESS if(ss>qe || se<qs){ return -INF; } if(qs<=ss && qe>=se){ // UPDATE NODE; return st2[id]; } int mid=(ss+se)>>1; int left_child=_query2(2*id+1,ss,mid,qs,qe); int right_child=_query2(2*id+2,mid+1,se,qs,qe); return merge(left_child,right_child); } int query2(int qs,int qe){ return _query2(0,0,bound-1,qs,qe); } void solve(){ //CODE GOES HERE cin>>n; for(int i=0;i<=n;++i){ int x; cin>>x; a.push_back({x,i}); } for(int i=0;i<n;++i){ cin>>b[i]; } sort(a.begin(),a.end()); sort(b,b+n); build1(0,1,n); build2(0,0,n-1); bound = n; vector<int> v; // cout<<query2(0ll,0ll)<<endl; for(int i=0;i<=n;++i){ if(i==0){ ans[a[i].s] = st1[0]; } else if(i<n){ ans[a[i].s] = max(query2(0,i-1),query1(i+1,n)); } else{ ans[a[i].s]=query2(0ll,n-1); } } for(int i=0;i<=n;++i){ cout<<ans[i]<<" "; } } signed main(){ // freopen((name+".inp").c_str(),"r",stdin); // freopen((name+".out").c_str(),"w",stdout); // ifstream cin(".txt"); // ofstream cout(".txt"); //ifstream cin((name +".inp")); //ofstream cout((name +".ans")); ios_base::sync_with_stdio(false); cin.tie(NULL); int test; test=1; #ifdef multipletest cin>>test; #endif while(test--){ solve(); #ifdef DEBUG cerr << "Runtime is: " << clock() * 1.0 / CLOCKS_PER_SEC << endl; #endif } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...