- 闫晟淏 的博客
暑假七月DAY2
- @ 2025-7-17 20:30:43
错题:
D
错因:
没想到用MAP,导致程序超时。下次在统计时运用桶
思路:
输入并创建前缀和数组,因为 我们要找s[j],其减s[i]等于k,故计数数组要加map[s[i]-k],map[s[i]]++,来为下面的map[s[i]-k]作准备,最后输出计数变量。
参考代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N=2e5+10;
ll a[N],s[N],n,k;
int main(){
freopen("tjqj.in","r",stdin);
freopen("tjqj.out","w",stdout);
cin>>n>>k;
for(ll i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]+a[i];
}
unordered_map<ll,ll> m;
ll sum=0;
for(ll i=0;i<=n;i++){
sum+=m[s[i]-k];
m[s[i]]++;
}
cout<<sum<<endl;
return 0;
}
E
错因:
运用了暴力做法骗分。下次会优化。
思路:
先进行输入,将其存入数组中,之后循环以任意城市为起点,对其进行深搜直到走了一条走过的路(过程中对每条路进行标记) 跳出后每有一种终点计数变量就+1。
主要思想
标记,优化
参考代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int n;
vector<int> lx[2010];
bool vis[2010];
void dfs(int u){ //u:当前节点
if(vis[u]) return; //已走过
vis[u] = 1; //标记
for(int i=0;i<lx[u].size();i++){
dfs(lx[u][i]);
}
}
int main(){
freopen("lx.in","r",stdin);
freopen("lx.out","w",stdout);
int n,m,ans=0;
cin>>n>>m;
for (int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
lx[a].push_back(b);
}
for (int i=1;i<=n;i++){
memset(vis,0,sizeof vis);
dfs(i);
for(int j=1;j<=n;j++) if(vis[j]) ans++;
}
cout<<ans<<endl;
return 0;
}
THE END