• CF7


    A

    A

    先查有几行,然后把一行全部消掉

    然后查剩下哪些地方还有,把一列消掉

    #include<bits/stdc++.h>
    using namespace std;
    namespace red{
    	inline int read()
    	{
    		int x=0;char ch,f=1;
    		for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
    		if(ch=='-') f=0,ch=getchar();
    		while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    		return f?x:-x;
    	}
    	char s[9][9];
    	int sum;
    	inline void main()
    	{
    		for(int i=1;i<=8;++i) scanf("%s",s[i]+1);
    		for(int i=1;i<=8;++i)
    		{
    			if(s[i][1]=='B')
    			{
    				bool flag=0;
    				for(int j=1;j<=8;++j)
    				{
    					flag|=(s[i][j]=='W');
    				}
    				if(!flag)
    				{
    					++sum;
    					for(int j=1;j<=8;++j)
    					{
    						s[i][j]='W';
    					}
    				}
    			}
    		}
    		for(int i=1;i<=8;++i)
    		{
    			for(int j=1;j<=8;++j)
    			{
    				if(s[i][j]=='B')
    				{
    					++sum;
    					for(int k=i;k<=8;++k)
    					{
    						s[k][j]='W';
    					}
    				}
    			}
    		}
    		cout<<sum<<endl;
    	}
    }
    signed main()
    {
    	red::main();
    	return 0;
    }
    

    B

    B

    直接模拟

    #include<bits/stdc++.h>
    using namespace std;
    namespace red{
    	inline int read()
    	{
    		int x=0;char ch,f=1;
    		for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
    		if(ch=='-') f=0,ch=getchar();
    		while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    		return f?x:-x;
    	}
    	const int N=1e5+10;
    	int n,m,id;
    	int a[N],b[N];
    	int l[N],r[N];
    	char s[N];
    	inline void alloc(int x)
    	{
    		int pre=1;
    		for(int i=1;i<=m;++i)
    		{
    			if(b[i]) pre=i+1;
    			else
    			{
    				if(i-pre+1>=x)
    				{
    					++id;
    					for(int j=pre;j<=i;++j) b[j]=id;
    					l[id]=pre,r[id]=i;
    					printf("%d
    ",id); 
    					return;
    				}
    			}
    		}
    		puts("NULL");
    	}
    	inline void erase(int x)
    	{
    		if(x<=0||x>id)
    		{
    			puts("ILLEGAL_ERASE_ARGUMENT");
    			return;
    		}
    		bool flag=0;
    		for(int i=1;i<=m;++i)
    		{
    			if(b[i]==x)
    			{
    				flag=1;
    				b[i]=0;
    			}
    		}
    		if(!flag) puts("ILLEGAL_ERASE_ARGUMENT");
    	}
    	inline void get_col(int x,int y,int col)
    	{
    		for(int i=x;i<=y;++i) b[i]=col;
    		if(col) l[col]=x,r[col]=y;
    	}
    	inline void defragment()
    	{
    		int pre=1;
    		for(int i=1;i<=m;++i)
    		{
    			if(b[i])
    			{
    				if(pre==l[b[i]])
    				{
    					pre=r[b[i]]+1;
    					i=r[b[i]];
    				}
    				else
    				{
    					int col=b[i],len=r[col]-l[col];
    					get_col(l[col],r[col],0);
    					get_col(pre,pre+len,col);
    					i=r[col];
    					pre=r[col]+1;
    				}
    			}
    		}
    	}
    	inline void main()
    	{
    		n=read(),m=read();
    		for(int i=1;i<=n;++i)
    		{
    			scanf("%s",s);
    			if(s[0]=='a') alloc(read());
    			if(s[0]=='e') erase(read());
    			if(s[0]=='d') defragment();
    		}
    	}
    }
    signed main()
    {
    	red::main();
    	return 0;
    }
    

    C

    C

    (exgcd)……

    #include<bits/stdc++.h>
    using namespace std;
    namespace red{
    #define int long long 
    	inline int read()
    	{
    		int x=0;char ch,f=1;
    		for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
    		if(ch=='-') f=0,ch=getchar();
    		while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    		return f?x:-x;
    	}
    	int a,b,c;
    	int x,y,g;
    	inline void exgcd(int &x,int &y,int &g,int a,int b)
    	{
    		if(!b)
    		{
    			x=1,y=0,g=a;
    			return;
    		}
    		exgcd(y,x,g,b,a%b);
    		y-=a/b*x;
    	}
    	inline void main()
    	{
    		a=read(),b=read(),c=read();
    		exgcd(x,y,g,a,b);
    		if(-c%g)
    		{
    			puts("-1");
    			return;
    		}
    		x*=-c/g,y*=-c/g;
    		cout<<x<<' '<<y<<endl;
    	}
    }
    signed main()
    {
    	red::main();
    	return 0;
    }
    

    D

    D

    先跑个马拉车,然后求出哪些位置回文串是从开头开始的

    然后(f[i]=f[(1+i)>>1]+1)(ans=sumlimits_{i=1}^{n}f[i])

    #include<bits/stdc++.h>
    using namespace std;
    namespace red{
    	const int N=5e6+10; 
    	int n=1,mid,r,ret;
    	char s[N<<1],t[N<<1];
    	int p[N<<1],f[N<<1];
    	inline void read()
    	{
    		scanf("%s",t+1);
    		s[0]='~';s[1]='#';
    		int len=strlen(t+1);
    		for(int i=1;i<=len;++i)
    		{
    			s[++n]=t[i];
    			s[++n]='#';
    		}
    	}
    	inline void main()
    	{
    		read();
    		for(int i=1;i<=(n>>1)+1;++i)
    		{
    			if(i<r) p[i]=min(r-i,p[(mid<<1)-i]);
    			else p[i]=1;
    			while(s[i-p[i]]==s[i+p[i]]) ++p[i];
    			if(i+p[i]>r) r=i+p[i],mid=i;
    		}
    		for(int i=2;i<=(n>>1)+1;++i)
    		{
    			if(p[i]==i) f[i]=f[(1+i)>>1]+1;
    			ret+=f[i];
    		}
    		printf("%d
    ",ret);
    	}
    }
    signed main()
    {
    	red::main();
    	return 0;
    }
    

    E

    E

    黑色模拟题,快滚吧

    一场(cf)五道题三道模拟¿

  • 相关阅读:
    codeblocks基本调试方法—gdb—Debugger
    五大开源Web服务器
    【u237】分数化小数
    【u230】回文词
    【t099】最接近神的人
    【t052】冰岛
    【t069】奇怪的迷宫
    【p092】分数线划定
    【u243】拓扑排序
    【u247】生物进化
  • 原文地址:https://www.cnblogs.com/knife-rose/p/12252873.html
Copyright © 2020-2023  润新知