Submission #199194

#TimeUsernameProblemLanguageResultExecution timeMemory
199194FerThugGato12500Split the Attractions (IOI19_split)C++14
40 / 100
195 ms17892 KiB
#include "split.h"
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
bool vis[100001];
bool mark[100001];
bool used[100001];
int ch[2][100001];
int ex[2][100001];
bool z;
typedef struct 
{
	int t, ind;
}An;
queue<An> bfs;
int n, m, q;
vector<int> ed[100001];
vector<int> fb[100001];
void extend(int ind)
{
	An te, ta;
	te.ind=ind; te.t=1;
	bfs.push(te);
	int bg=-1;
	vis[ind]=true;
	while(bfs.size()>0)
	{
		te=bfs.front(); bfs.pop();
		bg=max(bg, te.t);
		ex[z][te.ind]=te.t;
		fb[te.t].push_back(te.ind);
		for(int i = 0; i < ed[te.ind].size(); i++)
			if(!vis[ed[te.ind][i]])
			{
				vis[ed[te.ind][i]]=true;
				ta.ind=ed[te.ind][i];
				ta.t=te.t+1;
				bfs.push(ta);
			}
	}
	for(int i = bg; i > 0; i--)
	{
		for(int k = 0; k < fb[i].size(); k++)
		{
			int D=1;
			int ind=fb[i][k];
			for(int j = 0; j < ed[ind].size(); j++)
				if(!mark[ed[ind][j]] && ex[z][ed[ind][j]]>i)
				{
					mark[ed[ind][j]]=true;
					D+=ch[z][ed[ind][j]];
				}
			ch[z][ind]=D;
		}
	}
	return;
}
int N, r;
void busca(int ind)
{
	bool c=true;
	used[ind]=true;
	for(int i = 0; i < ed[ind].size(); i++)
		if(!used[ed[ind][i]] && ch[z][ed[ind][i]]>N)
		{ c=false; break; }
	if(c && n-ch[z][ind]<N)
	{ r=ind; return; }
	for(int i = 0; i < ed[ind].size(); i++)
		if(!used[ed[ind][i]] && r==-1)
			busca(ed[ind][i]);
	return;
}
typedef struct 
{
	int ind, nd;
}Wasd;
bool operator < (const Wasd &a, const Wasd &b)
{
	return a.nd<b.nd;
}
Wasd need[3];
typedef struct 
{
	int ind, ch;
}Re;
bool operator < (const Re &a, const Re &b)
{
	return a.ch>b.ch;
}
priority_queue<Re> mqun;
int ans[100001];
int it;
int esaq[100001];
void poder(int ind)
{
	if(r==need[0].nd)
		return;
	r++;
	esaq[ind]=it;
	if(z) ans[ind]=need[0].ind;
	for(int i = 0; i < ed[ind].size(); i++)
		if(!vis[ed[ind][i]] && esaq[ed[ind][i]]!=it && r<need[0].nd)
			poder(ed[ind][i]);
	return;
}
vector<int> find_split(int s, int a, int b, int c, vector<int> p, vector<int> q)
{
	n = s; m=p.size(); 
	need[0].nd = a; need[1].nd = b; need[2].nd = c;
	need[0].ind=1; need[1].ind=2; need[2].ind=3;
	sort(need, need+3);
	int x, y;
	for(int i = 0; i < m; i++)
	{
		x=p[i]; y=q[i];
		ed[x].push_back(y);
		ed[y].push_back(x);
	}
	z=0;
	extend(0);
	N=(n+1)/2;
	r=-1;
	busca(0);
	int centroide=r;
	memset(vis, false, sizeof(vis));
	memset(mark, false, sizeof(mark));
	for(int i = 0; i < 100001; i++)
		fb[i].clear();
	z=1;
	extend(centroide);
	Re te, ta;
	ta.ch=ch[1][centroide]; 
	ta.ind=centroide;
	mqun.push(ta);
	memset(vis, false, sizeof(vis));
	int D=0;
	while(D<need[1].nd)
	{
		ta=mqun.top(); mqun.pop();
		if(!vis[ta.ind])
		{
			D++;
			vis[ta.ind]=true;
			ans[ta.ind]=need[1].ind;
			for(int i = 0; i < ed[ta.ind].size(); i++)
				if(!vis[ed[ta.ind][i]])
				{
					te.ind=ed[ta.ind][i];
					te.ch=ch[1][ed[ta.ind][i]];
					mqun.push(te);
				}
		}
	}
	z=false;
	for(int i = 0; i < ed[centroide].size(); i++)
		if(ans[ed[centroide][i]]==0)
		{
			r=0;
			it++;
			poder(ed[centroide][i]);
			if(r==need[0].nd)
			{
				r=0;
				it++;
				z=true;
				poder(ed[centroide][i]);
				break;
			}
		}
	vector<int> res;
	if(!z)
	{
		for(int i = 0; i < n; i++)
			res.push_back(0);
		return res;
	}
	for(int i = 0; i < n; i++)
		if(ans[i]==0)
			res.push_back(need[2].ind);
		else res.push_back(ans[i]);
	return res;
}

Compilation message (stderr)

split.cpp: In function 'void extend(int)':
split.cpp:35:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < ed[te.ind].size(); i++)
                  ~~^~~~~~~~~~~~~~~~~~~
split.cpp:46:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int k = 0; k < fb[i].size(); k++)
                  ~~^~~~~~~~~~~~~~
split.cpp:50:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int j = 0; j < ed[ind].size(); j++)
                   ~~^~~~~~~~~~~~~~~~
split.cpp: In function 'void busca(int)':
split.cpp:66:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < ed[ind].size(); i++)
                 ~~^~~~~~~~~~~~~~~~
split.cpp:71:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < ed[ind].size(); i++)
                 ~~^~~~~~~~~~~~~~~~
split.cpp: In function 'void poder(int)':
split.cpp:104:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < ed[ind].size(); i++)
                 ~~^~~~~~~~~~~~~~~~
split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:148:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int i = 0; i < ed[ta.ind].size(); i++)
                   ~~^~~~~~~~~~~~~~~~~~~
split.cpp:158:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < ed[centroide].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...
#Verdict Execution timeMemoryGrader output
Fetching results...