首页 > 其他分享 >"蔚来杯"2022牛客暑期多校训练营9

"蔚来杯"2022牛客暑期多校训练营9

时间:2022-09-06 16:56:20浏览次数:77  
标签:cnt const int 蔚来 多校 long 牛客 ans include

A Car Show

题意:

给定一个数组,请找到有多个区间 [L,R] 满足 1 到 m 的数都出现过。

分析:直接双指针就好

#include<bits/stdc++.h>
using namespace std;
long long n,m,s[100100],v[100100],cnt,ans;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>s[i];
	
	for(int l=1,r=1;r<=n;r++)
	{
		if(v[s[r]]==0) cnt++;
		v[s[r]]++;
		while(v[s[l]]>1) v[s[l++]]--;
		if(cnt==m) ans+=l;
	}
	cout<<ans;
}

B Two Frogs

这个题思想很好 一维和二维位置互换 使得可以差分

#include <stdio.h>
const int N=8005;
int a[N],n;
const long long mod=998244353;
long long f[N],g[N],inv[N],ans;
int main()
{
	scanf("%d",&n);
	inv[1]=1;
	for (int i=2;i<=n;++i) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    for (int i=1;i<n;++i) scanf("%d",&a[i]);
	g[1]=1;
	for (int t=1,i;t<n;++t)
	{
		for (i=t;i<n;++i)
		{
			f[i+1]+=g[i]*inv[a[i]]%mod;
			f[i+a[i]+1]-=g[i]*inv[a[i]]%mod;
		}
		g[t]=0;
		for (i=t+1;i<=n;++i)
		{
			g[i]=(g[i-1]+f[i])%mod;
			f[i]=0;
		}
		ans=(ans+g[n]*g[n])%mod;
	}
	printf("%lld\n",ans);
}

E Longest Increasing Subsequence


#include<bits/stdc++.h>
using namespace std;

template<class T>inline void read(T&x){
	char c,last=' ';
	while(!isdigit(c=getchar()))last=c;
	x=c^48;
	while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+(c^48);
	if(last=='-')x=-x;
}

const int MAXN=1e2+5;
int m;
int n;
int a[MAXN];

int main()
{
	int T;read(T);
	while(T--){
		read(m);
		if(m==1){
			puts("1\n1");
			continue;
		}
		int M=0;
		while(1<<M<=m)++M;
		--M;
		vector<int>v;
		for(int i=1;i<=M;++i){
			v.push_back(2*i);
			v.push_back(2*i-1);
		}
		for(int i=M-1,cnt=0;i>=0;--i){
			if(m>>i&1){
				while(cnt<M-i)v.insert(v.begin()+2*i,0),++cnt;//先标记插入位
			}
		}
		for(int i=0,c=2*M;i<(int)v.size();++i){
			if(v[i]==0)v[i]=++c;//从前往后递增赋值
		}
		cout<<(int)v.size()<<'\n';
		for(int i=0;i<(int)v.size();++i)cout<<v[i]<<" \n"[i+1==(int)v.size()];
	}
	return 0;
}

I The Great Wall II



#include<bits/stdc++.h>
using namespace std;
const int N=8e3+5;
int f[2][N],g[N],mi[N],stk[N],n,a[N],top;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i],f[0][i]=0x3f3f3f3f;
	for(int k=1;k<=n;k++){
		int id=k&1;
		f[id][top=0]=0x3f3f3f3f;
		for(int i=k;i<=n;i++){
			mi[i]=f[id^1][i-1];
			while(top&&a[stk[top]]<=a[i]){
				mi[i]=min(mi[i],mi[stk[top]]);
				top--;
			}
			f[id][i]=min(f[id][stk[top]],mi[i]+a[i]);
			stk[++top]=i;
		}
		cout<<f[id][n]<<'\n';
	}
}

标签:cnt,const,int,蔚来,多校,long,牛客,ans,include
From: https://www.cnblogs.com/wzxbeliever/p/16662418.html

相关文章

  • Slayers Come (区间覆盖种类数(dp+线段树)+ st表+二分,或者线段树) (2022杭电多校2)
    题目;给你一个长度为n的数组,每个位置上有一个野怪,野怪的攻击力和血量已知,你有m个技能,每个技能有三个值,一是可以击败的怪物,且怪物死后会攻击与它相邻的怪对于左边的怪伤害......
  • Static Query on Tree (述链剖分+线段树)(2022杭电多校)
    题意:给定一棵树,nn 个结点。根为 11,所有的结点只能走向其父亲结点。有 qq 次询问,每次询问给出 33 个结点集合 A,B,CA,B,C。问树上有多少点满足如下条件:该点可以......
  • DOS Card (线段树)(hud杭电多校)
    题目:对序列 a,回答 q 次询问:给定长度至少为 4 的区间 [L,R],在区间内选择 1对 (ai,aj)(L≤i<j≤R)可以获取分数 (ai+aj)(ai−aj) ,计算选择 2 对可以获取的最......
  • copy (倒叙离线+bitset+^特性) (hud 2022多校 2)
    题目:给定一个序列 a1,a2,…,an,共有 q 次操作,每次操作有两种类型:操作1(1,l,r) 表示复制区间 [l,r] 的内容,在区间 [l,r]的末尾处插入这段内容。操作2(2,x) 询问......
  • "蔚来杯"2022牛客暑期多校训练营7
    CConstructiveProblemsNeverDie题意:给你一个数组A,你需要构造一个排列P,使得P[i]≠A[i]分析:考虑构造不出来的情况如果所有A[i]都相同一定不成立先构造P[i]=i......
  • 牛客dfs专题 NC13594 选择困难症(dfs+剪枝)
    链接:https://ac.nowcoder.com/acm/problem/13594来源:牛客网题目描述有k类物品,每类物品的个数为Ai,每个物品有一个喜欢值Vj,代表小L对这件物品的喜欢程度。小L想知道,有多......
  • 牛客dfs专题:轰炸区最优选取(二维前缀和)
    链接:https://ac.nowcoder.com/acm/problem/14505来源:牛客网题目描述现在给出一个正方形地图,其边长为n,地图上有的地方是空的,有的地方会有敌人。我们现在有一次轰炸敌人......
  • 牛客练习赛102
    A清楚姐姐的学术群intmain(){ intn=read(),m=read(),a=read(),b=read(); for(inti=1;i<=n;i++)people[i].push_back(0); for(inti=1;i<=......
  • 29. 牛客-一人行者
    本来不想为了这题写一篇博客的,但因为昨天被一组数据卡了一个小时,还是有必要来记录一下。牛客练习赛102D:一人行者题意是给一棵树,求断掉每一条边后得到的两棵树各自的联通......
  • "蔚来杯"2022牛客暑期多校训练营6
    A.Array给定\(\geqslant2\)的整数\(a_1,a_2,...,a_n\),满足\(\sum\limits_{i=1}^n\frac{1}{a_i}\leqslant\frac{1}{2}\),构造一个循环数列,使得其任意长度为\(a_i\)的子区......