新手做题当然会有许多的经验。本人就是蒟蒻(
这个题用到map 作为预备大二)还没有完全学懂stl但是大体内容学的差不多。
用到图论的知识 以及set的自动排序和去重 以及双指针就可以做。 大家要是像我一样水平可以先去看看这几个知识 图论看怎么构建 set了解一下就行 双指针最好去做几个题 开始
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
set<int>ma[maxn];
int main(){
int n,m;cin>>n>>m;
int u,v;
for(int i=1;i<=m;i++){
cin>>u>>v;
ma[u].insert(v);//排序和去重自动
}
int result=0;//最后的答案区间个数
int mark=0;
for(int i=1;i<=n;i++){ //i是右指针
for(int j=i-1;j>=1;j--){ //j是左指针
if(ma[j].count(i)==0){ //没找到说明不符合友好区间 找到了一个区间 因为所给的u v都是好朋友 所以如果找不到就说明不是好朋友的区间了
//进行标记
mark=j;
break;
}
}
// int r=i;
// int l=mark;
// result+=r-l;
result+=i-mark;
}
cout<<result<<endl;
}
其实就是在构建完图的情况下,自己的脑子里面要有一个构件图,在一个一维数组里面(图的构建是二维的,但是抽象来说用双指针就是一维),我们在右指针所指的map里面count所指向的节点(我们先前的map已经进行了排序,所以在进行for操作的时候,各个节点上下是挨着的),map里面的指向是 u->v 但是在查找当中只要两个之间有联系就可以,所以可以直接count。最后就是result直接就是右指针的位置减去左指针位置就是区间的长度 然后看代码就行.
标签:count,map,int,mark,2024,牛客,补题,指针,result From: https://blog.csdn.net/weixin_44526276/article/details/140928170