思想:

  每次开点的时候:左右孩子都开辟新空间

  注意懒惰标记tag: 因为会向下传递

       提前在值中减去懒惰标记,避免重复计算

链接:https://www.nowcoder.com/acm/contest/121/H
来源:牛客网

乐于助人,善于团结,吃苦耐劳,平易近人,尊敬师长,团结同学,心地善良,为人诚实,一心一意,精明能干,个性稳重······的ddjing,为了柯怡着想,非常善良诚恳地向她提出一个很有建设性的建议————她该减肥了!

柯怡听了之后非常不高兴!她坚定的认为自己是微胖(连233斤都没有怎么能叫胖!)!而微胖才是最受欢迎的!并且做出了一个人神公愤的决定!她居然想要以此为借口欺负ddjing!

委屈的ddjing生气了!所以ddjing决定对柯怡降下天罚!这把柯怡吓得到处乱跑!

然而柯怡也不能坐以待毙,她知道每次天罚的时候ddjing会在[li,ri]之间劈下xi道闪电,而她当时会站在某个位置,由于她的身躯过于肥胖,她会占据[keyiLi,keyiRi]这段区间(为什么柯怡的体型会不同呢?因为柯怡逃跑的时候可能消耗掉一些脂肪,体型就会减少,而当她跑累的时候她又会去吃吃吃,体型就又会变大);

忙于逃跑的柯怡实在没办法算的过来,因为零食早已塞满了她的大脑,所以她决定求助于你;

她想知道,在ddjing降下这次天罚之后,她现在所处的位置已经被闪电劈过多少次了?(这方便她去估算下一次逃跑的方向)

ddjing也猜测到了柯怡想预判他的天罚位置,所以他决定对他的天罚情报进行加密;

聪明的ddjing知道上一次柯怡所处的位置已经被resi-1道闪电劈过了,并且他成功入侵了柯怡与你进行py交易的app,所以他会把数据篡改了;

幸好聪明的你发现了还原数据的方法;

因为ddjing十分坚持不懈,所以他一共向柯怡提了T次减肥建议;

每次提完减肥建议的时候,生气的ddjing会降下n次天罚;

每次天罚的时候,你会收到柯怡发过来的,包括li,ri,xi,keyiLi,keyiRi,其中li,ri,keyiLi,keyiRi都是被ddjing篡改过的(不包括xi),而还原数据的方法是将这些被篡改过的数据按位异或(xor)上(resi-1 %19980105),而你需要告诉柯怡,在ddjing这次天罚降下以后,她所处于的位置已经被闪电劈过多少次了;

输入描述:

一共有T(T<=10)组数据,对于每组数据,第一行有一个整数n,代表ddjing降下的天罚次数,接下来会有n(n<=100000)行,每一行有5个整数,分别为li,ri,keyiLi,keyiRi (0<=li,ri,keyiLi,keyiRi<=1000000000,1<=xi<=5000);

其中,i是从1开始计数的,而res0 =0;

输出描述:

对于每次天罚,你需要输出一个整数,代表柯怡在这次天罚之后,她所处于的位置已经被闪电劈了多少次了;

输入例子:
1
4
1 3 5 2 4
2 3 1 1 1
150 250 8 2 4
1 2 3 4 5
输出例子:
10
0
10
0

-->

示例1

输入

复制

1
4
1 3 5 2 4
2 3 1 1 1
150 250 8 2 4
1 2 3 4 5

输出

复制

10
0
10
0

说明

对于第1次天罚,res0 = 0,l1^(0%19980105)=1,r1^(0%19980105)=3,keyiL1^(0%19980105)=2,keyiR1^(0%19980105)=4,在这次天罚后,柯怡所在的位置中的[2,3]分别被闪电劈过了5次,所以res1=10;

对于第2次天罚,res1 =10,l2^(10%19980105)=8,r2^(10%19980105)=9,keyiL2^(10%19980105)=11,keyiR2^(10%19980105)= 11,所以res2=0;

对于第三次天罚柯怡占据了[2,4],[2,3]在第一次天罚中已经被劈过了,所以res3 =10;

