题目:Christmas Trees
examples:
2 6
1 5
output
8
-1 2 6 4 0 3
examples:
3 5
0 3 1
output
7
5 -2 4 -1 2
题意:
求所有人到各自距离最近的树的距离之和,注意不同的yi,xi;
思路:
不断将人放入树两旁,先将距树距离为1的地方放人,在距离为2的地方,以此类推。最多放入2*105次,不会超时。
代码:
#include<bits/stdc++.h>
using namespace std;
struct s{
int x,y;
}us[200050],uss[200005];
int e[1000005];
int usss[1000006]={0};
int cmp(s s1,s s2){
return s1.x>s2.x;
}
priority_queue <int,vector<int>,greater<int> > que;
int main(){
int n;
int sum=0;
cin>>n;
for(int i=1;i<=n;i++){
int b;
cin>>b;
if(us[b].x==0){
sum++;
que.push(b);
}
us[b].x++;
us[b].y=b;
uss[b].x++;
uss[b].y=b;
}
int ans=0;
for(int i=1;i<=n;i++){
if(us[i].x>0){
ans++;
i+=2;
}
}
int flag=0;
int flagg=0;
int h;
while(!que.empty()){
int p=que.top();
que.pop();
if(uss[uss[p].y].x>=1&&(uss[uss[p].y-1].x==0&&usss[uss[p].y-1]==0)){
uss[uss[p].y].x--;
uss[uss[p].y-1].x++;
if(uss[uss[p].y].x>0&&uss[uss[p].y-1].x==1){
sum++;
}
}
if(uss[uss[p].y].x>=1){
if(uss[uss[p].y].x==1&&usss[uss[p].y]==1)
usss[uss[p].y+1]=1;
else if(uss[uss[p].y].x>1)
usss[uss[p].y+1]=1;
if(uss[uss[p].y+1].x==0&&usss[uss[p].y+1]==1){
sum++;
}
}
}
cout<<ans<<" "<<sum;
}