[CSP-Sシミュレーション試験]:最大値(+数学セグメントツリー)

トピックの背景

  Maxtir $好きな最大値を$。


トピックポータル(内部タイトル128)


入力形式

  $ N、M、Qの$整数最初の4つの入力ライン$ 1 $肯定。
  3つの属性$(X_I、Y_I、P_I)スパー$ $ 2 $ N + 1 $行、最初の行$ I + 1 $ I $ $入力マジック $。
  2つの正の整数$ L_iを、R_iと$の次の$ Q $ラインは、データは$ [L_iを、R_iと] $相互に排他的な保証しました。


出力フォーマット

  出力ラインの正の整数$ ANS $答えを表現しています。


サンプル

サンプル入力:

3 3 2
1 1 500000004
2 2 333333336
3 3 1
1 2
2 3

出力例:

4


データ範囲とヒント

サンプルは説明しました:

$ 500000004 \当量\ FRAC {1} {2} \ MOD(10 ^ 9 + 7)、333333336 \当量\ FRAC {1} {2} \ MOD(10 ^ 9 + 7)$

魔法のスパーの最終シーケンスがあるかもしれません

$(\ Otimes、\ otimes、3)、(\ otimes、2,3)、(1、\ otimes、3)は、(1,2,3)$はそれらの確率の4である$ \ FRAC {1 } {3}、\ FRAC {1} {6}、\ FRAC {1} {3}、\ FRAC {1} {6} $

二つは、$(0,3)、(2,3)、(1,3)、(2,3)$であり、エネルギーを吸収し、最終的な答えは、$ 3 \回\ FRAC {1}、{3}である+5 \回\ FRAC {1} {6} +4 \回\ FRAC {1} {3} +5 \回\ FRAC {1} {6} = 4 $

データ範囲:

$ 0 \ $ 100のための%$データ満たす\ leqslant Y_I \ leqslant 10 ^ 9,1 \ leqslant Q \ leqslant nは、0 \ leqslant P_I <10 ^ 9 + 7 $


問題の解決策

$ 30とスタート\開始するためのサブセクションの%の$(暴力の$ 10 \%$は本当にありません技術的な内容です)。

最小値にそれぞれの魔法なので、それは魔法のスパー降順かもしれません。

貢献は、それはそれよりも小さく表示され、表示されませんでした場合に限り、魔法のスパー(現在の魔法)を行うことができます。

したがって、そのような状態の発生確率を考慮して、$ P(\最大\ limits_ {iはLを=} ^ rv_i \ geqslant X)$を求めている; $ 1-与えるために、式のクリック\ PRODを\ limits_ {iがLに= } ^ R1-P(V_I \ geqslant X)$。

私たちはあまり$ X $の数よりもできるようにするには、$ P(V_I \ geqslant x)は$であること、確率のオプションマイナスすべての数字が選択されていない確率を取りません。

各変化の寄与を最適化する方法を検討$ 1-P(V_I \ geqslant Y)\ RIGHTARROW 1-P(V_I \ geqslant X)$です。

しかし、我々は唯一の$ Q = \ PROD \ limits_は{私はL =}考慮することができます^ R1-P(V_I \ geqslant X)$ので、あなたが修正$ \シータ(\ログN)$ができることを。

相互に排他的な性質の間隔を使用する方法を考えます。

すべての間隔は、左のエンドポイントの順序、あなたは変態点を達成することができ、インターバルは、ツリーラインを使用して最適化することができます。

時間の複雑さ:$ \シータ(M \ログのq)$。

期待はスコア:$ $ 100ポイントを。

実際のスコア:$ $ 100ポイント。


コードの時間

#include<bits/stdc++.h>
#define L(x) x<<1
#define R(x) x<<1|1
using namespace std;
const int mod=1000000007;
struct rec{int x,y,p;}f[200001];
struct node{int nxt,to;}e[400001];
int head[200001],cnt;
int n,m,q;
int l[200001],r[200001];
long long b[200001];
long long tr[400001],lz[400001];
pair<int,int> p[200001];
long long ans;
bool cmp(rec a,rec b){return a.y<b.y;}
void add(int x,int p)
{
	e[++cnt].nxt=head[x];
	e[cnt].to=1LL*e[head[x]].to*(1-p)%mod;
	head[x]=cnt;
}
long long qpow(long long x,long long y)
{
	long long res=1;
	while(y)
	{
		if(y&1)res=res*x%mod;
		x=x*x%mod;y>>=1;
	}
	return res;
}
void pushup(int x){tr[x]=(tr[L(x)]+tr[R(x)])%mod;}
void build(int x,int l,int r)
{
	lz[x]=1;
	if(l==r){tr[x]=1;return;}
	int mid=(l+r)>>1;
	build(L(x),l,mid);
	build(R(x),mid+1,r);
	pushup(x);
}
void pushdown(int x)
{
	tr[L(x)]=lz[x]*tr[L(x)]%mod;
	tr[R(x)]=lz[x]*tr[R(x)]%mod;
	lz[L(x)]=lz[x]*lz[L(x)]%mod;
	lz[R(x)]=lz[x]*lz[R(x)]%mod;
	lz[x]=1;
}
void change(int x,int l,int r,int L,int R,int w)
{
	if(r<L||R<l)return;
	if(L<=l&&r<=R){tr[x]=tr[x]*w%mod;lz[x]=lz[x]*w%mod;return;}
	int mid=(l+r)>>1;
	pushdown(x);
	change(L(x),l,mid,L,R,w);
	change(R(x),mid+1,r,L,R,w);
	pushup(x);
}
void change(int x)
{
	if(r[x]<l[x])return;
	int res=qpow(1-(e[head[x]].to-b[x])%mod,mod-2);
	head[x]=e[head[x]].nxt;
	change(1,1,q,l[x],r[x],(1-e[head[x]].to+b[x])*res%mod);
}
int main()
{
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=m;i++)scanf("%d%d%d",&f[i].x,&f[i].y,&f[i].p);
	for(int i=1;i<=q;i++)scanf("%d%d",&p[i].first,&p[i].second);
	sort(f+1,f+m+1,cmp);cnt=n;
	for(int i=1;i<=n;i++){e[i].to=1;head[i]=i;}
	for(int i=1;i<=m;i++)add(f[i].x,f[i].p);
	for(int i=1;i<=n;i++)b[i]=e[head[i]].to;
	int fl=1,fr=0;
	for(int i=1;i<=n;i++)
	{
		while(fl<=fr&&p[fl].second<i)fl++;
		while(p[fr+1].first<=i&&fr<q)fr++;
		l[i]=fl;r[i]=fr;
	}
	build(1,1,q);
	for(int i=m,j;i;i=j)
	{
		for(j=i;f[i].y==f[j].y&&j;j--)change(f[j].x);
		ans=(ans+tr[1]*(f[i].y-f[j].y))%mod;
	}
	ans=(1LL*f[m].y*q-ans)%mod;
	printf("%d\n",(ans+mod)%mod);
	return 0;
}

rp++

おすすめ

転載: www.cnblogs.com/wzc521/p/11815860.html