Submission #220491

# Submission time Handle Problem Language Result Execution time Memory
220491 2020-04-08T02:10:47 Z arnold518 Collapse (JOI18_collapse) C++14
100 / 100
10712 ms 19052 KB
#include "collapse.h"
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
 
const int MAXN = 1e5;
const int SQ = 1000;
 
struct Query { int t, x, y, p; };
 
int N, C, Q;
Query A[MAXN+10], B[MAXN+10], V[MAXN*2+10];
vector<int> ans;
 
struct UF
{
	int par[MAXN+10], sz[MAXN+10];
	vector<int> S;
	void init()
	{
		int i, j;
		S.clear();
		for(i=1; i<=N; i++) par[i]=i, sz[i]=1;
	}
	int Find(int x) { return x==par[x] ? x : Find(par[x]); }
	int Union(int x, int y)
	{
		x=Find(x); y=Find(y);
		if(x==y) return 0;
		if(sz[x]<sz[y]) swap(x, y);
		sz[x]+=sz[y]; par[y]=x;
		S.push_back(y);
		return 1;
	}
	void restore()
	{
		int v=S.back(); S.pop_back();
		sz[par[v]]-=sz[v];
		par[v]=v;
	}
}uf;
 
vector<int> simulateCollapse(int _N, vector<int> _T, vector<int> _X, vector<int> _Y, vector<int> _W, vector<int> _P)
{
	int i, j, k, p, q;
 
	N=_N; C=_T.size(); Q=_W.size(); ans.resize(Q, N);
	for(i=0; i<C; i++) if(_X[i]>_Y[i]) swap(_X[i], _Y[i]);
	for(i=0; i<C; i++) A[i+1]={_T[i], _X[i]+1, _Y[i]+1, i+1};
	for(i=0; i<Q; i++) B[i+1]={-1, _P[i]+1, i, _W[i]+1};
 
	for(i=1; i<=C; i++) V[i]=A[i];
	for(i=1; i<=Q; i++) V[i+C]=B[i];
 
	sort(V+1, V+C+Q+1, [&](const Query &p, const Query &q)
	{
		if(p.p!=q.p) return p.p<q.p;
		else return p.t>q.t;
	});
 
	for(i=0; i<=(C+Q)/SQ; i++)
	{
		int l=max(1, i*SQ), r=min(C+Q, (i+1)*SQ-1);
		set<pii> S;
		vector<pii> E1, E2;
		vector<int> query;
 
		for(j=1; j<l; j++)
		{
			if(V[j].t==0) S.insert({V[j].x, V[j].y});
			else if(V[j].t==1) S.erase({V[j].x, V[j].y});
		}
		for(j=l; j<=r; j++)
		{
			if(V[j].t==-1)
			{
				query.push_back(j);
			}
			else
			{
				if(S.count({V[j].x, V[j].y}))
				{
					S.erase({V[j].x, V[j].y});
					E2.push_back({V[j].x, V[j].y});
				}
			}
		}
		for(auto it : S) E1.push_back(it);
 
		sort(E1.begin(), E1.end(), [&](const pii &p, const pii &q) { return p.second<q.second; });
		sort(E2.begin(), E2.end(), [&](const pii &p, const pii &q) { return p.second<q.second; });
		sort(query.begin(), query.end(), [&](const int &p, const int &q) { return V[p].x<V[q].x; });
 
		uf.init(); j=0;
		for(auto &it : query)
		{
			for(; j<E1.size() && E1[j].second<=V[it].x; j++) uf.Union(E1[j].first, E1[j].second);
			set<pii> S1, S2;
			for(p=l; p<=it; p++)
			{
				if(V[p].t==-1) continue;
				if(V[p].y>V[it].x) continue;
				if(V[p].t==0) S1.insert({V[p].x, V[p].y});
				else S1.erase({V[p].x, V[p].y});
				S2.insert({V[p].x, V[p].y});
			}
			int cnt=0;
			for(auto jt : S1) cnt+=uf.Union(jt.first, jt.second);
			for(auto jt : E2) if(jt.second<=V[it].x && !S2.count(jt)) cnt+=uf.Union(jt.first, jt.second);
			ans[V[it].y]-=uf.S.size();
			while(cnt--) uf.restore();
		}
 
		sort(E1.begin(), E1.end(), [&](const pii &p, const pii &q) { return p.first>q.first; });
		sort(E2.begin(), E2.end(), [&](const pii &p, const pii &q) { return p.first>q.first; });
		sort(query.begin(), query.end(), [&](const int &p, const int &q) { return V[p].x>V[q].x; });
 
		uf.init(); j=0;
		for(auto &it : query)
		{
			for(; j<E1.size() && E1[j].first>V[it].x; j++) uf.Union(E1[j].first, E1[j].second);
			set<pii> S1, S2;
			for(p=l; p<=it; p++)
			{
				if(V[p].t==-1) continue;
				if(V[p].x<=V[it].x) continue;
				if(V[p].t==0) S1.insert({V[p].x, V[p].y});
				else S1.erase({V[p].x, V[p].y});
				S2.insert({V[p].x, V[p].y});
			}
			int cnt=0;
			for(auto jt : S1) cnt+=uf.Union(jt.first, jt.second);
			for(auto jt : E2) if(jt.first>V[it].x && !S2.count(jt)) cnt+=uf.Union(jt.first, jt.second);
			ans[V[it].y]-=uf.S.size();
			while(cnt--) uf.restore();
		}
	}
 
	return ans;
}

