ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

牛客挑战赛61

2022-07-11 18:02:22  阅读:192  来源: 互联网

标签:61 int ll rd 牛客 base maxn 挑战赛 marx


运算:

链接:https://ac.nowcoder.com/acm/contest/11201/A

分析:
就是一个简单的线性模拟 唯一注意的就是分母不能为0 也就是说如果该位置填 除号 要特判现在的数是否为0

code:

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=5e5+5;
ll dp[maxn][6];
ll a[maxn];
ll query(int,ll,ll);
int n;
int main(){
	scanf("%d",&n);
	for(int i=0;i<=n;i++)
	scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++){
		for(int j=0;j<6;j++)
		if(a[i]==0&&j==2)continue;
		else
		for(int z=0;z<6;z++)
			dp[i][j]=max(dp[i][j],query(j,dp[i-1][z],a[i]));
	}
	ll maxx=-1e17;
	for(int i=0;i<6;i++)
	maxx=max(maxx,dp[n][i]);
	cout<<maxx<<endl;
     return 0;
}
ll query(int id,ll aa,ll bb){
	if(id==0)return (aa+bb);
	else if(id==1)return (aa-bb);
	else if(id==2)return (aa/bb);
	if(bb<0)bb=-bb;
	if(id==3)return (aa&bb);
	else if(id==4)return (aa|bb);
	else if(id==5)return (aa^bb);
    return 0;
}

经典问题:
大意:区间查找mex值
链接:https://ac.nowcoder.com/acm/contest/11201/B

分析:
因为条件为排列 mex表示区间最小没出现的数 没出现的数即为前缀和后缀

所以维护一下前缀最小和后缀最小 两者取min即可

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=1e7+5;
ll ans;
int a[maxn],pre[maxn],edd[maxn],n,m;
unsigned int rd;
inline int rnd(int mod,int seed)
{
    rd^=(1<<13);
    rd^=(rd>>7);
    rd^=(rd<<20);
    rd^=(rd>>3);
    rd^=(rd<<10);
    rd^=(rd<<5);
    rd^=(1<<2);
    return rd%mod+seed;
}
// 生成序列 a
void make_sequence()
{
    for(int i=1;i<=n;i++)
    {
        a[i]=i-1;
    }
    for(int i=1;i<=n;i++)
    {
        swap(a[i],a[rnd(n,1)]);
    }
}
// 生成一个询问,表示查询区间 [l,r] 的 mex 
void make_query()
{
    int l=rnd(n,1);
    int r=rnd(n+1-l,l);
    int res=min(pre[l-1],edd[r+1]);
    ans^=res;
}
int main(){
	cin>>n>>m;
	make_sequence();
	pre[0]=n;
	for(int i=1;i<=n;i++)
	pre[i]=min(pre[i-1],a[i]);
	edd[n+1]=n;
	for(int i=n;i>=1;i--)
	edd[i]=min(edd[i+1],a[i]);
	for(int i=1;i<=m;i++)make_query();
	cout<<ans<<endl;
     return 0;
}

维护序列:
链接:https://ac.nowcoder.com/acm/contest/11201/C

发现这个变化就是斐波那契数列 但是项数很大 直接算是会超范围的 考虑矩阵加速

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=1e5+5;
const int mod=1e9+7;
int n,m;
ll a[maxn],b[maxn],c[maxn],ansa[maxn],ansb[maxn];
struct node{
	ll marx[3][3];
}base,tt; 
node mul(node aa,node bb){
	node res;
	memset(res.marx,0,sizeof(res.marx));
	for(int i=1;i<=2;i++)
	for(int j=1;j<=2;j++)
	for(int k=1;k<=2;k++)
	res.marx[i][j]=(res.marx[i][j]+(aa.marx[i][k]*bb.marx[k][j])%mod)%mod;
	return res;
}
ll fast_mi(int k){
	node t=tt,Base=base;
	while(k){
		if(k&1)t=mul(t,Base);
		Base=mul(Base,Base);
		k>>=1;
	}
	return t.marx[1][1];
}
int main(){
	memset(base.marx,0,sizeof(base.marx));
	memset(tt.marx,0,sizeof(tt.marx));
	base.marx[1][1]=base.marx[1][2]=base.marx[2][1]=1;
	tt.marx[1][1]=tt.marx[2][2]=1;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++)
	scanf("%lld",&b[i]);
	while(m--){
		int l,r,k;
		scanf("%d%d%d",&l,&r,&k);
		c[l]+=k;
		c[r+1]-=k;
	} 
	ll now=0;
	for(int i=1;i<=n;i++){
		now+=c[i];
		ll pp=fast_mi(now-2),p=fast_mi(now-1),ppp=fast_mi(now);
		if(now==0)
			ansa[i]=a[i],ansb[i]=b[i];
		else if(now==1)
		    ansa[i]=(b[i]+a[i])%mod,ansb[i]=a[i];
		else ansa[i]=(a[i]*ppp%mod+b[i]*p%mod)%mod,ansb[i]=(a[i]*p%mod+b[i]*pp%mod)%mod;
	}
	for(int i=1;i<=n;i++)
	cout<<ansa[i]<<" ";
	cout<<endl;
	for(int i=1;i<=n;i++)
	cout<<ansb[i]<<" ";
	cout<<endl;
     return 0;
}

标签:61,int,ll,rd,牛客,base,maxn,挑战赛,marx
来源: https://www.cnblogs.com/wzxbeliever/p/16467330.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有