- 王晨逸 的博客
7.16
- @ 2025-7-16 19:07:08
D. 统计区间
#include<bits/stdc++.h>
using namespace std;
long long a[200001],sum[200001],num=0,n,k;
map<long long,long long>s;
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];
sum[i]=sum[i-1]+a[i];
}
s[0]++;
for(int i=1;i<=n;i++){
if(s[sum[i]-k]>0){
num+=s[sum[i]-k];
}
s[sum[i]]++;
}
cout<<num;
return 0;
}
本题考查对前缀和的应用,错误点在没有对本题了解透彻,对map函数使用不熟练,对数据大小没有了解,以后最好把int换成long long,map函数需要多加练习
E. 旅行
#include<bits/stdc++.h>
using namespace std;
long long sum=0,a,b,n,m,sum1=0;
bool c[2001]={false};
vector<vector<long long> > s(2001);
void bfs(int q){
if(c[q]){
return;
}
sum1++;
c[q]=true;
long long num=s[q].size();
for(int i=0;i<num;i++){
bfs(s[q][i]);
}
return;
}
int main(){
freopen("lx.in","r",stdin);
freopen("lx.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a>>b;
s[a].push_back(b);
}
for(int i=1;i<=n;i++){
bfs(i);
sum+=sum1;
sum1=0;
memset(c,false,n+1);
}
cout<<sum;
return 0;
}
需要使用bfs或者使用dfs,本题使用bfs,错误点没有使用bfs和对题的思路不清晰以及对vector使用仍需练习
num的定义一定需要放在bfs函数内
F. 我讨厌非整数
#include<bits/stdc++.h>
using namespace std;
const int M=998244353;
long long n,a[101],f[101][101][101],sum=0;
int main(){
freopen("hate.in","r",stdin);
freopen("hate.out","w",stdout);
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int k=1;k<=n;k++){
memset(f,0,sizeof f);
f[0][0][0]=1;
for(int i=0;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])%M;
if(j<k){
int ll=(l+a[i])%k;
f[i+1][j+1][ll]=(f[i+1][j+1][ll]+f[i][j][l])%M;
}
}
}
}
sum=(sum+f[n][k][0])%M;
}
cout<<sum;
return 0;
}
考察dp,错误点在第四个循环没有理解透彻,转换方程