分治分块与计算几何练习 [Cloned]
https://cn.vjudge.net/contest/148706
A
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- typedef long long ll;
- int read(){
- int x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
- return x*f;
- }
- const int N=2e5+;
- struct node{
- int l,r,t,pos;
- bool operator < (const node &a)const{
- return pos==a.pos?r<a.r:pos<a.pos;
- }
- }b[N];
- int n,m,l,r,a[N],f[N];
- ll res,ans1[N],ans2[N];
- ll gcd(ll a,ll b){
- if(!b) return a;
- return gcd(b,a%b);
- }
- int main(){
- n=read();m=read();
- for(int i=;i<=n;i++) a[i]=read();
- int k=sqrt(n*1.0)+0.5;
- for(int i=;i<=m;i++){
- b[i].l=read();b[i].r=read();
- b[i].t=i;b[i].pos=b[i].l/k;
- }
- sort(b+,b+m+);
- memset(f,,sizeof f);
- l=;r=;res=;
- for(int i=;i<=m;i++){
- while(r>b[i].r){
- res-=(ll)f[a[r]]-;
- f[a[r]]--;
- r--;
- }
- while(r<b[i].r){
- r++;
- f[a[r]]++;
- res+=(ll)f[a[r]]-;
- }
- while(l>b[i].l){
- l--;
- f[a[l]]++;
- res+=(ll)f[a[l]]-;
- }
- while(l<b[i].l){
- res-=(ll)f[a[l]]-;
- f[a[l]]--;
- l++;
- }
- ans1[b[i].t]=res;
- ans2[b[i].t]=(ll)(r-l+)*(r-l)/;
- }
- for(int i=;i<=m;i++){
- if(!ans1[i]){
- puts("0/1");
- continue;
- }
- ll gg=gcd(ans1[i],ans2[i]);
- printf("%lld/%lld\n",ans1[i]/gg,ans2[i]/gg);
- //printf("%I64d/%I64d\n",ans1[i]/gg,ans2[i]/gg);
- }
- return ;
- }
B
- //扫描线考精度,没什么技术含量
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #define eps 1e-8
- using namespace std;
- int n,tot,cnt;
- double last,ans,pos[];
- struct P{double x,y;}p[][];
- struct L{P a,b;}l[][];
- struct seg{double l,r;}f[];
- inline P operator -(P a,P b){return (P){a.x-b.x,a.y-b.y};}
- inline double operator *(P a,P b){return a.x*b.y-a.y*b.x;}//叉积
- inline double operator /(P a,P b){return a.x*b.x+a.y*b.y;}//点积
- inline P inter(L l1,L l2){
- double k1=(l2.b-l1.a)*(l1.b-l1.a),k2=(l1.b-l1.a)*(l2.a-l1.a),t=k1/(k1+k2);
- return (P){l2.b.x+(l2.a.x-l2.b.x)*t,l2.b.y+(l2.a.y-l2.b.y)*t};
- }
- inline bool judge(L l1,L l2){
- return fabs((l1.b.y-l1.a.y)*(l2.b.x-l2.a.x)-(l1.b.x-l1.a.x)*(l2.b.y-l2.a.y))>eps;
- }
- inline bool cmp(seg a,seg b){
- return fabs(a.l-b.l)<=eps?a.r<b.r:a.l<b.l;
- }
- inline double dcmp(double x){
- if(fabs(x)<=eps) return ;
- else return x<?-:;
- }
- inline bool cross(P a1,P a2,P b1,P b2){
- double c1=(a2-a1)*(b1-a1),c2=(a2-a1)*(b2-a1),c3=(b2-b1)*(a1-b1),c4=(b2-b1)*(a2-b1);
- return dcmp(c1)*dcmp(c2)<&&dcmp(c3)*dcmp(c4)<;
- }
- inline double calc(double x){
- L ln=(L){(P){x,},(P){x,}};
- int num;cnt=;
- double y[],h,ret=;
- for(int i=;i<=n;i++){
- double mn=min(p[i][].x,min(p[i][].x,p[i][].x)),mx=max(p[i][].x,max(p[i][].x,p[i][].x));
- if(x<mn+eps||x>mx-eps) continue;
- num=;
- for(int j=;j<=;j++){
- if(judge(l[i][j],ln)){
- P tmp=inter(l[i][j],ln);
- if((l[i][j].a-tmp)/(l[i][j].b-tmp)>-eps) continue;
- y[++num]=tmp.y;
- }
- }
- if(num>) f[++cnt]=(seg){y[],y[]};
- }
- for(int i=;i<=cnt;i++){
- if(f[i].l>f[i].r){
- swap(f[i].l,f[i].r);
- }
- }
- sort(f+,f+cnt+,cmp);
- for(int i=;i<=cnt;i++){
- if(i==||f[i].l>h+eps) ret+=f[i].r-f[i].l,h=f[i].r;
- else if(f[i].r>h+eps) ret+=f[i].r-h,h=f[i].r;
- }
- return ret;
- }
- int main(){
- scanf("%d",&n);
- for(int i=;i<=n;i++){
- for(int j=;j<=;j++){
- scanf("%lf%lf",&p[i][j].x,&p[i][j].y),pos[++tot]=p[i][j].x;
- }
- }
- for(int i=;i<=n;i++){
- l[i][]=(L){p[i][],p[i][]},
- l[i][]=(L){p[i][],p[i][]},
- l[i][]=(L){p[i][],p[i][]};
- }
- for(int i=;i<n;i++){
- for(int j=i+;j<=n;j++){
- for(int k1=;k1<=;k1++){
- for(int k2=;k2<=;k2++){
- if(cross(l[i][k1].a,l[i][k1].b,l[j][k2].a,l[j][k2].b)){
- pos[++tot]=inter(l[i][k1],l[j][k2]).x;
- }
- }
- }
- }
- }
- sort(pos+,pos+tot+);
- last=pos[];
- for(int i=;i<=tot;i++){
- if(fabs(pos[i]-last)>eps){
- ans+=calc((pos[i]+last)/)*(pos[i]-last);
- last=pos[i];
- }
- }
- ans-=eps;//eps!
- printf("%.2lf\n",ans);
- return ;
- }
C
- //题意:n场考试中分别答对a_i题,总题数分别为b_i,允许去掉k场考试,求能达到的最高准确率。
- //二分比0/1分数规划慢,然而后者并不会
- #include<cstdio>
- #include<algorithm>
- #define eps 1e-7
- using namespace std;
- const int N=;
- int n,k;
- double sum,a[N],b[N],t[N];
- int main(){
- while(scanf("%d%d",&n,&k)==){
- if(!n) break;
- for(int i=;i<n;i++) scanf("%lf",&a[i]);
- for(int i=;i<n;i++) scanf("%lf",&b[i]);
- double l=0.0,r=1.0,mid;
- while(r-l>eps){
- mid=(l+r)/2.0;
- for(int i=;i<n;i++) t[i]=a[i]-mid*b[i];
- sort(t,t+n);sum=;
- for(int i=k;i<n;i++) sum+=t[i];
- if(sum>) l=mid;
- else r=mid;
- }
- printf("%.0f\n",mid*);//g++,坑
- }
- return ;
- }
D
- //simpson自适应公式
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<iostream>
- using namespace std;
- #define sqr(x) ((x)*(x))
- typedef double DB;
- const int maxn=;const DB zero=1e-;
- int n;DB alp,h,x[maxn],R[maxn],fx1[maxn],fx2[maxn],fy1[maxn],fy2[maxn];
- DB f(DB X){
- DB s=;
- for(int i=;i<=n;++i){
- if(fabs(x[i]-X)<R[i]) s=max(s,sqrt(sqr(R[i])-sqr(x[i]-X)));
- if(x[i+]-x[i]>fabs(R[i+]-R[i]) && fx1[i]<X && X<fx2[i])
- s=max(s,(fy2[i]-fy1[i])/(fx2[i]-fx1[i])*(X-fx1[i])+fy1[i]);
- }
- return s;
- }
- DB simpson(DB a,DB b,DB fa,DB fb,DB fm){return (b-a)/*(fa+*fm+fb);}//不知道怎么积出来的辛普森
- DB area(DB l,DB fl,DB m,DB fm,DB r,DB fr,DB pre){
- DB ls=(l+m)/,rs=(m+r)/,fls=f(ls),frs=f(rs);
- DB la=simpson(l,m,fl,fm,fls),ra=simpson(m,r,fm,fr,frs);
- return fabs(la+ra-pre)<zero? pre:area(l,fl,ls,fls,m,fm,la)+area(m,fm,rs,frs,r,fr,ra);
- }
- int main(){
- scanf("%d%lf",&n,&alp);alp=/tan(alp);
- for(int i=;i<n+;++i) scanf("%lf",&x[i]),h+=x[i],x[i]=h*alp;
- DB l=x[n+],r=l;
- for(int i=;i<n+;++i)
- scanf("%lf",&R[i]),l=l<x[i]-R[i]? l:x[i]-R[i],r=r>x[i]+R[i]? r:x[i]+R[i];
- for(int i=;i<n+;++i)
- fx1[i]=x[i]+R[i]*(R[i]-R[i+])/(x[i+]-x[i]),fy1[i]=sqrt(sqr(R[i])-sqr(fx1[i]-x[i])),
- fx2[i]=x[i+]+R[i+]*(R[i]-R[i+])/(x[i+]-x[i]),fy2[i]=sqrt(sqr(R[i+])-sqr(fx2[i]-x[i+]));
- DB m=(l+r)/,fm=f(m),fl=f(l),fr=f(r);
- printf("%.2lf",*area(l,fl,m,fm,r,fr,simpson(l,r,fl,fr,fm)));
- return ;
- }
E
- //求图的绝对中心(这个点到所有点的最短距离的最大值最小)
- //reference:http://blog.csdn.net/crazy_ac/article/details/8816877
- #include<cstdio>
- #include<iostream>
- using namespace std;
- const int N=;
- const int inf=0x3f3f3f3f;
- int n,m,d[N][N],di[N][N],rk[N][N];
- int main(){
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++){
- d[i][i]=di[i][i]=;
- for(int j=i+;j<=n;j++){
- d[i][j]=d[j][i]=inf;
- di[i][j]=di[j][i]=inf;
- }
- }
- for(int i=,x,y,z;i<=m;i++){
- scanf("%d%d%d",&x,&y,&z);
- d[x][y]=d[y][x]=z;
- di[x][y]=di[y][x]=z;
- }
- for(int k=;k<=n;k++){
- for(int i=;i<=n;i++){
- for(int j=;j<=n;j++){
- d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
- }
- }
- }
- for(int i=;i<=n;i++){
- for(int j=;j<=n;j++) rk[i][j]=j;
- for(int j=;j<=n;j++){
- for(int k=j+;k<=n;k++){
- if(d[i][rk[i][j]]>d[i][rk[i][k]]){
- swap(rk[i][j],rk[i][k]);
- }
- }
- }
- }
- int ans=inf;
- for(int i=;i<=n;i++){
- for(int j=;j<=n;j++){
- if(i==j) continue;
- ans=min(ans,d[i][rk[i][n]]<<);
- ans=min(ans,d[j][rk[j][n]]<<);
- for(int cmp=n,t=n-;t>=;t--){
- if(d[j][rk[i][t]]>d[j][rk[i][cmp]]){
- ans=min(ans,d[i][rk[i][t]]+d[j][rk[i][cmp]]+di[i][j]);
- cmp=t;
- }
- }
- }
- }
- printf("%.2lf\n",(double)ans/);
- return ;
- }
分治分块与计算几何练习 [Cloned]的更多相关文章
- BZOJ.4320.[ShangHai2006]Homework(根号分治 分块)
BZOJ \(\mathbb{mod}\)一个数\(y\)的最小值,可以考虑枚举剩余系,也就是枚举区间\([0,y),[y,2y),[2y,3y)...\)中的最小值(求后缀最小值也一样)更新答案,复 ...
- [CF587F]Duff is Mad[AC自动机+根号分治+分块]
题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\su ...
- [CF1083F]The Fair Nut and Amusing Xor[差分+同余分类+根号分治+分块]
题意 给定两个长度为 \(n\) 的序列 \(\{a_i\}\) 与 \(\{b_i\}\),你需要求出它们的相似度.,我们定义这两个序列的相似度为将其中一个序列转化为另一个序列所需的最小操作次数.一 ...
- bzoj 2002[Hnoi2010]Bounce 弹飞绵羊(分治分块)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- [暑假的bzoj刷水记录]
(这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊 堆一起算了 隔一段更新一下. 7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...
- 友链 & 日记
友链 & 日记 关于 \(Owen\) 温州中学初三 \(OIer\),目前 \(OI\) 水平一般,文化课成绩浮在中游.喜欢二次元,喜欢听音乐,标准宅一枚.虽然入宅时间很短 欢迎大家跟 \( ...
- qbzt day2 上午
内容提要 贪心 分治 分块 搜索 接着昨天的讲 过河问题 考虑AB是最快的人,CD是最慢的人,要把CD两个人送过河,只有两种方案,牵扯到四个人,并且n个规模的原问题化成了n-2个规模的子问题 那么最后 ...
- 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点
平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...
- UOJ33 [UR #2] 树上GCD 【点分治】【容斥原理】【分块】
题目分析: 树上点对问题首先想到点分治.假设我们进行了点分治并递归地解决了子问题.现在我们合并问题. 我们需要找到所有经过当前重心$ c $的子树路径.第一种情况是LCA为当前重心$ c $.考虑以$ ...
随机推荐
- gridview中的相关事件操作
原文发布时间为:2008-07-27 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...
- XML 增、删、改和查的实例【转】
原文发布时间为:2008-08-10 -- 来源于本人的百度文章 [由搬家工具导入] 原文地址:http://www.cnblogs.com/skylaugh/archive/2006/12/18/5 ...
- 【MFC】半透明对话框(转)
原文转自 http://jingyan.baidu.com/article/656db918fd5b0ee381249ca1.html 在OnInitDialog()函数添加以下代码: //设置半透明 ...
- AC日记——[JLOI2014]松鼠的新家 洛谷 P3258
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前 ...
- 轻量级Web渗透测试工具jSQL
轻量级Web渗透测试工具jSQL jSQL是Kali集成的一款轻量级的Web渗透测试工具.最初该工具主要实施SQL注入,后来增加更多的功能,扩展形成一个综合性的Web渗透测试工具.Kali提供的版本较 ...
- poj 2104 K-th Number(主席树
Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 59058 Accepted: 20529 Case Time Limi ...
- jvm 问题分析
jmap dump:file=[文件名].dump [进程号] 生成dump root@VM-185-251-ubuntu:/opt/scripts# jmap -dump:file=three.d ...
- iOS开发 NSArray技巧
sh数组快速倒序 NSArray *arr = @[@"first",@"second"]; arr = arr.reverseObjectEnumerator ...
- 智能手机+DIY红外=万能遥控器
目前好像只有:三星S4.,努比亚大牛,华为荣耀3等几款新机才有红外遥控功能,那我们使用的手机没有这个功能怎么办?不要急我有办法呵呵,本次DIY材料好找又简单,大家都可以亲自试一试! DIY材料:红外二 ...
- yii框架:CDbConnection failed to open the DB connection: could not find driver的解决的方法
这个问题是由于php中缺少pdo mysql造成的. 解决方法是为php加入此扩展.前往你最早的php安装文件,进入ext/pdo_mysql/文件夹下,然后./configure --with-ph ...