T3

取第一位数字为q,最后一位数字为p,因为(a,b)与(b,a)是两组,所有ans+=f[q][p]ans+=f[q][p]

#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;
}