Codeforces Round #368 (Div. 2) A,B,C,D

这场多灾多难啊。。fst了交错程序了删了stdio.h结果重装cpp什么的各种惨
A. Brain's Photos
出现C M Y中的任意一个就是彩色,否则黑白
B. Bakery
很容易得到答案肯定是一条边的长度
枚举边,找一端是仓库一端不是的,取最小值即可
C. Pythagorean Triples
可以分n奇偶直接构造
偶数:n^2-1,n^2+1
奇数:n^2/2,n^2/2+1
D. Persistent Bookcase

我们把所有操作建成树,然后直接dfs后回溯即可


A.

#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	int i,j;
	string x;
	bool flag=true;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			cin>>x;
			if(x=="C"||x=="M"||x=="Y")
				flag=false;
		}
	}
	if(flag)
		printf("#Black&White\n");
	else
		printf("#Color\n");
	return 0;
}

B.

#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct line
{
	int s,t,x;
	int next;
}a[200001];
int head[100001];
int edge;
bool v[100001];
inline void add(int s,int t,int x)
{
	a[edge].next=head[s];
	head[s]=edge;
	a[edge].s=s;
	a[edge].t=t;
	a[edge].x=x;
}
int main()
{
	int n,m,k;
	scanf("%d%d%d",&n,&m,&k);
	int i,j;
	int s,t,x;
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&s,&t,&x);
		edge++;
		add(s,t,x);
		edge++;
		add(t,s,x);
	}
	int minn=2100000000;
	for(i=1;i<=k;i++)
	{
		scanf("%d",&x);
                v[x]=true;

	}
	for(i=1;i<=edge;i++)
	{
                s=a[i].s;t=a[i].t;
                if(v[s]&&!v[t])
                	minn=min(minn,a[i].x);
          }
	if(minn!=2100000000)
		printf("%d\n",minn);
	else
		printf("-1\n");
	return 0;
}


C.

#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	long long x;
	scanf("%I64d",&x);
	if(x<=2)
		printf("-1\n");
	else if(x%(long long)2==0)
	{
		long long n=x/(long long)2;
		printf("%I64d %I64d\n",n*n-(long long)1,n*n+(long long)1);
	}
	else
	{
		long long n=x*x;
		printf("%I64d %I64d\n",n/(long long)2,n/(long long)2+1);
	}
	return 0;
}

D.

#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct line
{
	int s,t,x;
	int next;
}a[300001];
int head[200001];
int edge;
inline void add(int s,int t)
{
	a[edge].next=head[s];
	head[s]=edge;
	a[edge].s=s;
	a[edge].t=t;
}
struct ques
{
	int x,p;
	int i,j;
}ask[100001];
int n,m;
int xt[1001][1001];
int sx[1001];
int ans[100001];
bool v[100001];
inline void dfs(int d,int sum)
{
	ans[d]=sum;
	int i;
	for(i=head[d];i!=0;i=a[i].next)
	{
		int t=a[i].t;
		if(ask[t].x==1)
		{
			if(!v[ask[t].i])
			{
				if(xt[ask[t].i][ask[t].j]!=1)
				{
					sx[ask[t].i]++;
					xt[ask[t].i][ask[t].j]=1;
					dfs(t,sum+1);
					sx[ask[t].i]--;
					xt[ask[t].i][ask[t].j]=0;
				}
				else
					dfs(t,sum);
			}
			else
			{
				if(xt[ask[t].i][ask[t].j]!=0)
				{
					sx[ask[t].i]++;
					xt[ask[t].i][ask[t].j]=0;
					dfs(t,sum+1);
					sx[ask[t].i]--;
					xt[ask[t].i][ask[t].j]=1;
				}
				else
					dfs(t,sum);
			}
		}
		else if(ask[t].x==2)
		{
			if(!v[ask[t].i])
			{
				if(xt[ask[t].i][ask[t].j]!=0)
				{
					sx[ask[t].i]--;
					xt[ask[t].i][ask[t].j]=0;
					dfs(t,sum-1);
					sx[ask[t].i]++;
					xt[ask[t].i][ask[t].j]=1;
				}
				else
					dfs(t,sum);
			}
			else
			{
				if(xt[ask[t].i][ask[t].j]!=1)
				{
					sx[ask[t].i]--;
					xt[ask[t].i][ask[t].j]=1;
					dfs(t,sum-1);
					sx[ask[t].i]++;
					xt[ask[t].i][ask[t].j]=0;
				}
				else
					dfs(t,sum);
			}
		}
		else if(ask[t].x==3)
		{
			int dt=sx[ask[t].i];
			sx[ask[t].i]=m-dt;
			if(v[ask[t].i])
				v[ask[t].i]=false;
			else
				v[ask[t].i]=true;
			dfs(t,sum-dt+sx[ask[t].i]);
			sx[ask[t].i]=dt;
			if(v[ask[t].i])
				v[ask[t].i]=false;
			else
				v[ask[t].i]=true;
		}
	}
}
int main()
{
	int q;
	scanf("%d%d%d",&n,&m,&q);
	int i,j;
	for(i=1;i<=q;i++)
	{
		scanf("%d",&ask[i].x);
		if(ask[i].x==1||ask[i].x==2)
			scanf("%d%d",&ask[i].i,&ask[i].j);
		else
			scanf("%d",&ask[i].i);
		ask[i].p=i;
	}
	int la=0;
	for(i=1;i<=q;i++)
	{
		if(ask[i].x!=4)
		{
			edge++;
			add(la,i);
			la=i;
		}
		else
		{
			la=ask[i].i;
			while(ask[la].x==4) 
				la=ask[la].i;
			ask[i].i=la;
		}
	}
	memset(ans,-1,sizeof(ans));
	dfs(0,0);
	for(i=1;i<=q;i++)
		if(ans[i]==-1)
			ans[i]=ans[ask[i].i];
	for(i=1;i<=q;i++)
		printf("%d\n",ans[i]);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值