AGC053E-More Peaks More Fun【计数】

正题

题目链接:https://atcoder.jp/contests/agc053/tasks/agc053_e


题目大意

给出nnn个二元组(ai,bi)(a_i,b_i)(ai,bi),求有多少个1∼n1\sim n1n的排列ppp满足:

  1. 你可以将一些(ai,bi)(a_i,b_i)(ai,bi)变为(bi,ai)(b_i,a_i)(bi,ai)
  2. 定义序列x2i−1=api,x2i=bpix_{2i-1}=a_{p_i},x_{2i}=b_{p_i}x2i1=api,x2i=bpi,使得xxx恰好有n−1n-1n1个峰值。

保证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 2n1n2×105,1ai,bi2n


解题思路

考虑怎样的排列满足条件,因为每个二元组的位置最多产生一个峰值,所以我们可以考虑没有产生峰值的位置。
先令所有的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),biai+1(i>p+1),bp+1>bp,有可能我们将p+1∼np+1\sim np+1n都翻转一下也是合法的,所以为了防止计算重复,我们强制要求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_ipipi+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=1x1fi×i=x+1y1(fi+1)×i=y+1(fi+2)

用个树状数组计数就好了,时间复杂度:O(nlog⁡n)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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)

「JOISC 2020 Day4」治疗计划 description solution 设dpi:1−Ridp_i:1-R_idpi​:1−Ri​ 都能被救治成功的最小花费 两个治疗方案[Li,Ri],[Lj,Rj][L_i,R_i],[L_j,R_j][Li​,Ri​],[Lj​,Rj​]能够合并成完整的健康区间的条件为Ri−Lj1≥∣Ti−Tj∣R_i-Lj1\ge |T_i-T_j|Ri​…

胡浩:人人能学的AI《从零开始机器学习》苏州.NET俱乐部课程分享

【课程名称】《从零开始机器学XI》【老师介绍】胡浩&#xff0c;微软最有价值专家&#xff08;MVP&#xff0c;十余届多方向&#xff09;&#xff0c;微软技术大会讲师。云、数据中心基础架构、全栈虚拟化、企业移动管理等领域的架构师及顾问。AI/ML等新技术的爱好者&#xff0…

整体二分例题

参考oi wiki 引入&#xff1a; 有一部分题可以使用二分的办法来解决。但是当这种题目有多次询问且每次询问我们对每个查询都直接二分&#xff0c;可能会收获一个 TLE。这时候我们就会用到整体二分。整体二分的主体思路就是把多个查询一起解决。&#xff08;所以这是一个离线算…

P8338-[AHOI2022]排列【质因数分解】

正题 题目链接:https://www.luogu.com.cn/problem/P8338 题目大意 给出一个排列pip_ipi​&#xff0c;定义ai0i,aikapik−1a_i^0i,a_i^ka_{p_i}^{k-1}ai0​i,aik​api​k−1​。 对于排列PPP&#xff0c;定义F(P)F(P)F(P)表示最小的一个正整数kkk满足Pk1PP^{k1}PPk1P。 定义…

CF1100F Ivan and Burgers(线性基)

解析 做幸运数字的时候逛题解区爬过来的 挺妙的 把所有询问离线下来&#xff0c;按右端点排序 贪心的让最高位更高的向量出现的尽可能向右 实现上可以把线性基里的向量和当前的数swap来实现 代码就非常好写了 代码 #include<bits/stdc.h> using namespace std; #defi…

[APIO2013]机器人(DP+SPFA最短路)

[APIO2013]机器人 description solution dpl,r,i,j:dp_{l,r,i,j}:dpl,r,i,j​: 在(i,j)(i,j)(i,j)位置合并编号为[l,r][l,r][l,r]区间内的所有机器人的最小花费 toi,j,k:to_{i,j,k}:toi,j,k​: 从(i,j)(i,j)(i,j)以kkk方向推机器人最终停止的位置&#xff0c;用dfs记忆化搜索…

IdentityServer4实战 - 与API单项目整合

一.前言我们在实际使用 IdentityServer4 的时候&#xff0c;可能会在使用 IdentityServer4 项目添加一些API&#xff0c;比如 找回密码、用户注册、修改用户资料等&#xff0c;这些API与IdentityServer4怎么共存在一个项目呢&#xff1f;二.整合1.首先在 Startup.cs 中添加 Ide…

P2305 [NOI2014] 购票(点分治、斜率优化)

解析 第一道完全自己做出来的黑题awa &#xff08;如果不算那道感觉完全是恶评的石油的话&#xff09; 然而连写带调整了3.5h… 容易想到链的做法 设ancxanc_xancx​表示x的祖先,disxdis_xdisx​表示x到1的距离 则有&#xff1a; dpvmin⁡disv−lv<disu,u∈ancv(dpupv(dis…

