站外题求助(悬2关)
  • 板块学术版
  • 楼主__ycy1124__
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/4 15:37
  • 上次更新2024/10/4 16:52:52
查看原帖
站外题求助(悬2关)
1287433
__ycy1124__楼主2024/10/4 15:37

原题链接

sub1 AC,sub2 WA,sub3 TLE

#include<bits/stdc++.h>
#define int long long
#define Maxn 2*300001
using namespace std;
vector<int>	a[Maxn];
std::unordered_map<int,int>mymap;
std::unordered_map<int,int>Mymap;
int tot=0;
void read(int &x){
	char ch=getchar();
	int f=1;
	x=0;
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-f;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+ch-48;
		ch=getchar();
	}
	x*=f;
}
void out(int x){
	if(x>=10){
		out(x/10);
	}
	putchar(x%10+48);
}
void write(int x){
	out(x);
	putchar('\n');
}
int sum(int x,int y){
	return (Mymap[x]/100000000+1)*(Mymap[y]%100000000)-(Mymap[y]/100000000+1)*(Mymap[x]%100000000);
}
int f[Maxn];
int find(int x){
//	printf("find:%d\n",x);
	if(f[x]!=x)return f[x]=find(f[x]);
	return x;
}
void hb(int x,int y){
//	printf("hb:%d %d\n",x,y);
	f[find(x)]=find(y);
}
int w[Maxn];
void dfs(int p,int fa){
	w[p]=w[fa]+sum(p,fa);
	for(auto it:a[p]){
		if(it!=fa){
			dfs(it,p);
		}
	}
}
signed main(){
	int n;
	read(n);
	for(int i=1;i<=n;i++){
		int x,y;
		char ch;
		read(x);
		read(y);
		cin>>ch;
		int u=x*1e8+y,v;
		if(ch=='x')
			v=(x+1)*1e8+y;
		else
			v=x*1e8+y+1;
		if(!mymap.count(u)){
			mymap[u]=++tot;
			Mymap[tot]=u;
			f[tot]=tot;
		}
		if(!mymap.count(v)){
			mymap[v]=++tot;
			Mymap[tot]=v;
			f[tot]=tot;
		}
		int uu,vv;
		uu=mymap[u];
		vv=mymap[v];
		if(find(uu)!=find(vv)){
			hb(uu,vv);
			a[vv].push_back(uu);
			a[uu].push_back(vv);
			dfs(uu,vv);
			write(0);
		}
		else{
			write(abs(w[uu]-w[vv]-sum(uu,vv))/2);
		}
	}
	return 0;
}
2024/10/4 15:37
加载中...