P8649 [蓝桥杯 2017 省 B] k 倍区间
思路:前缀和的题,对k取余相同的数就可以得到k的倍数
cpp
#include <iostream>
#include <string>
using namespace std;
long long ans;
int n,k;
long long q[100010];
long long sum[100010];
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>sum[i];
sum[i]+=sum[i-1];
}
for(int i=0;i<=n;i++)
{
ans+=q[sum[i]%k]++;
}
cout<<ans;
return 0;
}
P8654 [蓝桥杯 2017 国 C] 合根植物
思路:并查集的题目,找祖先,并集
cpp
#include <iostream>
using namespace std;
int m,n,k;
int a,b;
int f[1000010];
int q[1000010];
int ans;
int find(int x)
{
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
void unity(int x,int y)
{
f[find(x)]=find(y);
}
int main()
{
cin>>m>>n>>k;
for(int i=1;i<=m*n;i++) f[i]=i;
for(int i=1;i<=k;i++)
{
cin>>a>>b;
unity(a,b);
}
for(int i=1;i<=m*n;i++)
{
if(!q[find(i)]) ans++,q[find(i)]++;
}
cout<<ans<<endl;
return 0;
}