博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3542 DZY Loves March 【map + 线段树】
阅读量:5154 次
发布时间:2019-06-13

本文共 2620 字,大约阅读时间需要 8 分钟。

题目链接

题解

线段树裸题,,对每一行每一列开线段树

由于坐标很大,用\(map\)维护根下标
化一下式子,只用维护区间和,区间平方和,区间存在的个数

#include
#include
#include
#include
#include
#include
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)#define REP(i,n) for (int i = 1; i <= (n); i++)#define mp(a,b,c) (node){a,b,c}#define cls(s) memset(s,0,sizeof(s))#define cp node#define LL long long intusing namespace std;const int maxn = 100005,maxm = 8000005,INF = 1000000000,P = 1000000007;inline LL read(){ LL out = 0,flag = 1; char c = getchar(); while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();} while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();} return out * flag;}struct node{LL a,b,c;};map
rt1,rt2;LL x[maxn],y[maxn],m;LL sum[maxm],sum2[maxm],num[maxm],cnt;int ls[maxm],rs[maxm],n;void upd(int u){ sum[u] = (sum[ls[u]] + sum[rs[u]]) % P; sum2[u] = (sum2[ls[u]] + sum2[rs[u]]) % P; num[u] = num[ls[u]] + num[rs[u]];}void modify(int& u,int l,int r,int pos,LL v,LL vv){ if (!u) u = ++cnt; if (l == r){v %= P; sum[u] = v; sum2[u] = v * v % P; num[u] = vv; return;} int mid = l + r >> 1; if (mid >= pos) modify(ls[u],l,mid,pos,v,vv); else modify(rs[u],mid + 1,r,pos,v,vv); upd(u);}cp query(int u,int l,int r,int L,int R){ if (!u) return mp(0,0,0); if (l >= L && r <= R) return mp(sum[u],sum2[u],num[u]); int mid = l + r >> 1; if (mid >= R) return query(ls[u],l,mid,L,R); if (mid < L) return query(rs[u],mid + 1,r,L,R); cp t1 = query(ls[u],l,mid,L,R),t2 = query(rs[u],mid + 1,r,L,R); return mp((t1.a + t2.a) % P,(t1.b + t2.b) % P,t1.c + t2.c);}LL lans,t,l,r,d,X,Y;int main(){ n = read(); m = read(); REP(i,n){ x[i] = read(); y[i] = read(); modify(rt1[x[i]],1,n,i,y[i] % P,1); modify(rt2[y[i]],1,n,i,x[i] % P,1); } int T = read(); char opt; cp u; while (T--){ opt = getchar(); while (!isalpha(opt)) opt = getchar(); if (opt == 'Q'){ t = read() ^ lans; l = read(); r = read(); u = query(rt1[x[t]],1,n,l,r); X = x[t] % P; Y = y[t] % P; lans = ((Y * Y % P * u.c % P - 2ll * Y % P * u.a % P) % P + u.b)% P; u = query(rt2[y[t]],1,n,l,r); lans = (lans + (X * X % P * u.c % P - 2ll * X % P * u.a % P) % P + u.b) % P; lans = (lans % P + P) % P; printf("%lld\n",lans); } else { t = read() ^ lans; d = read(); modify(rt1[x[t]],1,n,t,0,0); modify(rt2[y[t]],1,n,t,0,0); switch(opt){ case 'U':y[t] += d;break; case 'D':y[t] -= d;break; case 'L':x[t] -= d;break; case 'R':x[t] += d;break; default:break; } modify(rt1[x[t]],1,n,t,y[t] % P,1); modify(rt2[y[t]],1,n,t,x[t] % P,1); } } return 0;}

转载于:https://www.cnblogs.com/Mychael/p/9098438.html

你可能感兴趣的文章
js编码
查看>>
Pycharm Error loading package list:Status: 403错误解决方法
查看>>
steps/train_sat.sh
查看>>
转:Linux设备树(Device Tree)机制
查看>>
iOS 组件化
查看>>
(转)Tomcat 8 安装和配置、优化
查看>>
(转)Linxu磁盘体系知识介绍及磁盘介绍
查看>>
tkinter布局
查看>>
命令ord
查看>>
Sharepoint 2013搜索服务配置总结(实战)
查看>>
博客盈利请先考虑这七点
查看>>
使用 XMLBeans 进行编程
查看>>
写接口请求类型为get或post的时,参数定义的几种方式,如何用注解(原创)--雷锋...
查看>>
【OpenJ_Bailian - 2287】Tian Ji -- The Horse Racing (贪心)
查看>>
Java网络编程--socket服务器端与客户端讲解
查看>>
List_统计输入数值的各种值
查看>>
学习笔记-KMP算法
查看>>
Timer-triggered memory-to-memory DMA transfer demonstrator
查看>>
跨域问题整理
查看>>
[Linux]文件浏览
查看>>