HDU1394(权值线段树)

HDU1394(权值线段树) 题意&#xff1a; 给定一个0到n-1的数字组成的序列&#xff0c;可以将序列进行左移任意次&#xff0c;求所能组成序列的逆序对的最小值 题解&#xff1a; 利用权值线段树&#xff0c;我们先求出当前序列所能组成的逆序对&#xff0c; 然后依次左移动 当…

P8339-[AHOI2022]钥匙【虚树,扫描线】

正题 题目连接:https://www.luogu.com.cn/problem/P8339 题目大意 给出nnn个点的一棵树&#xff0c;每个点有钥匙或者宝箱&#xff0c;有不同的颜色。 mmm次询问&#xff0c;从xxx走到yyy&#xff0c;走到钥匙时会拾取钥匙&#xff0c;走到宝箱时如果有同色的钥匙那么就会消耗…

[HDU 6157]The Karting(DP)

[HDU 6157]The Karting description solution 先用前缀和求出di:1→id_i:1\rightarrow idi​:1→i 的距离 前缀和满足&#xff1a;若在iii点进行方向改变&#xff0c;则iii产生的贡献是一定的&#xff0c;可以先累计贡献 也就是说真正的路径怎么走&#xff0c;我们是不关心…

.NET 开源简史

现在在微软开发开源软件是很一件正常的事情——但在 2007 年&#xff0c;当时我刚加入微软&#xff0c;那时候可不是这么一回事。微软花了好几年时间才找到正确的方向&#xff0c;让微软这艘大船顺着开源之风向前航行。现在回头远望过去那些曾经面临的挑战&#xff0c;我们一笑…

P2617 Dynamic Rankings(整体二分)

P2617 Dynamic Rankings 题意: 待修改的区间最值问题 题解&#xff1a; 整体二分天然带有修改性 整体二分做不带修改的区间最值—>看这里 现在待修改&#xff0c;我们可以将第l位修改为x&#xff0c;因为我们是用树状数组来维护的&#xff0c;所以把这个过程拆分成将第l个…

模板:虚树

所谓虚树&#xff0c;就是虚了的树 &#xff08;逃&#xff09; 前言 在有些时候&#xff0c;我们只关心树上的某些特殊点&#xff0c;问题中的整体规模较大&#xff0c;但是这些特殊点往往比较稀疏&#xff0c;这个时候就可以使用虚树&#xff0c;只保留树上的关键点&#x…

P8340-[AHOI2022]山河重整【dp,倍增】

正题 题目链接:https://www.luogu.com.cn/problem/P8340 题目大意 给出一个nnn和模数PPP。求有多少个在1∼n1\sim n1∼n中选择若干个数的集合SSS&#xff0c;满足1∼n1\sim n1∼n中的每个数都可以表示成SSS的某个子集的和。 1≤n≤5105,2≤P≤1.11091\leq n\leq 5\times 10^5…

[LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)

[LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心&#xff08;满足最重的儿子最轻&#xff0c;每个儿子siz≤n2\le\frac{n}{2}≤2n​&#xff09; 显然原树的重心答案为0 对于点iii&am…

由优劣语言之争引起的思考

由优劣语言之争引起的思考#欲使其灭亡&#xff0c;必使其疯狂昨天上午由阿里云中间件公众号和架构师小秘圈公众号发布的一篇文章《天天敲代码会使人变聪明么》在.net开发者中掀起了一阵巨浪&#xff0c;文章中提到的语言的先进与落后之争让基于.net开发者们义愤填膺&#xff0c…

P1527 [国家集训队]矩阵乘法

P1527 [国家集训队]矩阵乘法 题意&#xff1a; 给你一个 nn 的矩阵&#xff0c;每次询问一个子矩形的第 k 小数。 题解&#xff1a; 整体二分稍微加强化 模板题是一个序列&#xff0c;现在升级成一个矩阵求&#xff0c;做法和原理都是一样的 使用整体二分解决的题目&#x…

[LOJ #521]「LibreOJ β Round #3」绯色 IOI(抵达)(结论)

#521. 「LibreOJ β Round #3」绯色 IOI&#xff08;抵达&#xff09; description solution 因为点的庇护所不能为自身&#xff0c;题目背景在树上&#xff0c;有结论一定是两个相邻点互为庇护所 所以树一定要能两两完美匹配才有解 判断完有解后就是构造解了&#xff0c;…

UOJ#310-[UNR #2]黎明前的巧克力【FWT】

1# 正题 题目链接:https://uoj.ac/problem/310 题目大意 给出一个长度为nnn的序列&#xff0c;求有多少种方案找出两个集合S,TS,TS,T使得这两个集合的异或和相等。 1≤n≤1061\leq n\leq 10^61≤n≤106 解题思路 可以转换为找到一个异或和为000的集合SSS&#xff0c;产生2∣S…