#include #include #include #include using namespace std; typedef long long ll; typedef vector vint; typedef pair pint; typedef vector vpint; #define rep(i,n) for(int i=0;i<(n);i++) #define reps(i,f,n) for(int i=(f);i<(n);i++) #define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++) #define all(v) (v).begin(),(v).end() #define pb push_back #define mp make_pair #define fi first #define se second #define chmax(a, b) a = (((a)<(b)) ? (b) : (a)) #define chmin(a, b) a = (((a)>(b)) ? (b) : (a)) const int MOD = 1e9 + 7; const int INF = 1e9; int memo1[100010], memo2[100010]; int main(void){ int n; cin >> n; rep(i, 100010) memo1[i] = memo2[i] = 0; vector a, b; rep(i, 2 * n){ int t; cin >> t; if(t >= 0){ // printf("t %d\n", t); a.pb(t); memo1[t]++; }else{ // printf("t %d\n", t); t *= -1; b.pb(t); memo2[t]++; } } sort(all(a)); sort(all(b)); /* rep(i, a.size()){ printf("%d ", a[i]); } printf("\n"); rep(i, b.size()){ printf("%d ", b[i]); } printf("\n"); */ //moist int moist = 0; rep(i, 100010){ // printf("%d %d\n", memo1[i], memo2[i]); if(memo1[i]> 0 && memo2[i] > 0){ moist += min(memo1[i], memo2[i]); } } moist += memo1[0] / 2; // printf("moist %d\n", moist); //wet int wet = 0; int l = 0, r = 0; int usedzero = 0; while(r < a.size() && l < b.size()){ while(a[r] - b[l] < 1)r++; wet++; if(a[r] == 0) usedzero++; l++; r++; if(l == b.size()) break; } int notzero = a.size() - wet - memo1[0]; if(notzero >= memo1[0]) wet += (notzero + memo1[0]) / 2; else wet += notzero; // printf("wet %d\n", wet); int dry = 0; l = 0, r = 0; while(r < b.size() && l < a.size()){ while(b[r] - a[l] < 1)r++; dry++; // printf("l %d r %d\n", l, r); l++; r++; if(l == a.size()) break; } // printf("dry %d\n", dry); dry += (b.size() - dry) / 2; printf("%d %d %d\n", dry, wet, moist); return 0; }