BZOJ3847 : ZCC loves march
注意到集结操作相当于合并一些点
于是我们可以使用并查集
对于每一行、每一列维护一个链表,储存里面的点
查询x时,在并查集中找到x的祖先u,此时x的坐标就是u的坐标
然后扫描u所在行列的链表,依次删除每个点,并把这些点合并成一个新点,同时计算贡献
对于修改操作,可以看作是分离,新建一个点代表修改后的点,然后对于原来的点减掉贡献即可
#include<cstdio>
#include<map>
#define N 300010
#define P 1000000007
typedef long long ll;
int n,m,i,id,f[N],C[N],tot,x,y,g[N<<1],nxt[N<<1],v[N<<1],ed,cnt,u;
ll X[N],Y[N],d,nx,ny,ans;
bool del[N];
std::map<ll,int>locx,locy;
char op[5];
inline ll sqr(ll x){x%=P;return x*x%P;}
inline int posx(ll x){return locx[x]?locx[x]:locx[x]=++cnt;}
inline int posy(ll y){return locy[y]?locy[y]:locy[y]=++cnt;}
inline void addedge(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline void addset(int x){addedge(posx(X[x]),x),addedge(posy(Y[x]),x);}
inline void addnode(ll x,ll y,int c){X[++tot]=x,Y[tot]=y,C[tot]=c,f[tot]=tot;}
inline int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
int main(){
scanf("%d%lld",&n,&nx);
for(i=1;i<=n;i++)scanf("%lld%lld",&nx,&ny),addnode(nx,ny,1);
for(i=1;i<=n;i++)addnode(X[i],Y[i],1),addset(tot),f[i]=tot;
scanf("%d",&m);
while(m--){
scanf("%s%d",op,&x);u=F(x^=ans);
if(op[0]=='Q'){
addnode(X[u],Y[u],ans=0);
for(i=g[id=locx[X[u]]];i;i=nxt[i])if(!del[v[i]])del[v[i]]=1,(ans+=sqr(Y[v[i]]-Y[u])*C[v[i]])%=P,C[tot]+=C[v[i]],f[v[i]]=tot;
g[id]=0,addedge(id,tot);
for(i=g[id=locy[Y[u]]];i;i=nxt[i])if(!del[v[i]])del[v[i]]=1,(ans+=sqr(X[v[i]]-X[u])*C[v[i]])%=P,C[tot]+=C[v[i]],f[v[i]]=tot;
g[id]=0,addedge(id,tot);
printf("%lld\n",ans);
}else{
scanf("%lld",&d);nx=X[u],ny=Y[u];
if(op[0]=='U')nx-=d;
if(op[0]=='D')nx+=d;
if(op[0]=='L')ny-=d;
if(op[0]=='R')ny+=d;
C[u]--,addnode(nx,ny,1),addset(f[x]=tot);
}
}
return 0;
}
BZOJ3847 : ZCC loves march的更多相关文章
- HDU 4879 ZCC loves march (并查集,set,map)
题面以及思路:https://blog.csdn.net/glqac/article/details/38402101 代码: #include <bits/stdc++.h> #defi ...
- 2014---多校训练2(ZCC Loves Codefires)
ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU 4876 ZCC loves cards(暴力剪枝)
HDU 4876 ZCC loves cards 题目链接 题意:给定一些卡片,每一个卡片上有数字,如今选k个卡片,绕成一个环,每次能够再这个环上连续选1 - k张卡片,得到他们的异或和的数,给定一个 ...
- HDU-4882 ZCC Loves Codefires
http://acm.hdu.edu.cn/showproblem.php?pid=4882 ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Ot ...
- HDU 4882 ZCC Loves Codefires (贪心)
ZCC Loves Codefires 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/B Description Though ...
- hdu 4873 ZCC Loves Intersection(大数+概率)
pid=4873" target="_blank" style="">题目链接:hdu 4873 ZCC Loves Intersection ...
- HDU 4882 ZCC Loves Codefires(贪心)
ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- hdu 4882 ZCC Loves Codefires(数学题+贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4882 ------------------------------------------------ ...
- hdu 4876 ZCC loves cards(暴力)
题目链接:hdu 4876 ZCC loves cards 题目大意:给出n,k,l,表示有n张牌,每张牌有值.选取当中k张排列成圈,然后在该圈上进行游戏,每次选取m(1≤m≤k)张连续的牌,取牌上值 ...
随机推荐
- Android创建桌面快捷图标
<!-- 添加快捷方式 --> <uses-permission android:name="com.android.launcher.permission.INSTALL ...
- postgresql 函数demo
create or replace function refresh_product_usage() returns void as $$ declare rec record; sub_rec re ...
- django-cms 代码研究(四)CMS_TEMPLATE标签
CMS_TEMPLATE 继承这个东东可以在实现很灵活的布局,如下:
- 用Matplotlib绘制二维图像
唠叨几句: 近期在做数据分析,需要对数据做可视化处理,也就是画图,一般是用Matlib来做,但Matlib安装文件太大,不太想直接用它,据说其代码运行效率也很低,在网上看到可以先用Java做数据处理, ...
- chrome断点续传功能
刚好找到了一个临时的解决方法,chrome其实已经内部实现了断点续传功能,不过应该还没完善,所以要自己打开.方法:用chrome在地址栏输入chrome://flags用搜索找到resumption( ...
- sharepoint添加应用程序
- 解决Cannot change version of project facet Dynamic web module to 3.0
我们用Eclipse创建Maven结构的web项目的时候选择了Artifact Id为maven-artchetype-webapp,由于这个catalog比较老,用的servlet还是2.3的,而一 ...
- 如何从sun公司官网下载java API文档(转载)
相信很多同人和我一样,想去官网下载一份纯英文的java API文档,可使sun公司的网站让我实在很头疼,很乱,全是英文!所以就在网上下载了别人提供的下载!可是还是不甘心!其实多去看看这些英文的技术网站 ...
- CodeForces - 416A (判断大于小于等于 模拟题)
Guess a number! Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Sub ...
- mongodb初步使用
下载安装: 下载MongoDB:http://www.mongodb.org/. 安装MongoDB:傻瓜式安装 配置: 把bin目录添加到系统环境变量 启动: 打开一个 cmd编辑框,输入: mon ...