HDU-4879-ZCC loves march(map+set+并查集)

本文介绍了一种基于地图坐标和并查集的数据结构算法,用于解决军队在二维网格上的调度问题。算法考虑了部队移动和重组的成本,并实时计算每次重组所需的代价。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

On a m*m land stationed n troops, numbered from 1 to n. The i-th troop's position can be described by two numbers (xi,yi) (1<=xi<=m,1<=yi<=m). It is possible that more than one troop stationed in the same place. 
Then there are t minutes, in each minute one of the following two events will occur: 
(1)the x-th troop moves towards a direction( Up(U) Down(D) Left(L) Right(R))for d units;(You can suppose that the troops won't move out of the boundary) 
(2)the x-th troop needs to regroup the troops which stations in the same row or column with the x-th troop. That is, these troops need to move to the x-th troop's station. 
Suggest the cost of i-th troop moving to the j-th troop is (xi-xj)^2+(yi-yj)^2, every time a troop regroups, you should output the cost of the regrouping modulo 10^9+7. 
 

Input

The first line: two numbers n,m(n<=100000,m<=10^18) 
Next n lines each line contain two numbers xi,yi(1<=xi,yi<=m) 
Next line contains a number t.(t<=100000) 
Next t lines, each line's format is one of the following two formats: 
(1)S x d, S∈{U,L,D,R}, indicating the first event(1<=x<=n,0<=d<m) 
(2)Q x, indicating the second event(1<=x<=n) 
In order to force you to answer the questions online, each time you read x', x=x'�lastans("�" means "xor"), where lastans is the previous answer you output. At the beginning lastans=0. 
 

Output

Q lines, i-th line contain your answer to the i-th regrouping event.(modulo 10^9+7)
 

Sample Input

5 3 1 3 2 1 2 2 2 3 3 2 6 Q 1 L 0 2 L 5 2 Q 5 R 3 1 Q 3
 

Sample Output

1 1 7

Hint

The input after decode: Q 1 L 1 2 L 4 2 Q 4 R 2 1 Q 2 


思路:分别用map来维护与x坐标平行和垂直的线上面的集合,集合里面直接存对应元素的下标,并用并查集维护,根节点可以用来表示所在的集合。当移动一个元素时,先找到该元素下标对应的根,根对应的num-1,并把移动的元素插到新的位置上,他的根就是他自己。执行Q操作时,通过map找到同一行和同一列的所有集合进行计算,再把这些计算过的集合删掉,同时下标指向新的根(即移动之后形成的新的集合)。


#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
using namespace std;

struct TROOP{
LL x,y,num;
TROOP(){}
TROOP(LL nx,LL ny,LL nnum){x=nx,y=ny,num=nnum;}
}troop[200005];

map<LL,set<LL> >MX;
map<LL,set<LL> >MY;
set<LL>::iterator it;

LL node[200005];

LL findroot(LL x)
{
    if(node[x]!=x) node[x]=findroot(node[x]);

    return node[x];
}

int main()
{
    LL m,x,y,n,i,t,cnt,root,a,b,ans;
    char s[5];

    while(~scanf("%I64d%I64d",&n,&m))
    {
        MX.clear();
        MY.clear();

        for(i=1;i<=n;i++)
        {
            scanf("%I64d%I64d",&x,&y);

            troop[i].x=x;
            troop[i].y=y;
            troop[i].num=1;

            node[i]=i;

            MX[x].insert(i);
            MY[y].insert(i);
        }

        cnt=n+1;

        ans=0;

        scanf("%I64d",&t);

        while(t--)
        {
            scanf("%s",s);

            if(s[0]=='Q')
            {
                scanf("%I64d",&a);

                a^=ans;

                root=findroot(a);//找到a所在的集合

                x=troop[root].x;
                y=troop[root].y;

                LL num=0;

                ans=0;

                for(it=MX[x].begin();it!=MX[x].end();it++)
                {
                    num+=troop[*it].num;

                    LL temp=abs(troop[*it].y-y);

                    temp%=mod;

                    ans=(temp*temp%mod*troop[*it].num%mod+ans)%mod;

                    node[*it]=cnt;//指向cnt,cnt是执行Q操作之后新的根,用来标记新的集合

                    MY[troop[*it].y].erase(*it);//*it已经计算过,从MY[]集合里删掉,避免重复计算
                }

                for(it=MY[y].begin();it!=MY[y].end();it++)
                {
                    num+=troop[*it].num;

                    LL temp=abs(troop[*it].x-x);

                    temp%=mod;

                    ans=(temp*temp%mod*troop[*it].num%mod+ans)%mod;

                    node[*it]=cnt;//同理

                    MX[troop[*it].x].erase(*it);//同理
                }

                node[cnt]=cnt;//指向自己,别忘了
                troop[cnt]=TROOP(x,y,num);//执行Q操作之后形成的新集合
                MX[x].clear();
                MY[y].clear();
                MX[x].insert(cnt);//在目标集合中插入
                MY[y].insert(cnt);

                cnt++;

                printf("%I64d\n",ans);
            }
            else
            {
                scanf("%I64d%I64d",&a,&b);

                a^=ans;

                root=findroot(a);//找到a所在的集合,即a的根节点

                x=troop[root].x;
                y=troop[root].y;

                troop[root].num--;//集合里的计数减一

                if(!troop[root].num)//如果集合的计数为0则把该集合删掉
                {
                    MX[x].erase(root);
                    MY[y].erase(root);
                }

                if(s[0]=='U')
                {
                    troop[a]=TROOP(x-b,y,1);

                    node[a]=a;//a指向自己,作为新的根

                    MX[x-b].insert(a);//在目标位置插入
                    MY[y].insert(a);
                }
                else if(s[0]=='L')//以下同理
                {
                    troop[a]=TROOP(x,y-b,1);

                    node[a]=a;

                    MX[x].insert(a);
                    MY[y-b].insert(a);
                }
                else if(s[0]=='D')
                {
                    troop[a]=TROOP(x+b,y,1);

                    node[a]=a;

                    MX[x+b].insert(a);
                    MY[y].insert(a);
                }
                else if(s[0]=='R')
                {
                    troop[a]=TROOP(x,y+b,1);

                    node[a]=a;

                    MX[x].insert(a);
                    MY[y+b].insert(a);
                }
            }
        }
    }
}

标题基于SpringBoot+Vue的社区便民服务平台研究AI更换标题第1章引言介绍社区便民服务平台的研究背景、意义,以及基于SpringBoot+Vue技术的研究现状和创新点。1.1研究背景与意义分析社区便民服务的重要性,以及SpringBoot+Vue技术在平台建设中的优势。1.2国内外研究现状概述国内外在社区便民服务平台方面的发展现状。1.3研究方法与创新点阐述本文采用的研究方法和在SpringBoot+Vue技术应用上的创新之处。第2章相关理论介绍SpringBoot和Vue的相关理论基础,以及它们在社区便民服务平台中的应用。2.1SpringBoot技术概述解释SpringBoot的基本概念、特点及其在便民服务平台中的应用价值。2.2Vue技术概述阐述Vue的核心思想、技术特性及其在前端界面开发中的优势。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue如何有效整合,以提升社区便民服务平台的性能。第3章平台需求分析与设计分析社区便民服务平台的需求,并基于SpringBoot+Vue技术进行平台设计。3.1需求分析明确平台需满足的功能需求和性能需求。3.2架构设计设计平台的整体架构,包括前后端分离、模块化设计等思想。3.3数据库设计根据平台需求设计合理的数据库结构,包括数据表、字段等。第4章平台实现与关键技术详细阐述基于SpringBoot+Vue的社区便民服务平台的实现过程及关键技术。4.1后端服务实现使用SpringBoot实现后端服务,包括用户管理、服务管理等核心功能。4.2前端界面实现采用Vue技术实现前端界面,提供友好的用户交互体验。4.3前后端交互技术探讨前后端数据交互的方式,如RESTful API、WebSocket等。第5章平台测试与优化对实现的社区便民服务平台进行全面测试,并针对问题进行优化。5.1测试环境与工具介绍测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值