社区讨论

蒟蒻RE70pts求助

P3249[HNOI2016] 矿区参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo92j0yj
此快照首次捕获于
2023/10/28 04:31
2 年前
此快照最后确认于
2023/10/28 04:31
2 年前
查看原帖
rt,大概照着第一篇题解打的。但是一直是 RE。蒟蒻不知道怎么回啥啊啊。
CPP
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
#define ll long long
#define int long long
const int MAXN=4e6+5;
const int MR=4e6+5;
const double eps=1e-10;
struct node{
	ll x,y;
}p[MAXN]; 
struct edge{
	int id,u,v;
	double arg;
}e[MAXN<<1];int tot=1;
int nxt[MAXN<<1];int pos[MAXN<<1],cnt=0;
bool operator <(edge x,edge y){
	if(abs(x.arg-y.arg)<=eps) return x.v<y.v;
	return x.arg<y.arg;
}
int n,m,k;
vector<edge> ve[MAXN],tr[MAXN]; 
ll s[MAXN],t[MAXN];int rt;
int f[MAXN];bool vis[MAXN],istr[MAXN];
int ask[MR];
node operator -(node x,node y){return node{x.x-y.x,x.y-y.y};}
ll operator *(node x,node y){return x.x*y.y-x.y*y.x;}
inline int read(){
    int q=0,w=1;char ch=' ';
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') w=-1,ch=getchar();
    while(ch>='0'&&ch<='9') q=q*10+ch-'0',ch=getchar();
    return q*w;
}
ll gcd(ll x,ll y){
	return (x%y==0)?y:gcd(y,x%y);
}
void add(int x,int y){
	++tot;
	e[tot]=edge{tot,x,y,atan2(p[y].y-p[x].y,p[y].x-p[x].x)};
	ve[x].push_back(e[tot]);
}
void build(){
	for(int i=1;i<=n;i++) sort(ve[i].begin(),ve[i].end());
	for(int i=2;i<=tot;i++){
		int v=e[i].v;
		vector<edge>::iterator it=lower_bound(ve[v].begin(),ve[v].end(),e[i^1]);
		if(it==ve[v].begin()) it=ve[v].end();
		it--,nxt[i]=(*it).id;
	}
	for(int i=2;i<=tot;i++){
		if(pos[i]) continue;
		pos[i]=++cnt;
		for(int j=nxt[i];!pos[j];j=nxt[j]){
			pos[j]=cnt;
			s[cnt]+=(p[e[j].u]-p[e[i].u])*(p[e[j].v]-p[e[i].u]);
		}
		if(s[cnt]<0) rt=cnt;
	}
	for(int i=2;i<=tot;i++) tr[pos[i]].push_back(edge{i,pos[i],pos[i^1]});
}
void dfs(int u,int fa){
	//cout<<u<<" "<<fa<<endl;
	f[u]=fa,t[u]=s[u]*s[u];s[u]<<=1;vis[u]=1;
	for(int i=0;i<tr[u].size();i++){
		int v=tr[u][i].v;
		if(vis[v]) continue;
		istr[tr[u][i].id]=istr[tr[u][i].id^1]=true;
		dfs(v,u);
		s[u]+=s[v],t[u]+=t[v];
	}
}
void work(){
	ll ans1=0,ans2=0;
	while(k--){
		int len=(read()+ans1)%n+1;
		for(int i=1;i<=len;i++)
			ask[i]=(read()+ans1)%n+1;
		ans1=ans2=0;
		ask[len+1]=ask[1];
		for(int i=1;i<=len;i++){
			int x=ask[i],y=ask[i+1];
			edge link=edge{0,x,y,atan2(p[y].y-p[x].y,p[y].x-p[x].x)};
			vector<edge>::iterator it=lower_bound(ve[x].begin(),ve[x].end(),link);
			int j=(*it).id;
			if(!istr[j]) continue;
			if(f[pos[j]]==pos[j^1]) ans1+=t[pos[j]],ans2+=s[pos[j]];
			else ans1-=t[pos[j^1]],ans2-=s[pos[j^1]];
		}
		ll tmp=gcd(ans1,ans2);
		printf("%lld %lld\n",ans1/tmp,ans2/tmp);
		ans1/=tmp;
	}
	return;
}
signed main(){
	//freopen("mine8.in","r",stdin);
	n=read(),m=read(),k=read();
	for(int i=1;i<=n;i++)
		p[i]=node{read(),read()};
	for(int i=1;i<=m;i++){
		int x=read(),y=read();
		add(x,y);add(y,x);
	}
	build();
	dfs(rt,0);//cout<<"OK";
	work();
}

回复

1 条回复,欢迎继续交流。

正在加载回复...