首页 > 其他分享 >CF1585F Non-equal Neighbours - 容斥 - dp - 单调栈

CF1585F Non-equal Neighbours - 容斥 - dp - 单调栈

时间:2023-07-10 19:23:59浏览次数:58  
标签:Non int 钦定 cap 容斥 CF1585F long leq dp

题目链接:https://codeforces.com/problemset/problem/1585/F

题解:
难难难
考虑容斥:设 \(A_i\) 表示 \(b_i \neq b_{i+1}\) (\(i=1,2,\cdots,n-1\)) 时对应的 \(\{b_i\}\) 方案的答案
那么答案就是 $$\bigcap_{{i=1}}^{n}A_{i} = |U|-\left|\bigcup_{i=1}^n\overline{A_i}\right|$$
后者可以用容斥原理化简。也就是这个式子:

\[\begin{aligned}\left|\bigcup _{i=1}^{n}A_{i}\right|={};\sum _{i=1}^{n}|A_{i}|-\sum _{1\leq i;j\leq n}|A_{i}\cap A_{j}|+\sum _{1\leq i;j;k\leq n}|A_{i}\cap A_{j}\cap A_{k}|-\cdots +(-1)^{n-1}\left|A_{1}\cap \cdots \cap A_{n}\right|.\end{aligned} \]

考虑这个过程的意义:\(|\overline{A_i}|\) 的含义就是我钦定了 \(b_i=b_{i+1}\),然后剩下的随便选(也就是没有限制了),\(|\overline{A_i}\cup\overline{A_j}|\) 的含义就是钦定了 \(b_i=b_{i+1}\and b_j=b_{j+1}\),然后剩下的没有限制。
那这个贡献如何算呢?我们发现,如果有 \(b_i=b_{i+1}=b_{i+2}\) 的话,那么这段的贡献就是三个数的 min,再和别的部分相乘。
可以将每一个相同的连续部分看成一“段”,如果已经钦定了 \(k\) 个连续的部分,那相当于有 \(n-k\) 个“段”,考虑对段的贡献进行 dp。
设 \(dp_{i,j}\) 表示考虑到第 \(i\) 个位置,当前划分了 \(j\) 个段的贡献,那么显然 \(dp_{i,j} \leftarrow dp_{k,j-1}\times min(a_{k+1}..a_i)\)
注意这里“段”的意义是我“钦定”的段。一个例子:我可以将 \(1..5\) 划分为 \([1,3], [4,4], [5,5]\),段内的元素一定是相同的,这是我钦定的,但是段间的元素也可能相同,这是我钦定之后没有其它限制条件的结果。例如 \(a_4=a_5\) 是合法的。
然后由于容斥系数的正负只和 \(j\) 的奇偶性有关,可以变成 \(O(n^2)\),再利用单调栈记录一下上一个比当前位置小的位置,写出来转移发现可以化简。后面的部分和这篇博客差别不大。

代码:

// by SkyRainWind
#include <bits/stdc++.h>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define pii pair<int,int>
#define pb push_back

using namespace std;

typedef long long ll;
typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f, maxn = 2e5+5, mod =998244353;

int n,a[maxn];
int dp[maxn][2], pre[maxn][2];
stack<int>stk;

signed main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	dp[0][0] = pre[0][0] = 1;
	for(int i=1;i<=n;i++){
		while(!stk.empty() && a[stk.top()] >= a[i])stk.pop();
		if(stk.empty()){
			dp[i][0] = 1ll * pre[i-1][1] * a[i] % mod;
			dp[i][1] = 1ll * pre[i-1][0] * a[i] % mod;
		}else{
			int p = stk.top();
			for(int j=0;j<=1;j++){
				(dp[i][j] = 1ll*dp[p][j] + 1ll*(pre[i-1][j^1]-pre[p-1][j^1]+mod)*a[i]%mod)%=mod;
			}
		}
		for(int j=0;j<=1;j++)
			(pre[i][j] = pre[i-1][j] + dp[i][j])%=mod;
		stk.push(i);
	}
	int sgn = (n&1) ? -1 : 1;
	printf("%d\n",((dp[n][0]-dp[n][1])*sgn+mod)%mod);

	return 0;
}

