社区讨论
蒟蒻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 条回复,欢迎继续交流。
正在加载回复...