Codeforces Round #531 (Div. 3) E. Monotonic Renumeration(思维+差分数组)

 

题目链接:http://codeforces.com/contest/1102/problem/E

       题意是给了n个数的a数组,要构造b数组,b数组需要满足以下三个要求,b[1] = 0,如果a[i] = a[j],那么b[i] = b[j](a中相等的数,在b中对应的位置的数也相等),b[i] = b[i+1]或者b[i] + 1 = b[i+1],求出可以构造出多少种b数组。

       首先我们要知道假如a[1] = 15,a[20] = 15,因为b[1] = 0,所以b[20] = 0,又因为b数组是一个递增的数列,所以在b数组中从1到20就一定都是0,所以我们就只需要去找区间,因为b[i+1]要么等于b[i]要么等于b[i]+1,所以如果我们找到了一个区间的左端点与之前的所有区间都没有交集,那么此时的方案数是乘以2的,所以这道题就是找有多少个独立的区间,每一个独立的区间的方案数就是2。我的方法是用差分数组来实现区间覆盖,对于每一个数用map来做标记。


AC代码:

#include <bits/stdc++.h>
#define maxn 200005
#define ll long long
const int mod = 998244353;
using namespace std;
int n;
ll pre[maxn];

int main()
{
	map<ll,int> ma;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		ll xx;
		scanf("%lld",&xx);
		if(ma[xx] == 0) ma[xx] = i;
		else pre[ma[xx] + 1] ++, pre[i + 1] --;
	}
	ll ans = 1;
	for(int i=2;i<=n;i++){
		pre[i] += pre[i-1];
		if(pre[i] == 0) ans = (ans * 2 + mod) % mod;
	}
	printf("%lld\n", ans);
	return 0;
}

 

全部评论

相关推荐

在笔试的大西瓜很矫健:校招数分不用想了,这经历和学历都不够用,大厂更别想,初筛都过不了,说点不好听的小厂数分都进不去(小厂也是假数分),要两个对口实习+3个项目(或者3+2),而且要有含金量才能补一点你的学历劣势。 建议刷实习,社招找数分,校招看运气,能入行业就行,可以运营转数分
点赞 评论 收藏
分享
02-25 16:55
已编辑
北京工业大学 Java
211本,找日常实习的话,如果面向中厂的话,需要刷hot100么?因为之前从来没刷过,算法仅限于学校课程水平,准备3月投递简历,现在还需要背八股文,时间有些紧张,还需要刷算法题么?同时什么样的公司可以算是中厂呢?
程序员小白条:中大厂说的上名字的,必定要算法,hot100只是最基础的了,题库远不止100题捏,一般在300-400题量之间,算法=学校课程=简单题也做不出,多准备八股文和算法吧,其他项目可以放放,精刷算法就行了,花时间成长很快的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务