• Codeforces Round #607 (Div. 1)


    A. Cut and Paste

    题解

    在计算答案的时候,我们发现只需要知道这个字符串前(l) 个具体是啥就行了。所以对于每一组询问,我们暴力把这个字符串前(l) 的位都算出来,然后剩下的就推就行了。
    (我之前是对于每一次复制前都会暴力复制一份复制内容,但是发现会被全是1的情况卡爆,因为如果是1的话就不用复制)

    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<queue>
    #include<string>
    using namespace std;
    #define mem(a,b) memset(a,b,sizeof(a))
    typedef long long LL;
    typedef pair<int,int> PII;
    inline int read()
    {
    	int x=0,f=1;char c=getchar();
    	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    	return x*f;
    }
    const int MOD=1000000007;
    int T,x;
    char s[3000010],tmp[3000010];
    int main()
    {
    	T=read();
    	while(T--)
    	{
    		x=read();
    		scanf("%s",s);
    		int len=strlen(s);
    		int i=1;
    		while(len<=x && i<=x)
    		{
    			int tmp=len;
    			for(int j=1;j<s[i-1]-'0';j++)
    				for(int k=i;k<tmp;k++)s[len++]=s[k];
    			i++;
    		}
    		if(i==x+1){printf("%d
    ",len%MOD);continue;}
    		int ans=len;
    		while(i<=x)ans=(ans+((ans-i)*(s[i-1]-'0'-1)%MOD+MOD)%MOD)%MOD,i++;
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    

    B. Beingawesomeism

    题解

    无聊至极的分类讨论题,代码写的特别丑

    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<queue>
    using namespace std;
    #define mem(a,b) memset(a,b,sizeof(a))
    typedef long long LL;
    typedef pair<int,int> PII;
    inline int read()
    {
    	int x=0,f=1;char c=getchar();
    	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    	return x*f;
    }
    int T;
    int n,m;
    char pic[100][100];
    bool check1()
    {
    	bool ok1=0;
    	for(int i=0;i<n;i++)if(pic[i][0]=='P')ok1=1;
    	if(!ok1)return 1;
    	bool ok2=0;
    	for(int i=0;i<n;i++)if(pic[i][m-1]=='P')ok2=1;
    	if(!ok2)return 1;
    	bool ok3=0;
    	for(int i=0;i<m;i++)if(pic[0][i]=='P')ok3=1;//printf("ok:%d
    ",ok1);
    	if(!ok3)return 1;
    	bool ok4=0;
    	for(int i=0;i<m;i++)if(pic[n-1][i]=='P')ok4=1;//	printf("ok:%d
    ",ok1);
    	if(!ok4)return 1;
    	return 0; 
    }
    bool check2()
    {
    	if(pic[0][0]=='A')return 1;
    	if(pic[0][m-1]=='A')return 1;
    	if(pic[n-1][0]=='A')return 1;
    	if(pic[n-1][m-1]=='A')return 1;
    	for(int i=1;i<n-1;i++)
    	{
    		bool ok=0;
    		for(int j=0;j<m;j++)
    			if(pic[i][j]=='P')ok=1;
    		if(!ok)return 1;
    	}
    	for(int i=1;i<m-1;i++)
    	{	
    		bool ok=0;
    		for(int j=0;j<n;j++)
    			if(pic[j][i]=='P')ok=1;
    		if(!ok)return 1;
    	}
    
    	return 0;
    }
    bool check3()
    {
    	bool ok1=0;
    	for(int i=1;i<m-1;i++)if(pic[0][i]=='A')ok1=1;
    	if(ok1)return 1;
    	bool ok2=0;
    	for(int i=1;i<m-1;i++)if(pic[n-1][i]=='A')ok2=1;
    	if(ok2)return 1;
    	bool ok3=0;
    	for(int i=1;i<n-1;i++)if(pic[i][0]=='A')ok3=1;
    	if(ok3)return 1;
    	bool ok4=0;
    	for(int i=1;i<n-1;i++)if(pic[i][m-1]=='A')ok4=1;
    	if(ok4)return 1;
    	return 0; 
    }
    int main()
    {
    	T=read();
    	while(T--)
    	{
    		n=read();m=read();
    		for(int i=0;i<n;i++)scanf("%s",pic[i]);
    		bool flag=0,flag2=0;
    		for(int i=0;i<n;i++)
    			for(int j=0;j<m;j++)
    			{
    				if(pic[i][j]=='A')flag=1;
    				if(pic[i][j]=='P')flag2=1;
    			}
    		if(!flag)printf("MORTAL
    ");
    		else if(!flag2)printf("0
    ");
    		else if(check1())printf("1
    ");
    		else if(check2())printf("2
    ");
    		else if(check3())printf("3
    "); 
    		else printf("4
    ");
    	}
    	return 0;
    }
    

    C. Jeremy Bearimy

    题解

    这种点对的题,之前做过类似的,就是依次考虑每一条边。
    先说最小值,考虑一条边是否被选中的话只需要看一下这个儿子的大小,如果这个儿子的size是偶数的话,那么在下面就已经能完成匹配,没有必要连上来了,否则这条边就会被用上。
    再说最大值,对于这条边肯定是被多个点对覆盖的,我们要算这条边对于最终答案贡献了几次,那么就是$min lbrace size[v],n-size[v] brace $
    代码是队友写的,极为短小精悍。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define ll long long
    using namespace std;
    int read()
    {
    	int k=0,f=1;char c=getchar();
    	for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    	for(;isdigit(c);c=getchar()) k=k*10+c-'0';return k*f;
    }
    const int N=400055;
    int T,n,m,tot,to[N],nextt[N],head[N],w[N],size[N];
    ll ans1,ans2;
    void add(int a,int b,int c)
    {
    	to[++tot]=b;
    	nextt[tot]=head[a];
    	head[a]=tot;
    	w[tot]=c;
    }
    void dfs1(int u,int f)
    {
    	size[u]=1;
    	for(int i=head[u];i;i=nextt[i])
    		if(to[i]!=f)
    		{
    			dfs1(to[i],u);size[u]+=size[to[i]];
    			if(size[to[i]]&1) ans1+=w[i];	
    			ans2+=1ll*min(size[to[i]],n-size[to[i]])*w[i];
    		}
    }
    int main()
    {	
    	T=read();
    	while(T--)
    	{
    		int a,b,c;
    		ans1=ans2=tot=0;
    		n=read()*2;
    		for(int i=1;i<n;i++)
    		{
    			a=read();b=read();c=read();
    			add(a,b,c);add(b,a,c);
    		}
    		dfs1(1,0);
    		printf("%lld %lld
    ",ans1,ans2);
    		for(int i=1;i<=n;i++)
    			head[i]=0;
    	}
    	return 0;
    }
    
  • 相关阅读:
    rancher2.x添加node的坑。
    k8s相关端口表-以及周边工具
    基于Helm和Operator的K8S应用管理的分享
    iptables -F 与 -X 区别
    ansible批量免秘登录
    keepalived工作原理和配置说明
    k8s使用nfs动态存储(已测试成功)
    ansible-playbook快速入门填坑
    Service Account和其secrets 作用和场景,看了不亏。。
    kubectl管理多个k8s集群
  • 原文地址:https://www.cnblogs.com/FYH-SSGSS/p/12075056.html
Copyright © 2020-2023  润新知