题目意思比较容易理解,即如果当前的式子右值在前面出现过的式子中出现过在左值则表明右值已经初始化过了因此第一思路是想使用一个嵌套循环即外层遍历每一个式子,内层遍历在外层遍历的式子之前出现过的式子,如果外层式子的右值被内层遍历到了,则说明该式子已经初始化过了,反之则未被初始化,进行计数即可,但是这样的话,时间复杂度可能不足以得到满分
因此我们需要想想更好的方法
不难想到,我们可以使用哈希来存储每一个值是否被初始化过了,即如果初始化过了就记录为1,反之为0
然后每次遇到一个式子直接利用哈希值就可判断是否初始化过
需要注意的点是,对于0,题目已经说明该值默认为常量,因此默认为初始化过了,还有要将判断右值是否初始化过放在记录初始化值的前面,避免出现3 3这样的数据导致误判
#include<iostream> using namespace std; int n,k,ans=0; int arr[100005][2]; int hash[100005];//如果i初始化过,则hash[i]=1反之为0 int main(){ cin>>n>>k; for(int i=1;i<=k;i++){ cin>>arr[i][0]>>arr[i][1]; } hash[0]=1;//0是常量默认已经初始化过 for(int i=1;i<=k;i++){ int right=arr[i][1]; int left=arr[i][0]; if(!hash[right]){ ans++; } hash[left]=1; } cout<<ans<<endl; return 0; }