XTU 1250 Super Fast Fourier Transform
生活随笔
收集整理的這篇文章主要介紹了
XTU 1250 Super Fast Fourier Transform
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
$2016$長城信息杯中國大學生程序設計競賽中南邀請賽$H$題
排序,二分。
對$a$數組,$b$數組從小到大進行排序。
統計每一個$a[i]$作為較大值的時候與$b[i]$對答案的貢獻。反過來再統計以$b[i]$為較大值時與$a[i]$對答案的貢獻。
以前者舉例說明:
觀察這個:$?\sqrt {|a[i] - b[j]|}? $,按照題目中給出的范圍,這個東西最大只有$1000$。
也就是說,我們在計算一個$a[i]$與$b[j]$對答案的貢獻時候,不用從$1$到$m$枚舉$j$,因為肯定是一段一段相同的,所以分段計算即可。二分一下就可以分段計算了。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-8;const int maxn=100010; int n,m; int a[maxn],b[maxn];int main() {while(~scanf("%d%d",&n,&m)){for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=m;i++) scanf("%d",&b[i]);sort(a+1,a+1+n); sort(b+1,b+1+m);LL ans=0;for(int i=1;i<=n;i++){int L=1,R=m,pos=-1;while(L<=R){int mid=(L+R)/2;if(b[mid]<a[i]) L=mid+1,pos=mid;else R=mid-1;}if(pos==-1) continue;int now=1, p;while(now<=pos){int num=(int)(eps+sqrt(1.0*(a[i]-b[now])));L=now,R=pos;while(L<=R){int mid=(L+R)/2;int tmp=(int)(eps+sqrt(1.0*(a[i]-b[mid])));if(tmp<num) R=mid-1;else L=mid+1,p=mid;}ans=ans+(LL)(p-now+1)*(LL)num;now=p+1;}}for(int i=1;i<=m;i++){int L=1,R=n,pos=-1;while(L<=R){int mid=(L+R)/2;if(a[mid]<b[i]) L=mid+1,pos=mid;else R=mid-1;}if(pos==-1) continue;int now=1, p;while(now<=pos){int num=(int)(eps+sqrt(1.0*(b[i]-a[now])));L=now,R=pos;while(L<=R){int mid=(L+R)/2;int tmp=(int)(eps+sqrt(1.0*(b[i]-a[mid])));if(tmp<num) R=mid-1;else L=mid+1,p=mid;}ans=ans+(LL)(p-now+1)*(LL)num;now=p+1;}}cout<<ans<<endl;}return 0; }?
轉載于:https://www.cnblogs.com/zufezzt/p/5818931.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的XTU 1250 Super Fast Fourier Transform的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++中algorithm头文件、STL
- 下一篇: LVS nat 负载均衡实验