其他分享
首页 > 其他分享> > 牛客挑战赛61

牛客挑战赛61

作者:互联网

运算:

链接: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