ARC 128D - Neq Neq(dp+组合数学+思维)
链接
题意:
给出你一个长度为n的序列,你可以对其操作使得这个序列发生变化,问一共有多少种?
- 对于连续的i-1,i,i+1,这三个数如果满足 ai−1!=aia_{i-1}!=a_{i}ai−1!=ai并且ai!=ai+1a_{i}!=a_{i+1}ai!=ai+1 那么我们就可以将aia_iai删掉。
分析:
明显看出利用DP来解决组合数学问题。
那么我们认为第iii位置,表示到i有dp[i]种方案数。
那么他会从那种状态转移过来那?
首先dp[i]是继承dp[i-1],这一点是一定的,其次他还可以通过删除前一个元素,就是看看i-2,i-1,i是否符合前面说的条件,那么dp[i]+=dp[i-2],
还有就是除了前面一个,我们也想知道删除前面一个或者多个,那么我们用前缀维护即可,但是前缀维护到同时出现同一个数。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef unsigned long long ull;#define x first
#define y second
#define sf scanf
#define pf printf
#define PI acos(-1)
#define inf 0x3f3f3f3f
#define lowbit(x) ((-x)&x)
#define mem(a,x) memset(a,x,sizeof(a))
#define rep(i,n) for(int i=0;i<(n);++i)
#define repi(i,a,b) for(int i=int(a);i<=(b);++i)
#define repr(i,b,a) for(int i=int(b);i>=(a);--i)
#define debug(x) cout << #x << ": " << x << endl;const int MOD = 998244353;
const int mod = 1e9 + 7;
const int MAX = 2e5 + 10;
const int dx[] = {0, 1, -1, 0, 0};
const int dy[] = {0, 0, 0, 1, -1};
const int dz[] = {1, -1, 0, 0, 0, 0 };
int day[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};void init()
{}
ll qpow(ll a, ll b, ll p)
{ll ans = 1;while(b){if(b & 1) ans = ans * a % p;a = a * a % p;b >>= 1;}return ans;
}string str;
ll n,m,s;
ll a[MAX],dp[MAX],b[MAX],sum[MAX];
void solve()
{cin>>n;dp[0]=1;ll j=0,num=0,k=1;for(int i=1;i<=n;i++){cin>> a[i];dp[i]=dp[i-1];/// 继承上一状态if(a[i]==a[i-1]) j= i-1;///上一个 一对相等的位置,if(i>2&&a[i]!=a[i-1]&&a[i-1]!=a[i-2])///满足条件{dp[i]=(dp[i]+dp[i-2])%MOD;}if(b[a[i]]==0) num++;///来了一个新元素b[a[i]]++;while(k<i-2 && num>=3){b[a[k]]--;if(b[a[k]]==0)num--;k++;}if(j<k) dp[i]+=sum[k-1]-sum[j];dp[i]=(dp[i]%MOD+MOD)%MOD;sum[i]=(sum[i-1]+dp[i])%MOD;}cout<<dp[n]<<endl;}int main()
{init();ll t = 1;///scanf("%lld", &t);while(t--){solve();}return 0;
}
ARC 128D - Neq Neq(dp+组合数学+思维)相关推荐
- ARC 123 D - Inc, Dec - Decomposition (思维构造+DP)
链接 题意: 给出A序列,让你构造出B,C序列要求满足: Bi+Ci=AiB_i+C_i=A_iBi+Ci=Ai B序列递增 C序列递减 使得∑∣Bi∣+∣Ci∣\sum |B_i|+|C_i| ...
- 【题解】AtCoder ARC128D - Neq Neq
题意:有 NNN 个球排成一行,编号为 111 到 NNN . 第 iii个球上写着一个数AiA_iAi. 你可以执行下列操作任意多次: 选三个相邻的位置 xxx, yyy, zzz (1≤x< ...
- CodeForces - 336D Vasily the Bear and Beautiful Strings(dp+组合数学)
题目链接:点击查看 题目大意:给出一个 01 字符串,规定求值的过程如下: 每次选择末尾的两个数字: 如果为 0 0 ,那么替换成一个 1 否则替换成一个 0 循环往复,直至只剩一个数字位置,剩下的数 ...
- ZOJ - 4114 Flipping Game(dp+组合数学)
题目链接:点击查看 题目大意:给出一个长度为 n 的 01 字符串表示 n 个灯泡的状态,1 为点亮,0 为熄灭,现在需要进行 k 轮操作,每轮操作可以选择恰好 m 个位置,将灯泡的状态置反,现在给出 ...
- 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)
3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...
- Codeforces 1408 D. Searchlights(优化DP、思维)
整理的算法模板合集: ACM模板 传送门 DP的思想,因为题目中有两个维度,数据达到了1e6,所以我们直接开二维数组显然不太恰当,而且我们的答案不好选取,我们可以使用一个技巧,开一维数组,用DP的下标 ...
- codeforces 808 E. Selling Souvenirs (dp+二分+思维)
题目链接:http://codeforces.com/contest/808/problem/E 题意:最多有100000个物品最大能放下300000的背包,每个物品都有权值和重量,为能够带的最大权值 ...
- 2021牛客多校5 - Double Strings(dp+组合数学)
题目链接:点击查看 题目大意:给出两个字符串 sss 和 ttt,要求 "一段相同的前缀" + "一个不同的字符(满足s[i]<t[j])"+ " ...
- HDU - 4248 A Famous Stone Collector(dp+组合数学)
题目链接:点击查看 题目大意:给出 n 种不同种类的石子,每种石子的个数是 a[ i ] 个,记 sum 为石子的总数,问用 k ∈ [ 1 , sum ] 个石子组成的不同排列组合有多少种 题目分 ...
最新文章
- 树——二叉搜索树的实现
- day2 字符编码、列表、元组、字符串操作、字典
- 每天一道LeetCode-----找到所有被某个字符包围的另一个字符
- hash table(完全散列实现的哈希表)
- php预处理_如何用预处理让 PHP 更先进
- GitHub上12k Star的《Java工程师成神之路》中终于开放阅读了!
- python excel案例导入jira_Python操作Jira库常用方法解析
- Siri 自动拨打 911、Google 建筛查网站、IBM 测药物成分,国际抗疫在行动!
- JavaScript实现按字典排序进行md5加密, 以及个人在小程序也可以实现
- node-sass安装失败完美解决方法
- C# 双目摄像头测试软件
- Scratch3.0(一)初识Scratch3.0
- diskpart建立新卷
- Beamer Introduction
- android 系统 迷你pc,Remix mini:一款真正运行安卓系统的电脑
- MSI(Message Signaled Interrupt)/MSI-X
- 有一种风险让期权交易员如坐针毡——谨慎管理 “大头针风险”
- 兴趣变高薪副业,知名插画师走尺带你感受插画的魅力
- 如何在WhatsApp中引用某人
- [附源码]Nodejs计算机毕业设计木棉堂水果电商平台Express(程序+LW)