Compilation message

collapse.cpp: In member function 'void UF::init()':
collapse.cpp:24:10: warning: unused variable 'j' [-Wunused-variable]
   int i, j;
          ^
collapse.cpp: In function 'std::vector<int> simulateCollapse(int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
collapse.cpp:100:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(; j<E1.size() && E1[j].second<=V[it].x; j++) uf.Union(E1[j].first, E1[j].second);
          ~^~~~~~~~~~
collapse.cpp:124:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(; j<E1.size() && E1[j].first>V[it].x; j++) uf.Union(E1[j].first, E1[j].second);
          ~^~~~~~~~~~
collapse.cpp:48:12: warning: unused variable 'k' [-Wunused-variable]
  int i, j, k, p, q;
            ^
collapse.cpp:48:18: warning: unused variable 'q' [-Wunused-variable]
  int i, j, k, p, q;
                  ^
# Verdict Execution time Memory Grader output
1 Correct 15 ms 896 KB Output is correct
2 Correct 9 ms 640 KB Output is correct
3 Correct 12 ms 640 KB Output is correct
4 Correct 12 ms 640 KB Output is correct
5 Correct 100 ms 896 KB Output is correct
6 Correct 228 ms 1144 KB Output is correct
7 Correct 9 ms 640 KB Output is correct
8 Correct 10 ms 640 KB Output is correct
9 Correct 141 ms 1016 KB Output is correct
10 Correct 227 ms 1016 KB Output is correct
11 Correct 229 ms 1272 KB Output is correct
12 Correct 240 ms 1272 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 99 ms 6088 KB Output is correct
2 Correct 107 ms 5880 KB Output is correct
3 Correct 2154 ms 11364 KB Output is correct
4 Correct 107 ms 5880 KB Output is correct
5 Correct 3227 ms 11564 KB Output is correct
6 Correct 363 ms 6448 KB Output is correct
7 Correct 7349 ms 17828 KB Output is correct
8 Correct 3096 ms 11452 KB Output is correct
9 Correct 123 ms 6648 KB Output is correct
10 Correct 127 ms 6660 KB Output is correct
11 Correct 208 ms 6776 KB Output is correct
12 Correct 3846 ms 12156 KB Output is correct
13 Correct 5793 ms 14728 KB Output is correct
14 Correct 7994 ms 18716 KB Output is correct
15 Correct 7239 ms 18788 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 109 ms 6008 KB Output is correct
2 Correct 105 ms 5880 KB Output is correct
3 Correct 118 ms 5880 KB Output is correct
4 Correct 114 ms 5880 KB Output is correct
5 Correct 164 ms 6008 KB Output is correct
6 Correct 457 ms 6512 KB Output is correct
7 Correct 6449 ms 14888 KB Output is correct
8 Correct 9874 ms 17688 KB Output is correct
9 Correct 142 ms 6648 KB Output is correct
10 Correct 236 ms 6776 KB Output is correct
11 Correct 9941 ms 18832 KB Output is correct
12 Correct 10712 ms 19052 KB Output is correct
13 Correct 10076 ms 19048 KB Output is correct
14 Correct 10513 ms 18992 KB Output is correct
15 Correct 9801 ms 18980 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 15 ms 896 KB Output is correct
2 Correct 9 ms 640 KB Output is correct
3 Correct 12 ms 640 KB Output is correct
4 Correct 12 ms 640 KB Output is correct
5 Correct 100 ms 896 KB Output is correct
6 Correct 228 ms 1144 KB Output is correct
7 Correct 9 ms 640 KB Output is correct
8 Correct 10 ms 640 KB Output is correct
9 Correct 141 ms 1016 KB Output is correct
10 Correct 227 ms 1016 KB Output is correct
11 Correct 229 ms 1272 KB Output is correct
12 Correct 240 ms 1272 KB Output is correct
13 Correct 99 ms 6088 KB Output is correct
14 Correct 107 ms 5880 KB Output is correct
15 Correct 2154 ms 11364 KB Output is correct
16 Correct 107 ms 5880 KB Output is correct
17 Correct 3227 ms 11564 KB Output is correct
18 Correct 363 ms 6448 KB Output is correct
19 Correct 7349 ms 17828 KB Output is correct
20 Correct 3096 ms 11452 KB Output is correct
21 Correct 123 ms 6648 KB Output is correct
22 Correct 127 ms 6660 KB Output is correct
23 Correct 208 ms 6776 KB Output is correct
24 Correct 3846 ms 12156 KB Output is correct
25 Correct 5793 ms 14728 KB Output is correct
26 Correct 7994 ms 18716 KB Output is correct
27 Correct 7239 ms 18788 KB Output is correct
28 Correct 109 ms 6008 KB Output is correct
29 Correct 105 ms 5880 KB Output is correct
30 Correct 118 ms 5880 KB Output is correct
31 Correct 114 ms 5880 KB Output is correct
32 Correct 164 ms 6008 KB Output is correct
33 Correct 457 ms 6512 KB Output is correct
34 Correct 6449 ms 14888 KB Output is correct
35 Correct 9874 ms 17688 KB Output is correct
36 Correct 142 ms 6648 KB Output is correct
37 Correct 236 ms 6776 KB Output is correct
38 Correct 9941 ms 18832 KB Output is correct
39 Correct 10712 ms 19052 KB Output is correct
40 Correct 10076 ms 19048 KB Output is correct
41 Correct 10513 ms 18992 KB Output is correct
42 Correct 9801 ms 18980 KB Output is correct
43 Correct 4455 ms 11400 KB Output is correct
44 Correct 8966 ms 17636 KB Output is correct
45 Correct 4738 ms 11720 KB Output is correct
46 Correct 9666 ms 17940 KB Output is correct
47 Correct 128 ms 6652 KB Output is correct
48 Correct 131 ms 6648 KB Output is correct
49 Correct 240 ms 6776 KB Output is correct
50 Correct 1111 ms 7988 KB Output is correct
51 Correct 5303 ms 12280 KB Output is correct
52 Correct 7272 ms 13520 KB Output is correct
53 Correct 7355 ms 13284 KB Output is correct
54 Correct 8302 ms 14848 KB Output is correct
55 Correct 8170 ms 15156 KB Output is correct
56 Correct 9267 ms 15896 KB Output is correct
57 Correct 9693 ms 17432 KB Output is correct
58 Correct 9869 ms 17724 KB Output is correct
59 Correct 9615 ms 18684 KB Output is correct
60 Correct 10537 ms 18780 KB Output is correct