ICode9

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

4.6省选练习

2022-04-06 21:35:39  阅读:129  来源: 互联网

标签:cnt 4.6 省选 练习 long int MAXN -- define


省选时间定了,慌是不可能的,这辈子是不可能的

\(T1\)

//直接看这一位选什么就好了 
#define Eternal_Battle ZXK
#include<bits/stdc++.h>
#define int long long
#define MAXN 1000005
using namespace std;
int cnt[35][2];
int n,a[MAXN];
void sol()
{
	 int res=0;
	 for(int i=30;i>=0;i--)
	 {
	 	 if(cnt[i][1]&&cnt[i][0])
	 	 {
	 	 	puts("-1");
	 	    return ;	
		 }
         if(cnt[i][1])
         {
         	res|=(1ll<<i);
		 }
	 }
	 printf("%lld\n",res);
}
int q,x,y;
signed main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    {
    	scanf("%lld",&a[i]);
	}
	for(int i=1;i<n;i++)
	{
		for(int j=30;j>=0;j--)
		{
		    if(((a[i]^a[i+1])>>j)&1)
		    {
		    	cnt[j][a[i]>a[i+1]]++;
		        break;
			}
		}
	}
	sol();
	scanf("%lld",&q);
    while(q--)
    {
    	  scanf("%lld%lld",&x,&y);
    	  if(x<n)
    	  {
    	  	  for(int j=30;j>=0;j--)
			  {
				  if(((a[x]^a[x+1])>>j)&1ll)
				  {
				      cnt[j][a[x]>a[x+1]]--;
				      break;
				  }
			  }
		  }
		  if(x>1)
		  {
		  	  for(int j=30;j>=0;j--)
			  {
				  if(((a[x]^a[x-1])>>j)&1ll)
				  {
				      cnt[j][a[x-1]>a[x]]--;
				      break;
				  }
			  }
		  }
		  a[x]=y;
		  if(x<n)
    	  {
    	  	  for(int j=30;j>=0;j--)
			  {
				  if(((a[x]^a[x+1])>>j)&1ll)
				  {
				      cnt[j][a[x]>a[x+1]]++;
				      break;
				  }
			  }
		  }
		  if(x>1)
		  {
		  	 for(int j=30;j>=0;j--)
			  {
				  if(((a[x]^a[x-1])>>j)&1ll)
				  {
				      cnt[j][a[x-1]>a[x]]++;
				      break;
				  }
			  }
		  }
		  sol();
	}
}

\(T2\)

//比较贪心的想 
//肯定是每个时刻都是使用状态 
//那么要求的条件就是后缀的女生>男生
//假如目前女生i在poz<2*i-1,那么贪心的放过去就好了
//对于每一小段都单独统计最小后缀和,求个最大就好了 
#include<bits/stdc++.h>
#define MAXN 10000000
#define int long long
using namespace std;
int d[MAXN],b[MAXN],maxd[MAXN];
int pd,tans,ans;
string a;
signed main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>a>>b[i];
		a=' '+a;
		for(int j=a.length()-1;j>=1;j--)
		{
			if(a[j]=='F') d[i]--;
			else d[i]++;
			maxd[i]=max(maxd[i],d[i]);
		}
		pd+=d[i]*b[i];
	}
	tans=1;
	if(pd>0)
	{
		cout<<-1;
		return 0;
	}
	else
	{
		for(int i=m;i>=1;i--)
		{
			if(d[i]>0) tans=max(tans,ans+(b[i]-1)*d[i]+maxd[i]);
			else tans=max(tans,ans+maxd[i]);
			ans+=d[i]*b[i];
		}
	}
	cout<<tans-1;
	return 0;
}

\(T3\)棋盘游戏

\(JOI\)的\(DP\)有亿点点难啊

考虑第一行和第三行必然没有放格子的左右已经放好了,否则无解,那么每个点能不能放只与左右放没放完有关,或者上下放没放,那么直接记录两个\(dp1[i][j]\)表示\(i\)位置在\(j\)时刻放置的方案数,直接大力分讨,上下左右的所有状态枚举一遍转移,使用前缀和优化

#include<bits/stdc++.h>
#define mod 1000000007
#define int long long
#define MAXN 6060
using namespace std;
int n,num,tot;
int f[MAXN][MAXN][2],C[MAXN][MAXN],P[MAXN][MAXN],ans;
char s[3][MAXN];
void Init()
{
	for(int i=0;i<=n*3;i++)
	{
        C[i][0]=1;
        P[i][0]=1;
        for(int j=1;j<=i;j++)
		{
            C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
            P[i][j]=(P[i-1][j]+P[i-1][j-1]*j)%mod;
        }
    }
    return;
}
void Pre(int x)
{
    for(int i=1;i<=n*2;i++)
	{
        f[x][i][0]=(f[x][i][0]+f[x][i-1][0])%mod;
        f[x][i][1]=(f[x][i][1]+f[x][i-1][1])%mod;
    }
    return;
}
void check()
{
    for(int i=1;i<=n;i++)
	{
        if(s[0][i]=='x'&&(s[0][i-1]!='o'||s[0][i+1]!='o')){puts("0");exit(0);}
        if(s[2][i]=='x'&&(s[2][i-1]!='o'||s[2][i+1]!='o')){puts("0");exit(0);}
	}
	return;
}

void solve()
{
    for(int i=2;i<=n;i++)
	{
        int t=0;
		if(s[0][i]=='x')t++;
		if(s[2][i]=='x')t++;
        if(s[1][i]=='x')
		{
            if(s[1][i-1]=='o')
			{
                f[i][t+1][0]=P[t][t];
                if(t==2)f[i][1][1]=P[t][t],f[i][2][1]=2;
                if(t==1)f[i][1][1]=P[t][t];
                Pre(i);
                num=t+1;
                continue;
            }
            num+=(t+1);
            for(int j=1;j<=num;j++)
			{
                f[i][j][0]=((f[i][j][0]+f[i-1][num][0]*P[j-1][t])%mod+mod)%mod;
                f[i][j][0]=((f[i][j][0]+(f[i-1][num][1]-f[i-1][max(0ll,j-t-1)][1])*P[j-1][t])%mod+mod)%mod;
				for(int k=1;k<=t;k++)f[i][j+k][1]=((f[i][j+k][1]+P[t][t]*C[j+k-1][k-1]%mod*C[max(0ll,num-j-k)][t+1-k]%mod*f[i-1][j][0]%mod)%mod+mod)%mod;
            }
            Pre(i);
        }
		else
		{
            if(s[1][i-1]=='x')
			{
                ans=ans*(f[i-1][num][1]+f[i-1][num][0])%mod;
                tot+=num;
				ans=ans*C[tot][tot-num]%mod;
            }
			tot+=t;
            ans=ans*P[t][t]%mod*C[tot][t]%mod;
        }
    }
}
signed main()
{
    scanf("%lld",&n);
    for(int i=0;i<=2;i++)scanf("%s",s[i]+1);
    Init();
    check();
	ans=1;
	if(s[1][1]=='x')
	{
        f[1][1][0]=1;
        num=1;
        Pre(1);
    }
    solve();
    if(s[1][n]=='x')
	{
        ans=ans*f[n][num][0]%mod;
		tot+=num;
        ans=ans*C[tot][num]%mod;
    }
    printf("%lld\n",ans);
}

标签:cnt,4.6,省选,练习,long,int,MAXN,--,define
来源: https://www.cnblogs.com/Eternal-Battle/p/16109623.html

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

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

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

ICode9版权所有