首页 > 其他分享 >[ARC174E] Existence Counting

[ARC174E] Existence Counting

时间:2024-08-28 11:28:10浏览次数:10  
标签:int inv 300010 ans Existence ARC174E Counting

My Blogs

[ARC174E] Existence Counting

比较机械的处理方式。和 NOID2T2 是一个性质,只不过简单多了。

枚举生成序列和 \(P\) 的第一个不同位置 \(i\),则第 \(i\) 个位置能填的数的个数 \(g_i\) 是 \(<a_i\) 并且之前没有出现过的数,\(g_i\) 可以简单用树状数组求出。

然后考虑如何统计答案。对于 LCP 中所有数的贡献:首先有了 \(g_i\),设 \(ans_i\) 表示第 \(i\) 个位置开始字典序小于 \(P\) 的序列的方案数,则 \(ans_i=g_i(m-i)^{\underline{n-i}}\)。

然后对于一个 \(j\),他作为前缀,则所有 \(i>j\) 的 \(ans_i\) 都对它有贡献。求出 \(ans\) 之后做一遍后缀和统计这部分的答案。

在 \(i\) 后面出现的答案。直接的想法是分为第 \(i\) 个位置和后面 \(n-i\) 个位置两种情况分别统计。第一种情况是对所有 \(<p_i\) 并且在前面没有出现过的数字有贡献,对偶一下,对于一个 \(p_i\),会对他造成贡献的是 \(j<i\) 并且 \(p_j>p_i\) 的数,这样可以用树状数组维护单点加,后缀和。

但是第二种情况,在 \(j<p_i\) 时,贡献是 \((g_i-1)(m-i-1)^{\underline{n-i-1}}\),但是 \(j\geq p_i\) 时贡献是 \(g_i(m-i-1)^{\underline{n-i-1}}\)。可以看成全局没有出现过的 \(+g_i(m-i-1)^{\underline{n-i-1}}\),然后 \(j<p_i\) 的减去 \((m-i-1)^{\underline{n-i-1}}\),减去的这部分可以和上面第一种情况共用一个树状数组维护后缀和即可。总复杂度 \(\mathcal O(n\log n)\)。

int n,m,a[300010],f[300010],fr[300010],inv[300010],ans[300010];
inline int C(int n,int m){return m<0||m>n?0:Cmul(fr[n],inv[m],inv[n-m]);}
struct BIT
{
	int t[300010];
	inline void add(int x,int y=1){for(;x<=m;x+=x&-x)Madd(t[x],y);}
	inline int ask(int x){int s=0;for(;x;x-=x&-x)Madd(s,t[x]);return s;}
}T1,T2;
bool vis[300010];
inline void mian()
{
	read(m,n),f[n+1]=fr[0]=inv[0]=1;int lst,tmp=0;
	for(int i=1;i<=m;++i)fr[i]=Cmul(fr[i-1],i);
	inv[m]=power(fr[m],MOD-2);
	for(int i=m-1;i>0;--i)inv[i]=Cmul(inv[i+1],i+1);
	for(int i=1;i<=n;++i)read(a[i]);
	for(int i=1;i<=n;++i)
	{
		T1.add(a[i]),lst=a[i]-1-T1.ask(a[i]-1),f[i]=Cmul(lst,C(m-i,n-i),fr[n-i]);
		Madd(tmp,Cmul(lst,C(m-i-1,n-i-1),fr[n-i]));
		T2.add(m-a[i]+2,Cdel(Cmul(C(m-i,n-i),fr[n-i]),Cmul(C(m-i-1,n-i-1),fr[n-i])));
		Madd(ans[a[i]],T2.ask(m-a[i]+1),tmp);
		vis[a[i]]=1;
	}
	for(int i=1;i<=m;++i)if(!vis[i])Madd(ans[i],T2.ask(m-i+1),tmp);
	for(int i=n;i>=1;--i)Madd(f[i],f[i+1]),Madd(ans[a[i]],f[i+1]);
	for(int i=1;i<=m;++i)write(ans[i],'\n');
}

标签:int,inv,300010,ans,Existence,ARC174E,Counting
From: https://www.cnblogs.com/WrongAnswer90/p/18384272

