Submission #80250

#TimeUsernameProblemLanguageResultExecution timeMemory
80250KLPP자리 배치 (IOI18_seats)C++14
0 / 100
4032 ms41768 KiB
#include "seats.h" #include<iostream> #include<vector> using namespace std; typedef long long int lld; int h,w; int per[1000000]; int inv[1000000]; int arr[1000000]; //segtree int sum[1000000]; int minimo[1000000]; int counter[1000000]; void update_pos(int i){ int pos=inv[i]; arr[i]=-1; if(pos==0 || per[pos-1]>i){ arr[i]++; } if(pos==w-1 || per[pos+1]>i){ arr[i]++; } } void build(int a, int b, int node){ if(a==b){ sum[node]=arr[a]; minimo[node]=arr[a]; counter[node]=1; return; } int mid=(a+b)/2; build(a,mid,2*node); build(mid+1,b,2*node+1); sum[node]=sum[2*node]+sum[2*node+1]; minimo[node]=min(minimo[2*node],minimo[2*node+1]+sum[2*node]); counter[node]=0; if(minimo[node]==minimo[2*node]){ counter[node]+=counter[2*node]; } if(minimo[node]==minimo[2*node+1]+sum[2*node]){ counter[node]+=counter[2*node+1]; } } void update(int a, int b, int node, int pos){ if(pos<a || b<pos)return; if(a==b){ sum[node]=arr[a]; minimo[node]=arr[a]; counter[node]=1; return; } int mid=(a+b)/2; update(a,mid,2*node,pos); update(mid+1,b,2*node+1,pos); sum[node]=sum[2*node]+sum[2*node+1]; minimo[node]=min(minimo[2*node],minimo[2*node+1]+sum[2*node]); counter[node]=0; if(minimo[node]==minimo[2*node]){ counter[node]+=counter[2*node]; } if(minimo[node]==minimo[2*node+1]+sum[2*node]){ counter[node]+=counter[2*node+1]; } } void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) { h=H; w=W; for(int i=0;i<w;i++){ inv[i]=C[i]; per[C[i]]=i; } for(int i=0;i<w;i++){ int pos=inv[i]; arr[i]=-1; if(pos==0 || per[pos-1]>i){ arr[i]++; } if(pos==w-1 || per[pos+1]>i){ arr[i]++; } //cout<<arr[i]<<endl; } build(0,w-1,1); //cout<<counter[1]<<endl; /*for(int i=1;i<8;i++){ cout<<counter[i]<<" "<<i<<endl; }*/ } int swap_seats(int a, int b) { int pos_a=inv[a]; int pos_b=inv[b]; swap(inv[a],inv[b]); swap(per[pos_a],per[pos_b]); update_pos(a); update(0,w-1,1,a); update_pos(b); update(0,w-1,1,b); if(inv[a]>0){ update_pos(per[inv[a]-1]); update(0,w-1,1,per[inv[a]-1]); } if(inv[a]<w-1){ update_pos(per[inv[a]+1]); update(0,w-1,1,per[inv[a]+1]); } if(inv[b]>0){ update_pos(per[inv[b]-1]); update(0,w-1,1,per[inv[b]-1]); } if(inv[b]<w-1){ update_pos(per[inv[b]+1]); update(0,w-1,1,per[inv[b]+1]); } int ans=0; int sum=0; for(int i=0;i<w;i++){ sum+=arr[i]; if(sum==1)ans++; } return ans; }
#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...