传送门

题意简述:给出一个n∗mn*mn∗m的矩阵n,m≤1e8n,m\le1e8n,m≤1e8,支持矩形加,矩形求和,强制在线。


思路:第一眼二维动态开点线段树,上网去搜有没有这种做法发现会被卡时空

然后心态爆炸,居然不能直接树套树233.

然后想起了一个叫做二维前缀和+差分的东西(二维树状数组的时候用过),貌似维护二维差分数组的前缀和就完了,这东西不是可以离散化+主席数吗?

上网一搜发现是正解,然后点开了clarisclarisclaris的代码发现看不懂。

无奈之下自己yyyyyy了一波(丑

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
typedef long long ll;
inline ll read(){
    ll ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
const int N=8e5+5,M=5e6+5;
struct Node{
    ll v,x,y,z;
    friend inline Node operator+(const Node&a,const Node&b){return (Node){a.v+b.v,a.x+b.x,a.y+b.y,a.z+b.z};}
};
struct Upd{ll x,y,v;}upd[N<<1];
namespace SGT{
    #define lc (son[p][0])
    #define rc (son[p][1])
    #define mid (l+r>>1)
    Node val[M];
    int son[M][2],tot=0;
    inline void update(int&p,int o,int l,int r,int k,Node t){
        if(k>r)return;
        val[p=++tot]=val[o]+t,lc=son[o][0],rc=son[o][1];
        if(l==r)return;
        k<=mid?update(lc,son[o][0],l,mid,k,t):update(rc,son[o][1],mid+1,r,k,t);
    }
    inline Node query(int p,int l,int r,int ql,int qr){
        if(!p||ql>qr||ql>r||qr<l)return (Node){0ll,0ll,0ll,0ll};
        if(ql<=l&&r<=qr)return val[p];
        if(qr<=mid)return query(lc,l,mid,ql,qr);
        if(ql>mid)return query(rc,mid+1,r,ql,qr);
        return query(lc,l,mid,ql,mid)+query(rc,mid+1,r,mid+1,qr);
    }
    #undef mid
}
int n,m,k,q,rt[N],vx[N],vy[N],sx=0,sy=0,tot=0,sig=0;
inline bool cmp(const Upd&a,const Upd&b){return a.x<b.x;}
inline int find(int a[],int len,int x){
    int ans=0,l=1,r=len;
    while(l<=r){
        int mid=l+r>>1;
        if(a[mid]<=x)l=(ans=mid)+1;
        else r=mid-1;
    }
    return ans;
}
inline ll query(int x,int y){
    int px=find(vx,sx,x),py=find(vy,sy,y);
    Node tmp=SGT::query(rt[px],1,sy,1,py);
    return (ll)tmp.v*(x+1)*(y+1)-(ll)tmp.x*(x+1)-(ll)tmp.y*(y+1)+tmp.z;
}
int main(){
    n=read(),m=read(),k=read(),q=read();
    for(ri i=1,x1,y1,x2,y2,v;i<=k;++i){
        x1=read(),x2=read(),y1=read(),y2=read(),v=read();
        if(!v)continue;
        upd[++tot]=(Upd){x1,y1,v};
        upd[++tot]=(Upd){x2+1,y1,-v};
        upd[++tot]=(Upd){x1,y2+1,-v};
        upd[++tot]=(Upd){x2+1,y2+1,v};
        vx[++sx]=x1,vx[++sx]=x2+1;
        vy[++sy]=y1,vy[++sy]=y2+1;
    }
    sort(vx+1,vx+sx+1),sx=unique(vx+1,vx+sx+1)-vx-1;
    sort(vy+1,vy+sy+1),sy=unique(vy+1,vy+sy+1)-vy-1;
    sort(upd+1,upd+tot+1,cmp),rt[sig=0]=0;
    for(ri i=1,x,y,px,py;i<=tot;++i){
        ll v=upd[i].v;
        x=upd[i].x,y=upd[i].y;
        py=find(vy,sy,y);
        if(upd[i].x!=upd[i-1].x||i==1)++sig,rt[sig]=rt[sig-1];
        SGT::update(rt[sig],rt[sig],1,sy,py,(Node){v,(ll)y*v,(ll)x*v,(ll)x*y*v});
    }
    ll lastans=0;
    for(ri i=1,x1,x2,y1,y2;i<=q;++i){
        x1=lastans%n+1,x2=(lastans+read())%n+1;
        if(x1>x2)swap(x1,x2);
        y1=lastans%m+1,y2=(lastans+read())%m+1;
        if(y1>y2)swap(y1,y2);
        cout<<(lastans=query(x2,y2)-query(x1-1,y2)-query(x2,y1-1)+query(x1-1,y1-1))<<'\n';
    }
    return 0;
}


2019.01.22 bzoj2874: 训练士兵(主席树)的更多相关文章

  1. BZOJ2874 训练士兵 主席树

    [啊 首先 这是道权限题,然后本人显然是没有权限的  23咳3] 最近数据结构做的越来越少..然后 就跟上次一样 ,一做就是三四种不同写法. 等价的题面: 最近GY大神在sc2的天梯中被神族虐得很惨, ...

  2. Tensorflow学习笔记2019.01.22

    tensorflow学习笔记2 edit by Strangewx 2019.01.04 4.1 机器学习基础 4.1.1 一般结构: 初始化模型参数:通常随机赋值,简单模型赋值0 训练数据:一般打乱 ...

  3. csp-s模拟测试49(9.22)养花(分块/主席树)·折射(神仙DP)·画作

    最近有点头晕........... T1 养花 考场我没想到正解,后来打的主席树,对于每个摸数查找1-(k-1),k-(2k-1)...的最大值,事实上还是很容易被卡的但是没有数据好像还比较友善, 对 ...

  4. Educational Codeforces Round 22 E. Army Creation 主席树 或 分块

    http://codeforces.com/contest/813/problem/E 题目大意: 给出长度为n的数组和k,  大小是1e5级别. 要求在线询问区间[l, r]权值,  权值定义为对于 ...

  5. 2019.01.22 bzoj3333: 排队计划(逆序对+线段树)

    传送门 题意简述:给出一个序列,支持把ppp~nnn中所有小于等于apa_pap​的'扯出来排序之后再放回去,要求动态维护全局逆序对. 思路:我们令fif_ifi​表示第iii个位置之后比它大的数的个 ...

  6. 2019.01.22 hdu5195 DZY Loves Topological Sorting(贪心+线段树)

    传送门 题意简述:给出一张DAGDAGDAG,要求删去不超过kkk条边问最后拓扑序的最大字典序是多少. 思路:贪心帮当前不超过删边上限且权值最大的点删边,用线段树维护一下每个点的入度来支持查询即可. ...

  7. 2019.01.21 NOIP训练 ak树(点分治)

    传送门 题意简述:给一棵带权树,问在上面随机选两个点距离是4的倍数的概率. 思路: 由于总方案数为定值n2n^2n2,所以只用求总方案数. 这个跟聪聪可可差不多,可以用类似树形dpdpdp的方法边点分 ...

  8. 2019.01.22 51nod 1203 JZPLCM(线段树+链表)

    传送门 一道很有意思的题. 题意简述:给一个数列,多次询问区间的lcmlcmlcm,答案对1e9+71e9+71e9+7取模. 思路:首先考虑到一个区间的lcmlcmlcm就是其中所有出现过的素数的最 ...

  9. 2019.01.19 codeforces343D.Water Tree(树剖+ODT)

    传送门 ODTODTODT板子题. 支持子树01覆盖,路径01覆盖,询问一个点的值. 思路:当然可以用树剖+线段树,不过树剖+ODTODTODT也可以很好的水过去. 注意修改路径时每次跳重链都要修改. ...

随机推荐

  1. 【工具引入】uiautomatorviewer 查找元素后自动生成代码

    缘起 公司部门调整PC部门和无线部门合并,原本负责主站PC端自动化的同事需要马上上手安卓,IOS自动化.对于初次接触移动端的测试者来说,跨度还是有点大的.加之人员有些变动,不得不搞个工具降低学习成本, ...

  2. widdow.locationg.可跟的参数,获取url不同的地址

  3. linux下rsync+inotify实现服务器之间文件实时同步

    先介绍一下rsync与inotify. 1.rsync 与传统的cp.tar备份方式相比,rsync具有安全性高.备份迅速.支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例 ...

  4. golang语言中os/user包的学习与使用

    package main; import ( "os/user" "fmt" ) func main() { //返回当前用户的结构 u, _ := user. ...

  5. TotoiseSVN 使用参考文章

    SVN使用教程总结 http://www.cnblogs.com/armyfai/p/3985660.html TotoiseSVN的基本使用方法 http://www.cnblogs.com/xil ...

  6. c# 软件绑定网卡mac的实用

    一:网上搜c# 绑定网卡Mac 有好多信息,其中有篇分为几种方法获取mac 的方法,结果获得到的是一个list 队列的信息,信息获取到所有的物理网卡,无线网卡,蓝牙,隧道的网卡物理地址.对与软件绑定物 ...

  7. c# 子线程打开子窗体

    下边是在子线程打开子窗口,结果跑到else 里边了跨线程操作窗体控件InvokeRequired失效,无法用于打开子窗体,addonetwo.InvokeRequired,访问不了呢? 大神知道帮忙回 ...

  8. Atom打开txt文件中文乱码解决、指定文件的语法格式、win10中禁止睡眠

    1.Atom中文乱码解决 首先保证打开的txt文件的编码格式为UTF-8无BOM编码格式,可以使用Notepad++更改,如下图所示: 然后再在atom中打开文件,并右键点击文件内容的任意位置,Cha ...

  9. 操作系统之CPU管理的直观想法

    计算机:是工具,帮助解决实际问题 操作系统,是为了方便使用硬件 计算机模型: 图灵机,模拟人类计算 起初的图灵机就像一个只会做一道菜的厨师 通用图灵机,核心是设置控制器动作(修改控制器),把逻辑读入控 ...

  10. spring boot 整合 RabbitMq (注解)

    1.增加rabbitmq的依赖包 <!-- ampq 依赖包 --> <dependency> <groupId>org.springframework.boot& ...