正题
题目链接:https://atcoder.jp/contests/agc053/tasks/agc053_e
题目大意
给出nnn个二元组(ai,bi)(a_i,b_i)(ai,bi),求有多少个1∼n1\sim n1∼n的排列ppp满足:
- 你可以将一些(ai,bi)(a_i,b_i)(ai,bi)变为(bi,ai)(b_i,a_i)(bi,ai)
- 定义序列x2i−1=api,x2i=bpix_{2i-1}=a_{p_i},x_{2i}=b_{p_i}x2i−1=api,x2i=bpi,使得xxx恰好有n−1n-1n−1个峰值。
保证ai,bia_i,b_iai,bi互不相同。
对109+710^9+7109+7取模
1≤n≤2×105,1≤ai,bi≤2n1\leq n\leq 2\times 10^5,1\leq a_i,b_i\leq 2n1≤n≤2×105,1≤ai,bi≤2n
解题思路
考虑怎样的排列满足条件,因为每个二元组的位置最多产生一个峰值,所以我们可以考虑没有产生峰值的位置。
先令所有的ai<bia_i<b_iai<bi,那么如果是最后一个二元组没有产生峰值,那么我们应该会排列成ab˙ab˙ab˙ab˙ab˙...aba\dot{b}a\dot{b}a\dot{b}a\dot{b}a\dot{b}...abab˙ab˙ab˙ab˙ab˙...ab的形式,那么就要求了bi>ai+1b_i>a_{i+1}bi>ai+1。
如果是中间的某个位置ppp没有产生峰值,那么应该是ab˙ab˙...abb˙ab˙ab˙ab˙a...b˙aa\dot{b}a\dot{b}...ab\dot{b}a\dot{b}a\dot{b}a\dot{b}a...\dot{b}aab˙ab˙...abb˙ab˙ab˙ab˙a...b˙a的形式。
那么就要求bi>ai+1(i<p),bi≥ai+1(i>p+1),bp+1>bpb_i>a_{i+1}(i<p),b_i\geq a_{i+1}(i>p+1),b_{p+1}>b_{p}bi>ai+1(i<p),bi≥ai+1(i>p+1),bp+1>bp,有可能我们将p+1∼np+1\sim np+1∼n都翻转一下也是合法的,所以为了防止计算重复,我们强制要求ap+1>bpa_{p+1}>b_pap+1>bp就可以了。
那么考虑如何计数,我们记fif_ifi表示满足bj>bi,aj<aib_j>b_i,a_j<a_ibj>bi,aj<ai的二元组个数,然后我们从bbb小的到bbb大的填。
那么对于第一种情况,我们答案就是∏i=1n(fi+1)\prod_{i=1}^n (f_i+1)∏i=1n(fi+1)。至于第二种情况,我们枚举考虑pip_ipi和pi+1p_{i+1}pi+1分别是x,yx,yx,y那么答案就是
∏i=1x−1fi×∏i=x+1y−1(fi+1)×∏i=y+1(fi+2)\prod_{i=1}^{x-1}f_i\times \prod_{i=x+1}^{y-1}(f_{i}+1)\times \prod_{i=y+1}(f_{i}+2)i=1∏x−1fi×i=x+1∏y−1(fi+1)×i=y+1∏(fi+2)
用个树状数组计数就好了,时间复杂度:O(nlogn)O(n\log n)O(nlogn)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define lowbit(x) (x&-x)
using namespace std;
const ll N=4e5+10,P=1e9+7;
struct node{ll a,b;
}a[N];
ll n,w[N],t[N],f[N][3];
void Change(ll x,ll val){while(x<=2*n){(t[x]+=val)%=P;x+=lowbit(x);}return;
}
ll Ask(ll x){ll ans=0;while(x){(ans+=t[x])%=P;x-=lowbit(x);}return ans;
}
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
ll inv(ll x)
{return power(x,P-2);}
bool cmp(node x,node y)
{return x.b<y.b;}
signed main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++){scanf("%lld%lld",&a[i].a,&a[i].b);if(a[i].a>a[i].b)swap(a[i].a,a[i].b);}sort(a+1,a+1+n,cmp);ll ans=1;for(ll i=n;i>=1;i--){w[i]=Ask(a[i].b);ans=ans*(w[i]+1)%P;Change(a[i].a,1);}f[0][0]=f[0][1]=f[0][2]=1;for(ll i=1;i<=n;i++)for(ll j=0;j<3;j++)f[i][j]=f[i-1][j]*(w[i]+j)%P;memset(t,0,sizeof(t));for(ll i=1;i<=n;i++){(ans+=Ask(a[i].a)*f[n][2]%P*inv(f[i][2])%P*f[i-1][1]%P)%=P;Change(a[i].b,f[i-1][0]*inv(f[i][1])%P);}printf("%lld\n",ans);return 0;
}