当前位置: 首页 > news >正文

P6149 [USACO20FEB] Triangles S题解

P6149 [USACO20FEB] Triangles S

题目描述

Farmer John 想要给他的奶牛们建造一个三角形牧场。

NNN3≤N≤1053\leq N\leq 10^53N105)个栅栏柱子分别位于农场的二维平面上不同的点 (X1,Y1)…(XN,YN)(X_1,Y_1)\ldots (X_N,Y_N)(X1,Y1)(XN,YN)。他可以选择其中三个点组成三角形牧场,只要三角形有一条边与 xxx 轴平行,且有另一条边与 yyy 轴平行。

FJ 可以组成的所有可能的牧场的面积之和等于多少?

输入格式

第一行包含 NNN

以下 NNN 行每行包含两个整数 XiX_iXiYiY_iYi,均在范围 −104…104−10^4\ldots 10^4104104 之内,描述一个栅栏柱子的位置。

输出格式

由于面积之和不一定为整数且可能非常大,输出面积之和的两倍109+710^9+7109+7 的余数。

输入输出样例 #1

输入 #1

4
0 0
0 1
1 0
1 2

输出 #1

3

说明/提示

样例解释:

栅栏木桩 (0,00,00,0)、(1,01,01,0) 和 (1,21,21,2) 组成了一个面积为 111 的三角形,(0,00,00,0)、(1,01,01,0) 和 (0,10,10,1) 组成了一个面积为 0.50.50.5 的三角形。所以答案为 2×(1+0.5)=32\times (1+0.5)=32×(1+0.5)=3

子任务:
  • 测试点 222 满足 N=200N=200N=200
  • 测试点 333-444 满足 N≤5000N\leq 5000N5000
  • 测试点 555-101010 没有额外限制。

思路:

现在给定两个序列,将他们组合为a[i]/b[j]a[i]/b[j]a[i]/b[j],一共有n2n^2n2组合种情况,可以发现这个题暴力枚举是一定不可以的,因为时间复杂度是n2n^2n2,所以需要重新考虑,可以枚举答案的大小,但是需要注意答案的精度,精度一定要高,考虑到一个性质:

a[i]/b[j]<=a[i+1]/b[j]
a[i]/b[j]>=a[i]/b[j+1]

可以先求解i的位置,在求解j的位置,因为第二个条件a[i]/b[j]>=a[i]/b[j+1]a[i]/b[j]>=a[i]/b[j+1]a[i]/b[j]>=a[i]/b[j+1]的所以a[i]每增加一个,个数会增加很多,增加的个数就是j之前的数的个数,所以可以使用这个条件来进行二分
可能上述没有解释清楚二分check的具体步骤,如果没有理解的话,可以看看代码的注释

代码:

