这场多灾多难啊。。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
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;
}