标签:Non,int,钦定,cap,容斥,CF1585F,long,leq,dp
From: https://www.cnblogs.com/SkyRainWind/p/17542064.html

相关文章

  • docker with non root priviledge
    RunningDockerContainersasNon-RootUserhttps://www.geeksforgeeks.org/running-docker-containers-as-non-root-user/Bydefault,DockerContainersrunasRootUsers.Now,ifyouarerunningapplicationsinsideDockerContainers,youhaveaccesstoallth......
  • BZOJ 1042:[HAOI2008]硬币购物 容斥原理 背包dp
    1042:[HAOI2008]硬币购物TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 2505  Solved: 1505[Submit][Status][Discuss]Description硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次......
  • Celery 使用 Ansible API 返回 None
    #在celerytask中加入#frommultiprocessingimportcurrent_process#current_process()._config={"semprefix":"/mp"}@app.taskdefcreate_task()frommultiprocessingimportcurrent_processcurrent_process()._config={"sempref......
  • 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in
    项目场景:mysql创建function报错误1418-ThisfunctionhasnoneofDETERMINISTIC,NOSQL,orREADSSQLDATAin问题描述:执行创建函数的sql语句时,提示:ThisfunctionhasnoneofDETERMINISTIC,NOSQL,orREADSSQLDATAinitsdeclarationandbinaryloggingisenab......
  • 2023-07-03 禁止uniapp之app端上下滑动出现的回弹效果:"app-plus": {"bounce": "none"}
    前言:uni项目打包到app(以Android为例)上运行,上下滑动页面的时候会出现一个半圆,这就是所谓的退弹,如需关闭可在pages.json文件中的globalStyle中添加一下代码即可:"app-plus":{"bounce":"none"}uniapp关于app-plus的更多配置可参考官网:https://uniapp.dcloud.net.cn/colloc......
  • 51.pyinstaller打包后,打开exe程序提示SyntaxError: Non-UTF-8 code starting with '\
    最后开发了一款小工具,然后确定一切测试没有问题,想通过pyinstaller将其打包成exe,像类似的打包以前也经常打包的,复杂一点的也都是打包成功的,但这里感觉程序很简单,打包居然出现了以下错误。我的python版本是3.8.9,然后pyinstaller版本是5.9.0,不知道会不会是版本不兼容的问题,看网上哪......
  • python在if判断语句中对于0和None的处理
    情景:我在访问一个字典的key,但是我不知道这个key有没有,或者有,我也不知道value取值多少,即dict1.get(key)有可能输出None,也有可能输出0如果我对这个key进行判断,例如:ifdict1.get(key)这种判断,可能对于None和0的条件都是一样的,因此,如果我只是想判断是否存在这个key,我需要ifdict1......
  • Kullback-Leibler-divergence 和 Jensen–Shannon divergence 的计算示例
    #!/usr/bin/envpython3#-*-coding:utf-8-*-"""CreatedonFriJun2616:05:572020@author:vkchlt0297"""frommatplotlibimportpyplotfrommathimportlog2importnumpyasnp#Defineeventevents=['red'......
  • Phenomenon•Observation•Uncertainty/Certainty•Statistical law•Random phenomen
    Mathematics:thelogicofcertainty.Statistics:thelogicofuncertainty. Certainty/Uncertainty:  Phenomenon•Result Phenomenon->Observation->(Certainty,Uncertainty) Trial/Test:withinsameconditions;Observeobjectivephenomenon.......
  • git报错 failed: The TLS connection was non-properly terminated.
    问题现象:kali@kali:~$gitclonehttps://www.github.com/FluxionNetwork/fluxion.gitCloninginto'fluxion'...fatal:unabletoaccess'https://www.github.com/FluxionNetwork/fluxion.git/':gnutls_handshake()failed:TheTLSconnectionwasnon......