bzoj 3528: [Zjoi2014]星系调查

       这道题目,只要看懂题意,敢于展开,就是一道初中数学好题。

      首先设直线为y=kx+b,那么可知答案为Σ(kxi+b-yi)/(k^2+1),展开以后维护若干个东西就可以化简为(Ab^2+(Xk+Y)b+Uk^2+Vk+W)/(k^+1)的形式,其中A>0,那么以b为主元,最小值为(4ac-b^2)/4a,化简一下可以变成Ak^2+Bk+C/(k^2+1)的形式(A,B,C不同于之前的A,B,C),然后有两种做法,一种是变成A+(B'k+C')/(k^2+1)的形式然后双勾函数;或者设答案为t,以k为主元△>=0,然后可得到答案是一个范围,输出下界即可。

       窝用的是△法。

       于是只要各种姿势维护需要的关于xi,yi的一些和记好了。

AC代码如下:

#include<bits/stdc++.h>
#define N 100005
using namespace std;

int n,m,cnt,tot,q[N],fst[N],pnt[N<<1],nxt[N<<1],fa[N],d[N],sz[N],son[N],anc[N],id[N],rt[N];
int tx[N],ty[N]; bool vis[N];
struct node{
	int p[6];
	void ins(int u,int v){
		p[0]++; p[1]+=u; p[2]+=u*u;
		p[3]+=v; p[4]+=v*v; p[5]+=u*v;
	}
	double calc(){
		double A=p[2]-1.*p[1]*p[1]/p[0];
		double B=2*p[5]-2.*p[1]*p[3]/p[0];
		double C=p[4]-1.*p[3]*p[3]/p[0];
		double a=4,b=-4*(A+C),c=4*A*C-B*B;
		return (-b-sqrt(b*b-4*a*c))/a/2;
	}
}a[N],b[N];
node operator +(node x,node y){
	int i; for (i=0; i<6; i++) x.p[i]+=y.p[i]; return x;
}
node operator -(node x,node y){
	int i; for (i=0; i<6; i++) x.p[i]-=y.p[i]; return x;
}
void add(int x,int y){
	pnt[++tot]=y; nxt[tot]=fst[x]; fst[x]=tot;
}
void dfs(int x,int z){
	int i,y; vis[x]=1; sz[x]=1; son[x]=0; rt[x]=z;
	a[x]=a[fa[x]]; a[x].ins(tx[x],ty[x]);
	for (i=fst[x]; i; i=nxt[i]){
		y=pnt[i];
		if (!vis[y] && y!=fa[x]){
			d[y]=d[x]+1; fa[y]=x;
			dfs(y,z); sz[x]+=sz[y];
			if (sz[y]>sz[son[x]]) son[x]=y;
		}
	}
}
void dvd(int x,int tp){
	int i,y; anc[x]=tp;
	if (son[x]) dvd(son[x],tp);
	for (i=fst[x]; i; i=nxt[i]){
		y=pnt[i];
		if (x==fa[y] && y!=son[x]) dvd(y,y);
	}
}
int lca(int x,int y){
	for (; anc[x]!=anc[y]; x=fa[anc[x]])
		if (d[anc[x]]<d[anc[y]]) swap(x,y);
	return (d[x]<d[y])?x:y;
}
void cir(){
	int i,x,y; memset(vis,0,sizeof(vis));
	for (x=1; x<=n; x++)
		for (i=fst[x]; i; i=nxt[i]) if (fa[x]!=pnt[i] && fa[pnt[i]]!=x){
			y=pnt[i];
			if (d[x]>d[y]) swap(x,y);
			for (; y!=x; y=fa[y]){
				q[++cnt]=y; id[y]=cnt; vis[y]=1;
				b[cnt]=b[cnt-1]; b[cnt].ins(tx[y],ty[y]);
			}
			q[++cnt]=x; id[x]=cnt; vis[x]=1;
			b[cnt]=b[cnt-1]; b[cnt].ins(tx[x],ty[x]);
			return;
		}
}
int main(){
	scanf("%d%d",&n,&m);
	int i,x,y;
	for (i=1; i<=n; i++) scanf("%d%d",&tx[i],&ty[i]);
	for (i=1; i<=m; i++){
		scanf("%d%d",&x,&y);
		add(x,y); add(y,x);
	}
	dfs(1,1);
	memset(vis,0,sizeof(vis));
	if (n==m) cir(); else q[cnt=1]=1;
	memset(fa,0,sizeof(fa)); 
	for (i=1; i<=cnt; i++){
		dfs(q[i],q[i]); dvd(q[i],q[i]);
	}
	scanf("%d",&m);
	node u,v;
	while (m--){
		scanf("%d%d",&x,&y);
		if (rt[x]==rt[y]){
			u=a[x]+a[y]-a[lca(x,y)]-a[fa[lca(x,y)]];
			printf("%.5f\n",u.calc());
		} else{
			if (id[rt[x]]>id[rt[y]]) swap(x,y);
			u=a[x]-a[rt[x]]+a[y]-a[rt[y]]+b[id[rt[y]]]-b[id[rt[x]]-1];
			v=a[x]-a[rt[x]]+a[y]-a[rt[y]]+b[id[rt[x]]]+b[cnt]-b[id[rt[y]]-1];
			printf("%.5f\n",min(u.calc(),v.calc()));
		}
	}
	return 0;
}


