首页 > 其他分享 >CF1738 E. Balance Addicts

CF1738 E. Balance Addicts

时间:2022-10-01 15:12:43浏览次数:76  
标签:return int res Addicts CF1738 后缀 resb Balance mod

https://codeforc.es/contest/1738/problem/E

考虑回文的构造最典的一定是 2 边向中间不断扩展的形式,这启发我们从这个方面着手思考。

考虑 \(f(l,r)\) 为区间 \([l,r]\) 的答案,则显然我们要选择若干组相等的前后缀和进行递归处理。

考虑 \(a\ge 0\),所以前后缀和单不降,所以倘若 \((x,y)\),满足 \(a[l,x]=a[y,r]\),则显然不会出现,\((X,Y),X<x,Y<y\) 的情况出现,也就是说,倘若我们把当前合法二元组看成线段的话,那么显然所有线段是互相包含的。于是,我们可以找到唯一没有被包含的线段,则无论如何,一组合法的方案一定包含这个前后缀相等,因此可以将其赋值为 \(0\),计算下去即可。

考虑可能有前后缀 \(0\) 出现,那么这个样子线段就会出现可能不包含的情况。

于是,我们考虑能否通过计算贡献,然后计算消除前后缀 \(0\) 的答案的形式,来消除前后缀 \(0\) 的影响。

显然,可以考虑将前后缀 \(0\) 划分成若干段即可。

为啥正确,显然倘若划分不完,多出来的 \(0\) 对和无影响,自然归入下一部分的计算答案中了。

#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int N=(int)(1e5+5),mod=998244353;
int n,a[N],cnt[N],jie[N],djie[N];

int fpow(int x,int y) {
	int res=1; x%=mod;
	while(y) {
		if(y&1) res=res*x%mod;
		y>>=1; x=x*x%mod;
	}
	return res;
}

int C(int n,int m) {
	if(m>n||n<0||m<0) return 0;
	return jie[n]*djie[m]%mod*djie[n-m]%mod;
}

int solve(int l,int r) {
	if(l>=r) return 1;
//	for(int i=l;i<=r;i++) {
//		if(a[i])
//	}
	int L=l-1,R=r+1;
	while(L+1<=r&&a[L+1]==0) ++L;
	while(R-1>=l&&a[R-1]==0) --R;
	if(L>=R) {
		return fpow(2,r-l);
	}
	if(L>=l&&R<=r) {
		int res=0,num1=L-l+1,num2=r-R+1;
		for(int i=0;i<=min(num1,num2);i++) res=(res+C(num1,i)*C(num2,i)%mod)%mod;
		return res*solve(L+1,R-1)%mod;
	} else {
		L=l-1; R=r+1;
		int resa=0,resb=0;
		do {
			if(resa>=resb) --R,resb+=a[R];
			else ++L,resa+=a[L];
			if(L>=R) return 1;
		} while(resa!=resb||L<l||R>r);
//		cout<<L<<" : "<<R<<'\n';
		if(L>=R) return 1;
		a[L]=a[R]=0; //下面的无论如何一定选这 2 段 
		return solve(L,R);
	}
}

void sol() {
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	int ans=solve(1,n); ans=(ans%mod+mod)%mod;
	cout<<ans<<'\n'; 
}

signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	jie[0]=djie[0]=1; for(int i=1;i<=N-5;i++) jie[i]=jie[i-1]*i%mod,djie[i]=fpow(jie[i],mod-2);
	int T; cin>>T; while(T--) sol();
	return 0;
}

标签:return,int,res,Addicts,CF1738,后缀,resb,Balance,mod
From: https://www.cnblogs.com/xugangfan/p/16747208.html

相关文章

  • CF1738H Palindrome Addicts
    题意初始有一个空字符串\(s\)。给定\(q\)组操作,每次操作是在\(s\)后加一个字符或是在\(s\)前删一个字符。每次操作后要输出\(s\)中本质不同回文子串数。数据......
  • Even Number Addicts - 题解【动态规划/记忆化搜索】
    题面本题是CodeforcesGlobalRound22的C题。原题链接见:C.EvenNumberAddicts。下面搬运一下题面:DescriptionAliceandBobareplayingagameonasequence\(a_......
  • LeetCode 1382. Balance a Binary Search Tree
    原题链接在这里:https://leetcode.com/problems/balance-a-binary-search-tree/题目:Giventhe root ofabinarysearchtree,return a balanced binarysearchtre......
  • glusterFS 删除节点 容量均衡gluster volume rebalance
    一、不是复制卷1.删除brickglustervolumeremove-brick卷名节点名或ip:brick所在的地址 start2.删除节点glusterpeerdetach 节点名或ip二、是复制卷1.降低副本数......
  • 110.balanced-binary-tree 平衡二叉树
    获取左右子树的高度,如果左右子树高度差小于等于1,则判断左右子树的左右子树,如此递归下去。classSolution{public:intgetDp(TreeNode*root){if(root......
  • SpringCloud 使用 LoadBalance 实现客户端负载均衡
    SpringCloud从2020.0.1版本开始,从Eureka中移除了Ribbon组件,使用LoadBalance组件来代替Ribbon实现客户端负载均衡。LoadBalance组件相对于Ribbon来说,仅支持两......
  • Kafka——Controller、Rebalance、HW的基础概念
    Kafka——Controller、Rebalance、HW1.ControllerKafka集群中的broker在zk中创建临时序号节点,序号最小的节点(最先创建的节点)将作为集群的controller,负责管理整个集群中......
  • kafka触发Rebalance
    当kafka遇到如下四种情况的时候,kafka会触发Rebalance:消费组成员发生了变更,比如有新的消费者加入了消费组组或者有消费者宕机消费者无法在指定的时间之内完成消息的消费......
  • Balanced Tree (数学函数式子的处理)
    题目大意•求n个点组成的每个节点都满足左右子树大小相差至多1的二叉树个数.•0≤n<264.•关键词:计数2022-暑假-VirtualJudge(vjudge.net)思路:直接用......
  • FB(S1C1): PInvokeStackImbalance对PInvoke函数的调用导致堆栈不对称
    FB(S1C1):PInvokeStackImbalance对PInvoke函数的调用导致堆栈不对称 问题:    C#语言对C语言导出函数进行调用时报出的错误. 方案:   设置调用约定Call......