Submission #268714

#TimeUsernameProblemLanguageResultExecution timeMemory
268714MKopchevCollapse (JOI18_collapse)C++14
5 / 100
15099 ms11776 KiB
#include "collapse.h"
#include<bits/stdc++.h>
using namespace std;

const int nmax=1e5+42;

vector< pair<int/*cut*/,int/*id*/> >seen[nmax];

set< pair<int,int> > edges;

int parent[nmax];

int components;

int root(int node)
{
    while(parent[node]!=node)node=parent[node];
    return node;
}
void my_merge(int u,int v)
{
    u=root(u);
    v=root(v);

    if(u==v)return;

    components--;

    parent[u]=v;
}
std::vector<int> simulateCollapse(
	int N,
	std::vector<int> T,
	std::vector<int> X,
	std::vector<int> Y,
	std::vector<int> W,
	std::vector<int> P)
{
	for(int i=0;i<W.size();i++)
        seen[W[i]].push_back({P[i],i});

	int C=T.size();

	for(int i=0;i<C;i++)
        if(X[i]>Y[i])swap(X[i],Y[i]);

	vector<int> outp(W.size(),N);

	for(int i=0;i<T.size();i++)
	{
	    if(T[i]==0)edges.insert({X[i],Y[i]});
	    else edges.erase({X[i],Y[i]});
        /*
	    cout<<i<<" : "<<endl;
	    for(auto k:edges)cout<<k.first<<" "<<k.second<<endl;
        */
	    for(auto k:seen[i])
        {
            components=N;
            for(int j=0;j<N;j++)parent[j]=j;

            for(auto p:edges)
                if((p.first<=k.first&&p.second<=k.first)||(p.first>k.first&&p.second>k.first))my_merge(p.first,p.second);

            //cout<<k.first<<" -> "<<components<<endl;

            outp[k.second]=components;
        }
	}
	return outp;
}
/*
int main()
{
	int N, C, Q;
	scanf("%d%d%d", &N, &C, &Q);
	std::vector<int> T(C), X(C), Y(C);
	for(int i = 0; i < C; i++) {
		scanf("%d%d%d", &T[i], &X[i], &Y[i]);
	}
	std::vector<int> W(Q), P(Q);
	for(int i = 0; i < Q; i++) {
		scanf("%d%d", &W[i], &P[i]);
	}
	auto res = simulateCollapse(N, T, X, Y, W, P);
	for(auto i : res) {
		printf("%d\n", i);
	}
}
*/

Compilation message (stderr)

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:39:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |  for(int i=0;i<W.size();i++)
      |              ~^~~~~~~~~
collapse.cpp:49:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |  for(int i=0;i<T.size();i++)
      |              ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...