相关文章

  • SAP Parallel Accounting(平行分类账业务)配置及操作手册【适用于多国家会计准则】
    1.配置准备1.1理解平行账概念平行账,也称为多分类账,是SAP系统中的一项功能,它允许企业按照不同的会计准则来维护各自的财务数据。这种设置特别适用于那些需要符合多种会计准则的跨国公司。通过平行账,企业可以在不同的分类账中记录相同的交易,但按照各自的会计政策进行处理。......
  • 洛谷P1596 [USACO10OCT] Lake Counting S
    这种普通走迷宫的题,还是最好用bfs,毕竟复杂度是比dfs低的。但我这用dfs讲解。具体思路就不做详解,看代码注释。Code#include<bits/stdc++.h>usingnamespacestd;intn,m;chara[105][105];intdx[8]={0,1,-1,0,-1,1,-1,1};//搜索的八个方向常量,xintdy[8]={1,0......
  • COUNTING-SORT(计数排序) and
    计数排序             计数排序假设n个输入元素(适用于小范围区间)中的每一个都是在0到k区间内的一个整数,其中k为某个整数。当k=O(n)时,排序的运行时间为.    计数排序的基本思想:对每一个输入的元素x,确定小于x的元素个数。利用这一信息,就可以直接把x......
  • 题解:CF1608F MEX counting
    题解:CF1608FMEXcounting与其他题解不同,本篇题解是运用辅助数组$g$来解决问题。虽然代码可能要繁琐一点,但是辅助数组的思路适用范围更广一点。首先还是转化为前$i$个数的$mex$在区间$[l_i,r_i]$内。我们用dp数组$f_{i,x,c}$表示处理到了第$i$个数,当前的mex为......
  • YC322A [ 20240724 CQYC NOIP 模拟赛 T4 ] 庫的 序计数(counting)
    题意给定一棵树\(T\),每次操作在某个点下方接上\(k\)个儿子。询问期望多少次排列,使得\(a_{fa_i}<a_i\)。保证\(k\)是偶数,对\(65536\)取模。\(n\le10^5,k\le2\times10^9\)。Sol考虑假如已经确定了一棵树的形态,如何求出最终的答案?可以发现对于每一个节点......
  • 洛谷P1596 [USACO10OCT] Lake Counting S 题解
    看别的神犇用的都是并查集,我还是用暴搜吧(doge下面纯暴搜#include<bits/stdc++.h>usingnamespacestd;intn,m,ans;//N行M列和答案charc[105][105];//存储农田的二维向量voiddfs(intx,inty){//暴搜 if(c[x][y+1]=='W'){ c[x][y+1]='.';//将水坑改为......
  • 1004 Counting Leaves(dfs):邻接表版:写的太多了
    Afamilyhierarchyisusuallypresentedbyapedigreetree.Yourjobistocountthosefamilymemberswhohavenochild.InputSpecification:Eachinputfilecontainsonetestcase.Eachcasestartswithalinecontaining0<N<100,thenumberofnode......
  • [题解]AT_abc216_f [ABC216F] Max Sum Counting
    思路首先,不难发现,对于本题将\(a,b\)合成一个序列,并按照\(a_i\)排序的答案不会发生变化。所以,我们可以直接排序,那么,我们当前枚举到的\(a_i\)就是当前的\(\max(a_i)\)。定义\(dp_{i,j,0/1}\)表示在\(1\simi\)中,选择的\(b_i\)之和为\(j\),并且第\(i\)个数不选/选......
  • CF1919E Counting Prefixes
    CF1919ECountingPrefixesRating:2600题目大意有一个由-1与1构成的数列\(A\)。告诉你它的前缀和升序排序的数列\(P\)。求有多少个满足方案的数列\(A\)。多组数据,其中\(A\)的长度\(n\)有。\(\sumn\leq5000\)。解题思路首先我们考虑枚举\(s=\sumA\)。我......
  • Counting Rhyme
    题面翻译给定长度为\(n\)的序列\(a\)。对于\(1\leqi<j\leqn\),若不存在\(k\in[1,n]\)使得\(a_k\mida_i\)且\(a_k\mida_j\)那么\((i,j)\)是好的。求出好的数对数量。\(1\lea_i\len\leq10^6\)。题目描述Youaregivenanarrayofintegers$a_1,a_2,\ldot......