hiho week 245 register

Ended

Participants:153

Verdict:Accepted
Score:100 / 100
Submitted:2019-03-12 21:52:08

Lang:G++

Edit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<bits/stdc++.h>
#define re register
#define FOR(i,L,R) for(re int i=L,i##_end=R;i<=i##_end;i++)
#define ROF(i,L,R) for(re int i=R,i##_start=L;i>=i##_start;i--)
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
int n,x,y;
int mp[1005][1005]={0};
int ans1=0,ans2=0,ans3=0;
int f[1001051];
int nx[]={0,1,0,-1},ny[]={1,0,-1,0};
inline int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int main()
{
    for(int i=0;i<=1001050;i++) f[i]=i;
    scanf("%d",&n);
    for(re int i=1;i<=n;i++)
    {
        scanf("%d %d",&x,&y);
        x++,y++,ans1++,ans3+=4;
        mp[x][y]=1;
        for(re int j=0;j<4;j++)
            if(mp[x+nx[j]][y+ny[j]])
                if(find((x+nx[j])*1000+y+ny[j])!=find(x*1000+y))
                    f[find((x+nx[j])*1000+y+ny[j])]=find(x*1000+y),ans1--,ans3-=2;
                else ans3-=2;
        printf("%d %d %d\n",ans1,i,ans3);
    }
    return 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX