这是半年之后第一次来打CF了,打完之后的结果就是——发现自己半年根本没有任何的进步,还是一如既往的粗心。
不禁想起了NOIP2016 D1T1爆零的故事。
【NOIP2016】
考场上看到T1十分水,然后敲敲敲,拿第一个样例测了一下,明明答案不对,还是以为自己对了(盲人OI,Best OI)。然后第二个样例真的莫名其妙的过了●▽●。(艹)
然后就爆零了。
言归正传,这次的CF是比较水的。
A.第一题快速幂搞一搞|找规律膜一膜。
B.弄一个桶排序,然后对于每一个数,ai^x=tmp。然后看看tmp有多少个就好了。但是要注意两点:
1.数组要开的大一些,或者加个判断,因为10^5之内的两个数异或是有可能大于10^5的。
2.注意x等于0的时候,应该特殊判断(题目中明确要求两个数下标不同)。
C.只需要找出所有环,如果有的点不在环上,输出-1。剩下的环,如果是偶数,除以2然后取一个lcm就好了。
D.背包问题,数组开小pp了,终测GG。
E.类似一个二分图的构造,可以得到一个结论,无论如何是有解的(懵),然后我们只有、需要在2 * i-1和2 * i 之间连边,然后染色即可。
又浪了一场,丢人了。不过好在还是上分了,rating 到1600了。
【代码】
A
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 20005
#define mlog 16
#define inf (0x3f3f3f3f)
int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int n,a=8;
int main()
{
n=read();
int ans=1;
while (n)
{
if (n&1) (ans*=a)%=10;
(a*=a)%=10;
n>>=1;
}
printf("%d\n",ans);
}
B
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 100005
#define mlog 16
#define inf (0x3f3f3f3f)
int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int x,a[maxn],n,b[maxn];
long long ans=0;
int main()
{
n=read(); x=read();
for (int i=1;i<=n;++i) a[i]=read(),b[a[i]]++;
for (int i=1;i<=n;++i)
{
int tmp=a[i]^x;
if (tmp>100000) continue;
ans+=b[tmp];
if (tmp==a[i]) ans--;
}
cout<<ans/2<<endl;
}
C
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 105
#define mlog 16
#define inf (0x3f3f3f3f)
int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int n,a[maxn],bel[maxn],dfn[maxn],idx=0,low[maxn],sta[maxn],top=0,ins[maxn];
int siz[maxn],vcnt=0;
void tarjan(int k)
{
// printf("tarjan %d\n",k);
sta[++top]=k;
ins[k]=1;
dfn[k]=low[k]=++idx;
if (!dfn[a[k]])
{
tarjan(a[k]);
low[k]=min(low[k],low[a[k]]);
}
else if (ins[a[k]]) low[k]=min(low[k],dfn[a[k]]);
if (low[k]==dfn[k])
{
vcnt++;
int x=-1,cnt=0;
while (x!=k)
{
x=sta[top--];
bel[x]=vcnt;
ins[x]=0;
cnt++;
}
siz[vcnt]=cnt;
// printf("%d is %d\n",vcnt,cnt);
}
}
long long gcd(long long a,long long b)
{
return b==0?a:gcd(b,a%b);
}
long long lcm(long long a,long long b)
{
return a/gcd(a,b)*b;
}
int main()
{
n=read();
for (int i=1;i<=n;++i) a[i]=read();
for (int i=1;i<=n;++i)
if (!dfn[i])
tarjan(i);
// for (int i=1;i<=n;++i) printf("%d ",siz[bel[i]]); printf("\n");
long long out=1;
for (int i=1;i<=n;++i)
{
if (siz[bel[i]]==1&&a[i]!=i)
{
printf("-1\n");
return 0;
}
else
{
if (siz[bel[i]]%2)
{
out=lcm(out,(long long)siz[bel[i]]);
}
else out=lcm(out,(long long)siz[bel[i]]/2);
}
}
cout<<out<<endl;
}
D
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 1005
#define maxm 100005
#define mlog 16
#define inf (0x3f3f3f3f)
int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int n,m,w;
int v[maxn],b[maxn];
int l[maxm],r[maxm];
int f[maxn];
vector <int> son[maxn];
int find(int k)
{
if (f[k]==k) return k;
else return f[k]=find(f[k]);
}
vector <int> tag;
int dp[maxn][maxn];
int main()
{
n=read();for (int i=1;i<=n;++i) f[i]=i;
m=read();
w=read();
// printf("w is %d\n",w);
for (int i=1;i<=n;++i) v[i]=read();
for (int i=1;i<=n;++i) b[i]=read();
for (int i=1;i<=m;++i) l[i]=read(),r[i]=read();
for (int i=1;i<=m;++i)
{
// printf("connect %d and %d\n",l[i],r[i]);
int fl=find(l[i]),fr=find(r[i]);
f[fl]=fr;
}
// for (int i=1;i<=n;++i) printf("%d ",f[i]); printf("\n");
for (int i=1;i<=n;++i) if (f[i]!=i) son[find(i)].push_back(i);
for (int i=1;i<=n;++i) if (f[i]==i) tag.push_back(i);
memset(dp,-0x3f,sizeof dp);
dp[0][0]=0;
for (int i=0;i<tag.size();++i)
{
for (int j=0;j<=w;++j) dp[i+1][j]=max(dp[i+1][j],dp[i][j]);
// printf("now state is %d\n",i+1);
int now=tag[i],noww=v[now],nowb=b[now];
// printf("add %d %d\n",noww,nowb);
for (int j=noww;j<=w;++j)
dp[i+1][j]=max(dp[i+1][j],dp[i][j-noww]+nowb);
for (int j=0;j<son[now].size();++j) noww+=v[son[now][j]],nowb+=b[son[now][j]];
// printf("add %d %d\n",noww,nowb);
for (int j=noww;j<=w;++j)
{
dp[i+1][j]=max(dp[i+1][j],dp[i][j-noww]+nowb);
// printf("j is %d %d %d %d\n",j,dp[i][j-noww],nowb,dp[i+1][j]);
}
for (int j=0;j<son[now].size();++j)
{
for (int k=v[son[now][j]];k<=w;++k)
dp[i+1][k]=max(dp[i+1][k],dp[i][k-v[son[now][j]]]+b[son[now][j]]);
// printf("add %d %d\n",v[son[now][j]],b[son[now][j]]);
}
// for (int j=0;j<=w;++j) printf("%d ",dp[i+1][j]);
}
// for (int i=0;i<=tag.size();++i)
// {
// for (int j=0;j<=w;++j)
// printf("%d ",dp[i][j]);
// printf("\n");
// }
int ans=-0x3f3f3f3f;
for (int i=0;i<=w;++i) ans=max(ans,dp[tag.size()][i]);
printf("%d\n",ans);
}
E
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 200005
#define inf (0x3f3f3f3f)
int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int out[maxn],a[maxn];
int list[maxn][2],n;
vector <int> v[maxn];
void dfs(int k,int col)
{
// printf("%d is %d\n",k,col);
out[k]=col;
for (int i=0;i<v[k].size();++i)
if (!out[v[k][i]])
dfs(v[k][i],3-col);
}
int main()
{
n=read();
for (int i=1;i<=n;++i)
{
list[i][0]=read();
list[i][1]=read();
v[list[i][0]].push_back(list[i][1]);
v[list[i][1]].push_back(list[i][0]);
v[i*2-1].push_back(i*2);
v[i*2].push_back(i*2-1);
}
for (int i=1;i<=2*n;++i)
if (!out[i]) dfs(i,1);
for (int i=1;i<=n;++i)
printf("%d %d\n",out[list[i][0]],out[list[i][1]]);
}