- 李红强 的博客
7月DAY2
- @ 2025-7-16 16:41:20
-
T4
- 前缀和+哈希表,遍历右端点寻找左端点,
#include<bits/stdc++.h>
using namespace std;
unordered_map<long long,int> mp;
long long n,k;
int a[200003];
long long b[200003];
int main(){
freopen("tjqj.in","r",stdin);
freopen("tjqj.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=b[i-1]+a[i];
}
mp[0]=1;
long long ans=0;
for(int i=1;i<=n;i++){
if(mp[b[i]-k]) ans+=mp[b[i]-k];
mp[b[i]]++;
}
cout<<ans;
return 0;
}
对于每一个城市进行DFS,标记能到达的所有城市,再累加答案
#include<bits/stdc++.h>
using namespace std;
vector<int> v[2002];
bool vis[2002];
int n,m;
void dfs(int x){
if(vis[x]) return ;
vis[x]=1;
for(auto a : v[x]) dfs(a);
}
int main(){
freopen("lx.in","r",stdin);
freopen("lx.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
v[x].push_back(y);
}
long long ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) vis[j]=0;
dfs(i);
for(int k=1;k<=n;k++){
if(vis[k]) ans++;
}
}
cout<<ans;
return 0;
}
-
T6
-
:从前i个数中选j个数,和对j求余为k
-
第一层循环: k [1,n] 最多取k个数
-
第二层循环: i [1,n] 在前i个数中
-
第三层循环: j (0-k] 实际取j个数
-
第四次循环: l [0-k) 余数
-
不选:
f[i+1][j][l]=(f[i+1][j][l]+f[i][j][l])%mod选:
f[i+1][j+1][(l+a[i])%k]=(f[i+1][j+1][(l+a[i])%k]+f[i][j][l])%mod
#include<bits/stdc++.h>
using namespace std;
int a[102];
int f[102][102][102];
int mod=998244353;
int n;
int main(){
freopen("hate.in","r",stdin);
freopen("hate.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
for(int k=1;k<=n;k++){
memset(f,0,sizeof f);
f[1][0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=k;j++){
for(int l=0;l<k;l++){
f[i+1][j][l]=(f[i+1][j][l]+f[i][j][l])%mod;
if(j<k){
f[i+1][j+1][(l+a[i])%k]=(f[i+1][j+1][(l+a[i])%k]+f[i][j][l])%mod;
}
}
}
}
ans+=f[n+1][k][0];
ans%=mod;
}
cout<<ans;
return 0;
}