牛客挑战赛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