对于第四次天罚,res3=10,l4 ^(10%19980105)=11,r4^(10%19980105)=8,所以ddjing降下天罚的范围是[8,11];

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
struct node {
LL sum;
LL lson;
LL rson;
LL tag;
};
const int N=4e6+;// 点要开20~40倍
const LL X=1e9;
const LL p=;
node tree[N];
int n,cnt;
void newnode (LL &rt,LL x) {
rt=++cnt;
tree[rt].sum=x;
tree[rt].lson=tree[rt].rson=-;
tree[rt].tag=;
}
void pushdown (LL rt,LL l,LL r) {
LL m=(l+r)/;
if (tree[rt].tag) {
tree[tree[rt].lson].sum+=tree[rt].tag*(m-l+);
tree[tree[rt].lson].tag+=tree[rt].tag;
tree[tree[rt].rson].sum+=tree[rt].tag*(r-m);
tree[tree[rt].rson].tag+=tree[rt].tag;
tree[rt].tag=;
}
}
void pushup (LL rt) {
tree[rt].sum=tree[t ree[rt].lson].sum+tree[tree[rt].rson].sum;
}
void update (LL L,LL R,LL x,LL l,LL r,LL rt) {
if (l>R||r<L) return ;
if (l>=L&&r<=R) {
tree[rt].sum+=(r-l+)*x;
tree[rt].tag+=x;
return ;
}
LL m=(l+r)/; LL k=tree[rt].sum/(r-l+)-tree[rt].tag;// 提前减去tag
if (tree[rt].lson<) newnode (tree[rt].lson,k*(m-l+));
if (tree[rt].rson<) newnode (tree[rt].rson,k*(r-m));
pushdown(rt,l,r);// 因为这里会自动加上tag
update (L,R,x,l,m,tree[rt].lson);
update (L,R,x,m+,r,tree[rt].rson);
pushup(rt);
return ;
}
LL query (LL L,LL R,LL l,LL r,LL rt) {
if (l>R||r<L) return ;
if (l>=L&&r<=R) return tree[rt].sum;
LL m=(l+r)/; LL k=tree[rt].sum/(r-l+)-tree[rt].tag;
if (tree[rt].lson<) newnode (tree[rt].lson,k*(m-l+));
if (tree[rt].rson<) newnode (tree[rt].rson,k*(r-m));
pushdown(rt,l,r);
return query (L,R,l,m,tree[rt].lson)+query (L,R,m+,r,tree[rt].rson);
}
int main ()
{
int T; scanf ("%d",&T);
while (T--) {
cnt=;
LL res=,rt=++cnt;
tree[rt].sum=tree[rt].tag=;
tree[rt].lson=tree[rt].rson=-;
scanf ("%d",&n);
for (int i=;i<=n;i++) {
LL l,r,x,kl,kr;
scanf ("%lld %lld %lld %lld %lld",&l,&r,&x,&kl,&kr);
l=l^res; r=r^res; kl=kl^res; kr=kr^res;
if (l>r) swap(l,r); if (kl>kr) swap(kl,kr);
update (l,r,x,,X,rt);
res=query (kl,kr,,X,rt);
printf("%lld\n",res);
res%=p;
}
}
return ;
}

动态开点线段树(陕西师范18k题)---get new skill的更多相关文章

  1. NOIP2017 列队——动态开点线段树

    Description: Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为  ...

  2. [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)

    题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...

  3. [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...

  4. 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化

    4636: 蒟蒻的数列 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 247  Solved: 113[Submit][Status][Discuss ...

  5. codeforces 893F - Physical Education Lessons 动态开点线段树合并

    https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...

  6. codeforces 915E - Physical Education Lessons 动态开点线段树

    题意: 最大$10^9$的区间, $3*10^5$次区间修改,每次操作后求整个区间的和 题解: 裸的动态开点线段树,计算清楚数据范围是关键... 经过尝试 $2*10^7$会$MLE$ $10^7$会 ...

  7. CF915E Physical Education Lessons 动态开点线段树

    题目链接 CF915E Physical Education Lessons 题解 动态开点线段树 代码 /* 动态开点线段树 */ #include<cstdio> #include&l ...

  8. 洛谷P3313 [SDOI2014]旅行(树链剖分 动态开节点线段树)

    题意 题目链接 Sol 树链剖分板子 + 动态开节点线段树板子 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...

  9. 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)

    题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...

  10. BZOJ4636: 蒟蒻的数列(动态开节点线段树)

    题意 题目链接 Sol 直接上动态开节点线段树 因为只有一次询问,所以中途不需要下传标记 #include<bits/stdc++.h> #define LL long long usin ...

随机推荐

  1. vue 中使用 Toast弹框

    import { ToastPlugin,ConfirmPlugin,AlertPlugin} from 'vux' Vue.use(ToastPlugin) Vue.use(ConfirmPlugi ...

  2. SQL 常用判断语句

    我们在做sql更新时,为防止sql重复执行报错,需要对所需要执行的对象进行判断是否存在: 常用判断脚本如下: 判断视图是否存在 IF object_id('viewname') IS not NULL ...

  3. java实现按中文首字母排序的方式

    public class ABD { public static void main(String[] args) { //Collator类是用来执行区分语言环境的String比较的,这里是选择CH ...

  4. pyhton 学习 函数式编程

    函数是python内建支持的一种封装,我们通过把打断的代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计,函数就是面向过程的程序设计的基本单元 ...

  5. day16 初识面向对象

    今天主要学习内容: 1.初始面向对象 2 .类 ,对象 3,面向对象和面向过程的对比 4.面向对象的三大特征 1,初始面向对象 面向过程 : 一切以实物的发展流程为中心 面向对象: 一切以对象为中心, ...

  6. docker 部署 flask(三)高级编写及生成镜像,安装requirements.txt

    简介: 上一篇,我写了如何使用别人的docker基础镜像,生成我们的docker镜像. 也就最基本的flask,没有别的库(包)支持.连数据库支持都没有. 也就让大家了解一下怎么生成镜像而已. 本篇介 ...

  7. RabbitMQ 简单的消息发送与接收

    RabbitMQ是建立在AMQP(Advanced Message Queuing Protocol,高级消息队列协议)基础上的,而AMQP是建立在TCP协议之上的. 因此,RabbitMQ是需要建立 ...

  8. VSTO:使用C#开发Excel、Word【1】

    <Visual Studio Tools for Office: Using C# with Excel, Word, Outlook, and InfoPath >——By Eric C ...

  9. 用Java给数组排序

    public class BubbleDemo {public static void main(String[] args) { int arr[]={1,3,5,7,2,4,6,8,9}; bub ...

  10. CPU的硬件结构和汇编语言

    (已更正) 这个问题包括CPU的硬件结构和汇编语言的范畴. 这里梳理一下. 首先, 题主"李建国"自问自答的部分说的是正确的, CPU的指令集是软件与CPU这两个层级之间的接口, ...