+キューイング思考の一致を逆に求めて(ロサンゼルスバレーP1966)

マッチキュー

タイトル説明

漢漢一致する2つのボックスを持って、n個のマッチを含む各ボックスは、各マッチは高度を有しています。パックは、現在行のそれぞれと一致する、同じ列に異なる高さに一致する、ように2つのマッチとの間に画定された距離:Σは(AI-BI)^ 2

ここで、i行目の試合の最初のマッチの高さを表しAI、BIは、i番目のマッチマッチの2列目の高さを表しています。

カラムは、マッチの隣り合う2つのマッチとの間の最小距離ことを交換することによって交換することができるの位置と一致しています。この最小距離を取得します、交換は時間の最小数を必要としますか?この数は、最小スイッチング周波数は大きすぎるとモジュロ10 ^ 8-3に結果を出力する場合。

入力形式

計3行は、最初の行は、整数nを含むボックスあたりのマッチの数を表します。

第二列の空間によって分離された2つの整数、最初の列の高さが一致するとの間のnは整数、各々があります。

第3段目は、二つの整数間の各空間、第2カラム高さが一致することにより分離、nは整数です。

出力フォーマット

最小スイッチング周波数とモジュロ10 ^ 8-3の結果を表す整数。


[シグマ(AI-BI)^ 2 =Σ(BI ^ AI ^ 2 + 2-2最初の方程式をプッシュするAI BI)がAI ^ 2 + BI ^ 2和見出すことができることは、BI *ちょうど最大aiを見つけ、一定であります値;

AIとBIが昇順に配置されている場合、見つけることができる、* BIが最も大きい愛。

両方がAIとBIは、テンプレートとしてのAI昇順に離散化することができた後ので、配置は、オーダーのaiを双方向になり、

逆に要求することが考えられます。

多くの解決方法、私は重みツリーラインを使用します。

コード:

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100010;
const int M=2000100;
const LL mod=1e8-3;
int n,a[N],a1[N],b[N],b1[N],sum,pos[N];
LL ans;
struct Node{
	int l,r,w;
}tr[N*4];
void build(int l,int r,int k){
	tr[k].l=l,tr[k].r=r;
	if(l==r){
		tr[k].w=0;
		return;
	}
	int d=(l+r)>>1;
	build(l,d,ls);
	build(d+1,r,rs);
	tr[k].w=tr[ls].w+tr[rs].w;
}
void add(int p,int k){
	if(tr[k].l==tr[k].r){
		tr[k].w++;
		return;
	}
	int d=(tr[k].l+tr[k].r)>>1;
	if(p<=d) add(p,ls);
	else add(p,rs);
	tr[k].w=tr[ls].w+tr[rs].w;
}
void query(int ll,int rr,int k){
	if(tr[k].l>=ll&&tr[k].r<=rr){
		sum+=tr[k].w;
		return;
	}
	int d=(tr[k].l+tr[k].r)>>1;
	if(ll<=d) query(ll,rr,ls);
	if(rr>d) query(ll,rr,rs);
}
int main(){	
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),a1[i]=a[i];
	for(int i=1;i<=n;i++) scanf("%d",&b[i]),b1[i]=b[i];
	sort(a1+1,a1+1+n),sort(b1+1,b1+1+n);
	for(int i=1;i<=n;i++){
		a[i]=lower_bound(a1+1,a1+n+1,a[i])-a1;
		b[i]=lower_bound(b1+1,b1+n+1,b[i])-b1;
	}
	for(int i=1;i<=n;i++) pos[a[i]]=i;
	build(1,n,1);
	for(int i=1;i<=n;i++){
		sum=0;
		query(pos[b[i]]+1,n,1);
		(ans+=sum)%=mod;
		add(pos[b[i]],1);
	}
	cout<<ans<<endl;
	return 0;
}

公開された264元の記事 ウォン称賛46 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_44291254/article/details/105206747