WXY 2.20 #6

v>

WXY 2.20 #6
J
dfs从两边向中间访问,还要加上把当前的所有放在一起的情况
I
只要从下到上遍历一边,看是否有一行是把左右边界都封住的就可以。
用并查集维护,如果两个圆相交那么就加入到一个并查集里面。然后遍历所有的圆,如果该圆和左边界
相交,那么把这个集合的左边界打标记,有边界也一样。最后遍历一遍所有的集合就可以了。
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e3+100;
struct node{
LL x,y,r;
} Node[MAXN];
int F[MAXN],L[MAXN],R[MAXN];
void MakeSet(int n)
{
for(int i=1;i<=n;i++) F[i]=i;
return ;
}
int Find(int x)
{
if(F[x]!=x) F[x]=Find(F[x]);
return F[x];
}
void join(int x,int y)
{
int fx=Find(x);
int fy=Find(y);
if(fx!=fy) F[fx]=fy;
return ;
}
int Check(node a,node b)
{
LL rr=(a.r+b.r)*(a.r+b.r);
LL tmp=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
if(tmp<=rr) return 1;
else return 0;
}
int main()
{
int T; scanf("%d",&T);
while(T--){
int n,w,l; scanf("%d%d%d",&n,&w,&l);
MakeSet(n);
memset(L,0,sizeof(L));
memset(R,0,sizeof(R));
for(int i=1;i<=n;i++){F
每个机器人都有一个限定值,机器人从父亲节点(
1)出发,选择小于限定值最大的那一条边遍历,将
每个机器人最后所在的点的编号加起来即为答案。
用优先队列存储机器人的限定值(大顶堆),对于每一个节点连接的边按照边权从大到小排序。从根节
点开始dfs遍历,如果当前节点不是上一个节点且队列不为空则更新下一个节点的最大值,如果队头比
下一个节点的最大值还大,那么说明可以访问下一个节点。遍历完所有链接的节点之后,遍历优先队
列,对当前剩下来的说明是在dfs进行到下一个节点剩下来的,那么只能到当前节点,如果对头比到达
当前节点的最大值大,那么就出队,并加上标号,则当前剩下的会返回上一层。
scanf("%d%d%d",&Node[i].x,&Node[i].y,&Node[i].r);
}
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(Check(Node[i],Node[j])) join(i,j);
}
}
for(int i=1;i<=n;i++){
if(Node[i].x-Node[i].r<=0) L[Find(i)]=1;
if(Node[i].x+Node[i].r>=w) R[Find(i)]=1;
}
int ans=0;
for(int i=1;i<=n;i++){
if(Find(i)==i&&L[i]==1&&R[i]==1) ans++;
}
printf("%d\n",ans);
}
return 0;
}
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e5+100;
struct E{
int from,to;
int weight;
bool operator <(E a) const{
return weight>a.weight;
}
};
vector<E> v[MAXN];
priority_queue<int> q;
int maxx[MAXN];
LL ans=0;
void init()
{
for(int i=0;i<MAXN;i++) maxx[i]=0,v[i].clear();
while(!q.empty()) q.pop();
ans=0;
}
void dfs(int now,int father)
{
if(q.empty()||q.top()<=maxx[now]) return ;int siz=v[now].size();
for(int i=0;i<siz;i++){
int to=v[now][i].to;
int w=v[now][i].weight;
if(to!=father&&!q.empty()){
maxx[to]=max(maxx[now],w);
if(q.top()>maxx[to]) dfs(to,now);
}
}
if(q.empty()) return ;
while(q.top()>maxx[now]){
ans+=now;
q.pop();
if(q.empty()) return ;
}
}
int main()
{
int T; scanf("%d",&T);
while(T--){
int n,m; scanf("%d%d",&n,&m);
init();
for(int i=1;i<n;i++){
E a;
scanf("%d%d%d",&a.from,&a.to,&a.weight);
v[a.from].push_back(a);
//swap(a.from,a.to);
E b; b.from=a.to,b.to=a.from,b.weight=a.weight;
v[b.from].push_back(b);
}
for(int i=1;i<=m;i++){
int a; scanf("%d",&a);
q.push(a);
}
for(int i=1;i<=n;i++){
sort(v[i].begin(),v[i].end());
}
dfs(1,-1);
printf("%lld\n",ans);
}
}
posted @ 2022-02-27 00:15  fengzlj  阅读(50)  评论(0)    收藏  举报