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);
}
}
}
}
}

HDU-4879-ZCC loves march(map+set+并查集)的更多相关文章

  1. HDU 4879 ZCC loves march (并查集,set,map)

    题面以及思路:https://blog.csdn.net/glqac/article/details/38402101 代码: #include <bits/stdc++.h> #defi ...

  2. hdu 4876 ZCC loves cards(暴力)

    题目链接:hdu 4876 ZCC loves cards 题目大意:给出n,k,l,表示有n张牌,每张牌有值.选取当中k张排列成圈,然后在该圈上进行游戏,每次选取m(1≤m≤k)张连续的牌,取牌上值 ...

  3. HDU 4876 ZCC loves cards(暴力剪枝)

    HDU 4876 ZCC loves cards 题目链接 题意:给定一些卡片,每一个卡片上有数字,如今选k个卡片,绕成一个环,每次能够再这个环上连续选1 - k张卡片,得到他们的异或和的数,给定一个 ...

  4. hdu 4873 ZCC Loves Intersection(大数+概率)

    pid=4873" target="_blank" style="">题目链接:hdu 4873 ZCC Loves Intersection ...

  5. HDU 4873 ZCC Loves Intersection(可能性)

    HDU 4873 ZCC Loves Intersection pid=4873" target="_blank" style="">题目链接 ...

  6. hdu 4882 ZCC Loves Codefires(数学题+贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4882 ------------------------------------------------ ...

  7. hdu 5288 ZCC loves straight flush

    传送门 ZCC loves straight flush Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K ...

  8. HDU 4882 ZCC Loves Codefires (贪心)

    ZCC Loves Codefires 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/B Description Though ...

  9. HDU 4882 ZCC Loves Codefires(贪心)

     ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

随机推荐

  1. nutch2.2.1

    http://blog.csdn.net/leave00608/article/details/17442163 https://svn.apache.org/repos/asf/nutch/tags ...

  2. Discuz! 7.2 SQL注入exp

    已经有人写出一些工具了,但是感觉不怎么好用,就自己写了个. 参数:1.可直接getshell2.爆管理账号密码3.爆表前缀如果表前缀不是默认的cdb_ 只需更改代码中的 $table即可,方便快捷. ...

  3. 使用GO语言灵活批量ssh登录服务器执行操作

    摘要: 在工作中时常需要登录服务器做一系列操作,每次输入ssh xxx总是很麻烦.这时候为什么不考虑写一个通用的小脚本呢? go语言是一门新兴语言,能够在很多地方发挥总用.初学go语言,做了这么一个小 ...

  4. Xamarin 开发常见问题

    原文:Xamarin 开发常见问题 Verify the project is selected to be deployed in the Solution Configuration Manage ...

  5. 转: 二十八、Java图形化界面设计——中间容器(Jpanel)

    http://blog.csdn.net/liujun13579/article/details/7762835 上一篇讲解了Jframe顶层容器,例子中生成了一个空的窗体,在实际编程过程中,一般很少 ...

  6. Android学习笔记12:图像渲染(Shader)

    在Android中,提供了Shader类专门用来渲染图像以及一些几何图形. Shader类包括了5个直接子类,分别为:BitmapShader.ComposeShader.LinearGradient ...

  7. System.Windows.Forms中的Message Structure

    结构用途说明Implements a Windows message. Properties 1.public IntPtr HWnd { get; set; } Gets or sets the w ...

  8. JVM Monitoring: JMX or SNMP?

    JVM Monitoring: JMX or SNMP? By daniel on Feb 23, 2007 Since JavaTM SE 5.0, the JRE provides a means ...

  9. BZOJ_1588_&_Codevs_1296_[HNOI2002]_营业额统计(平衡树/set)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1588 给出每一天的营业值,求出之前的天当中与它相差最小的营业值与它的差的绝对值(第一天的差值为 ...

  10. Sharepoint 2010 之 WebPart

    转:http://blog.csdn.net/bestbadgod/article/details/6895542 Sharepoint系列的博客,都是我个人自学过程中的点滴的积累,毕竟没做过C#及A ...