说好的循环展开为程序带来几何倍效率提升呢!!
  • 板块学术版
  • 楼主Maxuejun
  • 当前回复13
  • 已保存回复13
  • 发布时间2023/11/26 17:27
  • 上次更新2023/11/26 19:37:32
查看原帖
说好的循环展开为程序带来几何倍效率提升呢!!
935711
Maxuejun楼主2023/11/26 17:27

题目传送门

//展开后 51ms
#include<bits/stdc++.h>
using namespace std;
int n;
int m;
int p;
int fa[200010];
int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-'){
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
void write(int x){
	if(x<0){
		x=-x;
		putchar('-');
	}
	if(x>9){
		write(x/10);
	}
	putchar(x%10+'0');
}
void init(){
	int t=n/4;
	for(int i=1;i<=t;i++){
		fa[i]=i;fa[i+1]=i+1;fa[i+2]=i+2;fa[i+3]=i+3;
	}
	for(int i=n-t*4;i<=n;i++){
		fa[i]=i;
	}
}
int findx(int x){
	if(fa[x]==x){
		return x;
	}
	else{
		return findx(fa[x]);
	}
}
void merge(int x,int y){
	fa[findx(x)]=findx(y);
}
int main(){
	n=read();m=read();p=read();
	int t1=m/4,t2=p/4;
	init();
	for(int i=1;i<=t1;i++){
		int a;
		int b;
		int c;
		int d;
		int e;
		int f;
		int g;
		int h;
		a=read();b=read();c=read();d=read();e=read();f=read();g=read();h=read();
		merge(a,b);merge(c,d);merge(e,f);merge(g,h);
	}
	for(int i=t1*4+1;i<=m;i++){
		int a;
		int b;
		a=read();b=read();
		merge(a,b);
	}
	for(int i=1;i<=t2;i++){
		int a;
		int b;
		int c;
		int d;
		int e;
		int f;
		int g;
		int h;
		a=read();b=read();c=read();d=read();e=read();f=read();g=read();h=read();
		if(findx(a)!=findx(b)){
			putchar('N');
			putchar('o');
			putchar('\n');
		}
		else{
			putchar('Y');
			putchar('e');
			putchar('s');
			putchar('\n');
		}
		if(findx(c)!=findx(d)){
			putchar('N');
			putchar('o');
			putchar('\n');
		}
		else{
			putchar('Y');
			putchar('e');
			putchar('s');
			putchar('\n');
		}
		if(findx(e)!=findx(f)){
			putchar('N');
			putchar('o');
			putchar('\n');
		}
		else{
			putchar('Y');
			putchar('e');
			putchar('s');
			putchar('\n');
		}
		if(findx(g)!=findx(h)){
			putchar('N');
			putchar('o');
			putchar('\n');
		}
		else{
			putchar('Y');
			putchar('e');
			putchar('s');
			putchar('\n');
		}
	}
	for(int i=t2*4+1;i<=p;i++){
		int a;
		int b;
		a=read();b=read();
		if(findx(a)!=findx(b)){
			putchar('N');
			putchar('o');
			putchar('\n');
		}
		else{
			putchar('Y');
			putchar('e');
			putchar('s');
			putchar('\n');
		}
	}
	return 0;
}
//展开前 50ms
#include<bits/stdc++.h>
using namespace std;
int n;
int m;
int p;
int fa[5010];
int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-'){
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
void write(int x){
	if(x<0){
		x=-x;
		putchar('-');
	}
	if(x>9){
		write(x/10);
	}
	putchar(x%10+'0');
}
void init(){
	int t=n/4;
	for(int i=1;i<=t;i++){
		fa[i]=i;fa[i+1]=i+1;fa[i+2]=i+2;fa[i+3]=i+3;
	}
	for(int i=n-t*4;i<=n;i++){
		fa[i]=i;
	}
}
int findx(int x){
	if(fa[x]==x){
		return x;
	}
	else{
		return findx(fa[x]);
	}
}
void merge(int x,int y){
	fa[findx(x)]=findx(y);
}
int main(){
	n=read();m=read();p=read();
	init();
	for(int i=1;i<=m;i++){
		int a;
		int b;
		a=read();b=read();
		merge(a,b);
	}
	for(int i=1;i<=p;i++){
		int a;
		int b;
		a=read();b=read();
		if(findx(a)!=findx(b)){
			putchar('N');
			putchar('o');
			putchar('\n');
		}
		else{
			putchar('Y');
			putchar('e');
			putchar('s');
			putchar('\n');
		}
	}
	return 0;
}
2023/11/26 17:27
加载中...