题意

\(m * m\)的网格,有\(n\)个点。\(t\)个询问:操作一:第\(x\)个点向四个方向移动了\(d\)个单位。操作二:询问同行同列其他点到这个点的曼哈顿距离和。强制在线。(\(n \le 10^5,m \le 10^{18}\))

分析

没啥好分析的,就是推一下能推出每行每列的一个式子来,然后套两个区间维护的结构就行了。

题解

set + 线段树

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mo=1e9+7, N=100005;
int n;
ll x[N], y[N];
template<class T>
inline void fix(T &x) {
if(x>=mo || x<=-mo) x%=mo;
if(x<0) x+=mo;
}
struct dat {
int s, sum1, sum2;
void init() {
s=sum1=sum2=0;
}
void add(int _s, int go) {
s+=_s;
sum1+=(ll)go*go%mo*_s; fix(sum1);
sum2+=go*_s; fix(sum2);
}
};
dat operator + (const dat &a, const dat &b) {
static dat x;
x.s=a.s+b.s;
x.sum1=a.sum1+b.sum1; fix(x.sum1);
x.sum2=a.sum2+b.sum2; fix(x.sum2);
return x;
}
struct node *null;
struct node {
node *c[2];
dat d;
void up() {
d=c[0]->d+c[1]->d;
}
void init() {
d.init();
c[0]=c[1]=null;
}
}Po[5000005], *iT=Po, *bin[5000005], **iTbin=bin;
node *newnode() {
node *x;
if(iTbin!=bin) x=*(--iTbin);
else {
if(iT==Po+5000000) x=new node;
else x=iT++;
}
x->init();
return x;
}
void delnode(node *&x) {
*iTbin=x;
iTbin++;
x=null;
}
void seginit() {
null=newnode();
null->init();
}
void update(int p, int s, int go, int l, int r, node *&x) {
if(x==null) {
x=newnode();
}
if(l==r) {
x->d.add(s, go);
if(x->d.s==0) {
delnode(x);
}
return;
}
int mid=(l+r)>>1;
if(p<=mid) {
update(p, s, go, l, mid, x->c[0]);
}
else {
update(p, s, go, mid+1, r, x->c[1]);
}
x->up();
if(x->d.s==0) {
delnode(x);
}
}
dat ask(int L, int R, int l, int r, node *x) {
static dat nul={0, 0, 0};
if(x==null) {
return nul;
}
if(L<=l && r<=R) {
return x->d;
}
int mid=(l+r)>>1;
dat ret;
ret.init();
if(L<=mid) {
ret=ask(L, R, l, mid, x->c[0]);
}
if(mid<R) {
ret=ret+ask(L, R, mid+1, r, x->c[1]);
}
return ret;
}
map<ll, node *> X, Y;
void add(ll x, int s, int go, int id, map<ll, node *> &a) {
if(a.find(x)==a.end()) {
a[x]=null;
}
node *&it=a[x];
update(id, s, go, 1, n, it);
if(it==null) a.erase(a.find(x));
}
dat ask(ll x, int L, int R, map<ll, node *> &a) {
return ask(L, R, 1, n, a[x]);
}
int main() {
seginit();
int m;
scanf("%d%d", &n, &m);
for(int i=1; i<=n; ++i) {
ll _x, _y;
scanf("%lld%lld", &_x, &_y);
x[i]=_x;
y[i]=_y;
fix(_x);
fix(_y);
add(x[i], 1, _y, i, X);
add(y[i], 1, _x, i, Y);
}
int T, ans=0;
scanf("%d", &T);
while(T--) {
char s[5];
int pos;
scanf("%s%d", s, &pos);
pos^=ans;
if(s[0]=='Q') {
int L, R;
scanf("%d%d", &L, &R);
dat d1, d2;
d2=ask(x[pos], L, R, X);
d1=ask(y[pos], L, R, Y);
ans=0;
ll ans1=0, ans2=0, tx=x[pos], ty=y[pos];
fix(tx);
fix(ty);
ans1=-((tx*d1.sum2%mo)<<1)+tx*tx%mo*d1.s+d1.sum1;
ans2=-((ty*d2.sum2%mo)<<1)+ty*ty%mo*d2.s+d2.sum1;
fix(ans1);
fix(ans2);
ans=ans1+ans2;
fix(ans);
printf("%d\n", ans);
}
else {
ll d;
scanf("%lld", &d);
ll _x=x[pos], _y=y[pos];
if(s[0]=='U') y[pos]+=d;
if(s[0]=='D') y[pos]-=d;
if(s[0]=='R') x[pos]+=d;
if(s[0]=='L') x[pos]-=d;
add(_x, -1, _y%mo, pos, X);
add(_y, -1, _x%mo, pos, Y);
add(x[pos], 1, y[pos]%mo, pos, X);
add(y[pos], 1, x[pos]%mo, pos, Y);
}
}
return 0;
}