#include<bits/stdc++.h>
#define int long long
//#define ull unsigned long long
using namespace std;
//#define x first
//#define y second
//const int mod=19650827;
//const int N=1e5+10;
//int fac[N],invfac[N];
//int qmi(int a,int b,int p){int res=1;while(b){if(b&1)res=res*a%p;a=a*a%p;b>>=1;}return res;}
//int inv(int x){return qmi(x,p-2);}
//int C(int n,int m){if(n<0||m<0||n<m)return 0;return fac[n]*invfac[n-m]%p*invfac[m]%p;}
//void init(){fac[0]=1;for(int i=1;i<N;i++)fac[i]=fac[i-1]*i%p;invfac[N-1]=inv(fac[N-1]);for(int i=N-2;i>=0;i--)invfac[i]=invfac[i+1]*(i+1)%p;}
//struct node{int v,w;bool operator < (const node &x)const{return w==x.w ? v>x.v : w>x.w;}};
//void dijkstra(const vector<vector<node>>&g,vector<int>&dist,vector<bool>&vis,int x){fill(dist.begin(),dist.end(),LLONG_MAX);fill(vis.begin(),vis.end(),false);
//dist[x]=0;priority_queue<node>q;q.push({x,0});while(q.size()){auto u=q.top().v;q.pop();if(vis[u])continue;vis[u]=true;for(auto [v,w]:g[u]){if(dist[v]>dist[u]+w){
//dist[v]=dist[u]+w;q.push({v,dist[v]});}}}}
//struct BIT{int n;vector<int>t;BIT(int _n=0){init(_n);}void init(int _n){n=_n;t.assign(n+2,0);}
//void add(int x,int v){for(;x<=n;x+=(x & -x))t[x]+=v;}int query(int x){int res=0;for(;x;x-=(x & -x))res+=t[x];return res;}};
//int calc_add(const vector<vector<int>>&s,int x1,int y1,int x2,int y2){return s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];}
//void calc_diff(vector<vector<int>>&d,int x1,int y1,int x2,int y2,int c){d[x1][y1]+=c;d[x2+1][y1]-=c;d[x1][y2+1]-=c;d[x2+1][y2+1]+=c;}
//int primes[N],cnt=0;bool st[N];
//void init1(){for(int i=2;i<N;i++){if(!st[i])primes[++cnt]=i;for(int j=1;primes[j]*i<N;j++){st[primes[j]*i]=true;if(i%primes[j]==0)break;}}}
//vector<int>factor[N];void init2(){for(int i=1;i<N;i++){for(int j=i;j<N;j+=i){factor[j].push_back(i);}}}
//int find(vector<int>&pre,int x){return pre[x]=(pre[x]==x ? x : find(pre,pre[x]));}
//void merge(vector<int>&pre,int x,int y){int fx=find(pre,x),fy=find(pre,y);if(fx==fy)return;pre[fx]=fy;}
//bool check(vector<int>&pre,int x,int y){return find(pre,x)==find(pre,y);}
//string add(string x,string y){if((int)x.size()<(int)y.size())swap(x,y);int n=x.size();int m=y.size();reverse(x.begin(),x.end());reverse(y.begin(),y.end());
//int d=0;string ans;for(int i=0;i<n;i++){int x1=(x[i]-'0');int y1=(i<m ? y[i]-'0' : 0);int sum=x1+y1+d;ans.push_back((sum%10)+'0');d=sum/10;}
//if(d>0)ans.push_back(d+'0');reverse(ans.begin(),ans.end());return ans;}
//string mul(string x,string y){if(x=="0"||y=="0")return "0";reverse(x.begin(),x.end());reverse(y.begin(),y.end());int x1=x.size();int y1=y.size();string ans;
//for(int i=0;i<x1;i++){int d=0;int val1=(x[i]-'0');for(int j=0;j<y1;j++){int val2=(y[j]-'0');int len=ans.size();int val=val1*val2+d;
//if(len<=i+j)ans.push_back((val%10)+'0');else val+=(ans[i+j]-'0'),ans[i+j]=((val%10)+'0');d=val/10;}int len=ans.size();int cur_pos=i+y1;
//while(d){if(cur_pos>=len)ans.push_back((d%10)+'0');else d+=ans[cur_pos]-'0',ans[cur_pos]=((d%10)+'0');d/=10;cur_pos++;}}reverse(ans.begin(),ans.end());return ans;}
//struct Seg_Tree{int n;vector<int>t,lz;Seg_Tree(int _n=0){init(_n);}void init(int _n){n=_n;t.assign((n<<2)+2,0);lz.assign((n<<2)+2,0);}
//void pushup(int o){t[o]=t[o<<1]+t[o<<1|1];}void update(int s,int e,int o,int x){t[o]+=x*(e-s+1);lz[o]+=x;}
//void pushdown(int s,int e,int o){if(!lz[o])return ;int mid=(s+e)>>1;update(s,mid,o<<1,lz[o]);update(mid+1,e,o<<1|1,lz[o]);lz[o]=0;}
//void add(int l,int r,int x,int s=1,int e=0,int o=1){if(e==0)e=this->n;if(l>e||r<s)return ;if(l<=s&&e<=r){update(s,e,o,x);return ;}pushdown(s,e,o);int mid=(s+e)>>1;
//add(l,r,x,s,mid,o<<1);add(l,r,x,mid+1,e,o<<1|1);pushup(o);}
//int query(int l,int r,int s=1,int e=0,int o=1){if(e==0)e=this->n;if(l>e||r<s)return 0;if(l<=s&&r>=e)return t[o];pushdown(s,e,o);int mid=(s+e)>>1;
//int x=query(l,r,s,mid,o<<1);int y=query(l,r,mid+1,e,o<<1|1);return x+y;}};
void solve(){int n,q;cin>>n>>q;vector<int>a(n+1),b(n+1);vector<bool>vis(1e6+10);for(int i=1;i<=n;i++)cin>>a[i],vis[a[i]]=true;for(int i=1;i<=n;i++)cin>>b[i];sort(a.begin()+1,a.end());sort(b.begin()+1,b.end());auto check=[&](long double x)->int{int res=0;int j=0;for(int i=1;i<=n;i++){//可以考虑将b点固定,看a有多少个符合题意//a[j]/b[i]<=a[j+1]/b[i],可以发现这个是在增加的//a[j]/b[i]>=a[j]/b[i+1],可以发现这个值是在降低的//现在固定b,来求解可以逐步增加a,a前面比它大的,那后面也一定比它大while(j<n&&(long double)a[j+1]<(long double)x*(long double)b[i])j++;res+=j;}return res;};while(q--){int x;cin>>x;long double l=(long double)a[1]/(long double)b[n],r=(long double)a[n]/(long double)b[1];while(r-l>=1e-13){long double mid=(l+r)/2;if(check(mid)>=x)r=mid;else l=mid;}for(int i=1;i<=n;i++){int val=round(l*b[i]);if(val<=1e6&&vis[val]&&abs((long double)l*b[i]-val)<=1e-7){int d=__gcd(val,b[i]);cout<<val/d<<' '<<b[i]/d<<'\n';break;}}}
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//init();//init1();//init2();int _=1;//cin>>_;while(_--)solve();return 0;
}
http://www.dtcms.com/a/594820.html

相关文章:

  • 青岛大型网站设计公司潍坊网站建设多少钱
  • shell(5)--case菜单和echo
  • 动易网站模版的制作衡水网站开发
  • 就业服务网站建设方案才艺多网站建设平台
  • 天猫优惠卷怎么做网站个人不能建设论坛网站怎么办
  • 娱乐网站建设流程WordPress 三图
  • 【代码审计】h3blog 两处安全问题分析
  • 字符串匹配和回文串类题目
  • Ansible 基础知识总结
  • 宁波余姚网站建设wordpress判断文章id
  • 深入解析wordpress 原书第2版 pdf 下载重庆企业网站优化
  • 蓝桥杯零基础到获奖-第4章 C++ 变量和常量
  • AI芯片产品经理操作手册
  • 教做甜品网站源码网站建设教程
  • 大型门户网站有哪些企业网站建设存在的问题
  • wordpress微信拦截青岛关键词优化排名
  • 电源模块冲击电流测试如何测试,需要哪些设备?-纳米软件
  • 广告网站建设制作设计c2c的网站
  • 【MicroPython编程-ESP32篇】-BME680传感器驱动
  • 电脑上制作网站的软件手机端网站建设教程视频教程
  • 网站qq代码做电商网站用什么语言
  • Docker容器的一次迁移
  • Android Studio移动应用基础教程(前言)
  • 莱芜网站建设流程网站备案号没有-1
  • 哪些网站收录排名好建立网站的申请
  • 建设银行网站登录不了目前较流行的网站开发框架
  • 创建web项目踩坑记录
  • 自己服务器做网站服务器备案1个人做多网站负责人
  • 燃烧100克脂肪换算多少卡路里?
  • idea做网站贵州省住房和城乡建设网站