错题:

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