- 李红强 的博客
Day3
- @ 2025-7-18 11:47:39
T3
取第一位数字为q,最后一位数字为p,因为(a,b)与(b,a)是两组,所有
#include<bits/stdc++.h>
using namespace std;
int n;
long long ans;
int f[11][11];
int main(){
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
int q=i%10,p=i;
while(p>=10) p/=10;
if(q==p) ans++;
ans+=f[q][p]*2;
f[p][q]++;
}
cout<<ans;
return 0;
}
T4
二分+二维前缀和
#include<bits/stdc++.h>
using namespace std;
long long n,k;
long long a[804][804];
long long s[802][802];
bool check(long long x){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
s[i][j]=(a[i][j]>x ? 1:0);
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
}
}
for(int i=k;i<=n;i++){
for(int j=k;j<=n;j++){
if(s[i][j]-s[i-k][j]-s[i][j-k]+s[i-k][j-k]<=k*k/2) return 1;
}
}
return 0;
}
int main(){
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
int l=0,r=1e9;
while(l<r){
long long mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<l;
return 0;
}
T6
用并查集去处理数据,如果点数与边数相等结果乘2,不等结果为0
#include<bits/stdc++.h>
using namespace std;
int n,k;
int mod=998244353;
int f[200003],s[200003],m[200002];
int ans=1;
int find(int x){
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
void uni(int x,int y){
int a=find(x),b=find(y);
if(a!=b){
f[b]=a;
s[a]+=s[b];
m[a]+=m[b]+1;
}
else{
m[a]++;
}
return ;
}
int main(){
freopen("one.in","r",stdin);
freopen("one.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++) {
f[i]=i;
s[i]=1;
m[i]=0;
}
for(int i=1;i<=k;i++){
int x,y;
cin>>x>>y;
uni(x,y);
}
for(int i=1;i<=n;i++){
if(f[i]==i){
if(s[i]==m[i]) ans=ans*2%mod;
else ans=0;
}
}
cout<<ans;
return 0;
}