by lych

2017.3.15

极简JAVA学习营第五期

01-19
想学好JAVA必须要报两万的培训班吗? 【课程背景】 JAVA是市场份额最大的编程语言,每天各大招聘网站上都会有数万个JAVA开发工程师的在招岗位,但是JAVA的技术体系庞大复杂,要想扎实掌握JAVA不是一件容易的事,线上学习相比线下两万起的高昂费用便宜了很多,而且具备学习时间灵活的优势,但是线上学习的劣势也很明显,没有线下那种学习氛围,碰到问题没法解决,在家学习很容易偷懒,极简JAVA学习营充分考虑到这些问题,通过每日实战编程练习,分队pk,助教答疑,作业点评,作业讲解,项目答辩等诸多环节充分激发你的学习热情,解决你学习中碰到的问题,让你花十分之一的钱学到JAVA的精髓,开启你的人生逆袭之路。 【专项的贴心服务】 1. 学练结合:定期布置视频任务和编程实战练习:通过每天的视频任务统一大家的进度,以便同学更好的交流,针对每天的任务会有相应的编程实战练习,通过练习内化知识。 2. 分队PK:将就业营的同学分成几队,通过作业统计表统计每队提交作业情况进行PK,激发你的学习动力。 3. 助教讲师答疑:碰到任何问题,发到群里,助教和讲师十分钟内帮你解决问题,扫清学习中的障碍。 4. 助教点评讲解作业:你每天提交作业都会有助教进行点评,让你知道有什么问题怎么解决,每三天一次视频讲解作业,互动解答问题 5. 项目答辩:每个阶段学完会有项目答辩,通过做项目巩固前一阶段的知识点,锻炼编码能力。 【往期训练营学习展示】 【套餐内容简介】 本套课以市场就业和职位需求为核心,从JAVA入门到多领域实战,设计出学习路线,共分为二十大模块,分别是:JAVA面向对象、Object类与常用API、集合框架、IO流、反射注解、多线程与网络编程、Object类与常用API等等。 同时采用理论讲解加实战演练的方式,既能让学员听懂听明白达到理解透彻,又能够在一个个真实实战案例中,让学员掌握真正有用的开发技能,从而进阶 JAVA 工程师! 套餐中一共包含21门JAVA程,助你从零进阶JAVA工程师! 阶段一:JAVA基础 课程1:《极简JAVA学习营开营篇》 课程2:《极简JAVA:JAVA面向对象》 课程3:《极简JAVA:Object类与常用API》 课程4:《极简JAVA:集合框架》 课程5:《极简JAVA:IO流》 课程6:《极简JAVA:反射注解》 课程7:《极简JAVA:多线程与网络编程》 阶段二:数据库入门 课程8:《极简JAVA:MySql数据库》 课程9:《极简JAVA:JDBC与连接池》 阶段三:JAVA WEB 课程10:《极简JAVA:HTML5与CSS3》 课程11:《极简JAVA:极简JAVA十一:Javascript与Jquery》 课程12:《极简JAVA:BootStrap》 课程13:《极简JAVA:JAVA Web》 阶段四:框架实战 课程14:《极简JAVA:Mavean入门》 课程15:《极简JAVA:MyBatis框架》 课程16:《极简JAVA:Spring框架》 课程17:《极简JAVA:Spring Mvc》 课程18:《极简JAVA:Oracle数据库》 课程19:《极简JAVA:Git入门》 课程20:《极简JAVA:Linux入门》 课程21:《极简JAVA:SpringBoot》 【课程特色】 1、易理解:讲师思路清晰、节奏明确、从易到难讲解透彻明白; 2、知识全:知识全面系统,从JAVA入门到实战,由易到难,让你彻底掌握JAVA开发; 3、重实战:涵盖大量实战项目,锻炼你的动手实操能力,面向工作编程; 【面向人群】 1、在校计算机专业或者对软件编程感兴趣的学生; 2、零基础想学JAVA却不知道从何入手 3、囊中羞涩,面对两万起的JAVA培训班不忍直视 4、在职没有每天大块的时间专门学习JAVA 这么细致的服务,这么好的氛围,这样的学习效果,你还等什么?赶紧报名吧,抓紧抢位,本期只招100人,错过只有等时间待定的下一期了
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值