【BZOJ】3542: DZY Loves March的更多相关文章

  1. 【BZOJ】3309: DZY Loves Math 莫比乌斯反演优化

    3309: DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007) ...

  2. 【BZOJ】3561: DZY Loves Math VI

    题意 求\(\sum_{i=1}^{n} \sum_{j=1}^{m} lcm(i, j)^{gcd(i, j)}\)(\(n, m<=500000\)) 分析 很显然要死推莫比乌斯 题解 设\ ...

  3. 【BZOJ】3309: DZY Loves Math

    题意 \(T(T \le 10000)\)次询问,每次给出\(a, b(1 \le a, b \le 10^7)\),求 \[\sum_{i=1}^{a} \sum_{j=1}^{b} f((i, j ...

  4. 【BZOJ】3850: ZCC Loves Codefires(300T就这样献给了水题TAT)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3850 题意:类似国王游戏....无意义.. #include <cstdio> #inc ...

  5. 【dfs】bzoj3563 DZY Loves Chinese

    因为我们可以通过把某一行读到末尾来获取真正的K,所以把它和假K异或之后就是之前联通的次数(异或的逆运算为其本身).最后一次的暴力一下. #include<cstdio> #include& ...

  6. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  7. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  8. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  9. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

随机推荐

  1. [Unity3D]粒子系统学习笔记

    粒子阴影的处理 通过Material填充粒子系统的render后,默认是显示阴影的: 可以通过设置来调整: 调整后的效果, 每个粒子就没有阴影了 增加粒子效果 设置为合成的材质,效果显示加倍: 添加子 ...

  2. 将C#文档注释生成.chm帮助文档

    由于最近需要把以前的一个项目写一个文档,但一时又不知道写成怎样的,又恰好发现了可以生成chm的工具,于是乎我就研究了下,感觉还不错,所以也给大家分享下.好了,不多废话,下面就来实现一下吧. 生成前的准 ...

  3. zend studio汉化

    在help菜单中选择Install New Software,在 work with栏中添加上这样的地址 http://archive.eclipse.org/technology/babel/upd ...

  4. Linux命令--删除软连接

    1,建立软链接 ln -s 源文件 目标文件 例如:ln -s /usr/hb/ /home/hb_link 2,删除软链接 正确的是:rm -rf hb_link 错误的是:rm -rf hb_li ...

  5. struts2 用if标签判断字符串包含

    String testStr = "用来判断是否包含的字符串"; <s:property value="testStr"/> <s:if te ...

  6. Asp.Net Core--自定义基于策略的授权

    翻译如下: 在封面下,角色授权和声明授权使用需求,需求的处理程序和预配置的策略. 这些构建块允许您在代码中表示授权评估,从而允许更丰富,可重用和容易测试的授权结构. 授权策略由一个或多个需求组成,并在 ...

  7. [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

    [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 试题描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发 ...

  8. python匹配ip正则

    python匹配ip正则 #!/usr/bin/env python # -*- coding:utf-8 -*- import re ip_str = "asdad1.1.1.1sdfwe ...

  9. cf595d

    题意:给出一个轮子,上面有一个随着它转动的传感器在圆周上,给出一个指定距离m,和轮子向前行进的速度v以及轮子的半径r.问让传感器通过该距离最少需要多少时间. 分析:首先我们列出传感器行进距离与时间的轮 ...

  10. Unity3D NGUI刮刮卡效果

    线上效果 确保你的纹理的read/write 是勾选的,纹理格式是 RGBA32的 //代码 using UnityEngine; [RequireComponent(typeof(UITexture ...