結果

問題 No.416 旅行会社
ユーザー tailstails
提出日時 2020-11-05 22:31:13
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 69 ms / 4,000 ms
コード長 1,477 bytes
コンパイル時間 960 ms
コンパイル使用メモリ 56,448 KB
実行使用メモリ 14,208 KB
最終ジャッジ日時 2024-05-08 16:00:47
合計ジャッジ時間 3,216 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 14 ms
8,832 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 2 ms
5,376 KB
testcase_04 AC 2 ms
5,376 KB
testcase_05 AC 2 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 2 ms
5,376 KB
testcase_08 AC 3 ms
5,376 KB
testcase_09 AC 4 ms
5,376 KB
testcase_10 AC 21 ms
8,832 KB
testcase_11 AC 23 ms
11,136 KB
testcase_12 AC 23 ms
11,008 KB
testcase_13 AC 17 ms
11,136 KB
testcase_14 AC 66 ms
13,632 KB
testcase_15 AC 66 ms
13,952 KB
testcase_16 AC 69 ms
14,208 KB
testcase_17 AC 66 ms
13,920 KB
testcase_18 AC 65 ms
13,760 KB
testcase_19 AC 40 ms
10,496 KB
testcase_20 AC 40 ms
10,240 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#pragma GCC optimize("Ofast")
#pragma GCC target("avx2")

#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <algorithm>

#define RD(v) int v=0;{int _c;while(_c=*rp++-48,_c>=0)v=v*10+_c;}

long ab[200000];
long cd[200000];
char xx[200000];

int en[100001];
int ei[100001];
int eb[400000];

long wbuf[100001];
long d;

void f(int i){
	if(!wbuf[i]){
		wbuf[i]=d;
		for(int k=0;k<en[i];++k){
			f(eb[ei[i]+k]);
		}
	}
}

int main(){
	char*rp=static_cast<char*>(mmap(0l,7l*800005,1,2,0,0ll));

	RD(n);
	RD(m);
	RD(q);
	
	for(int i=0;i<m;++i){
		RD(a);
		RD(b);
		ab[i]=(long)a<<32|b;
		++en[a];
		++en[b];
	}
	{
		int s=0;
		for(int i=0;++i<=n;){
			ei[i]=s;
			s+=en[i];
			en[i]=0;
		}
	}
	std::sort(ab,ab+m);
	for(int i=0;i<q;++i){
		RD(c);
		RD(d);
		cd[i]=(long)c<<32|d;
		xx[std::lower_bound(ab,ab+m,cd[i])-ab]=1;
	}
	for(int i=0;i<m;++i){
		if(!xx[i]){
			int a=ab[i]>>32;
			int b=ab[i];
			eb[ei[a]+en[a]++]=b;
			eb[ei[b]+en[b]++]=a;
		}
	}
	d=-1;
	f(1);
	for(int i=q;i--;){
		d=i+1;
		int a=cd[i]>>32;
		int b=cd[i];
		if(wbuf[a]) f(b);
		if(wbuf[b]) f(a);
		eb[ei[a]+en[a]++]=b;
		eb[ei[b]+en[b]++]=a;
	}
	for(int i=2;i<=n;++i){
		int z=wbuf[i];
		wbuf[i]=
			z<0?0x0a2020202020312dl:
			(z>=100000?z/100000%10+48l:32l)<< 0|
			(z>= 10000?z/ 10000%10+48l:32l)<< 8|
			(z>=  1000?z/  1000%10+48l:32l)<<16|
			(z>=   100?z/   100%10+48l:32l)<<24|
			(z>=    10?z/    10%10+48l:32l)<<32|
			z%10+0x0a2030l<<40;
	}
	write(1,wbuf+2,(n-1)*8);
	_exit(0);
}
0