A: Ocean的礼物 

Time Limit: 2 s Memory Limit: 128 MB 

Submit My Status 

Problem Description 

皇家理工存在一段很神奇的路段,这段路由nn个格子组成,每个格子都有一个数字,你可以走这段路的任意一段。这段路的神奇之处就在于,如果你所处的这个格子数字和你经过的前一个格子数字不相同的话,你就可以获得一个礼物(初始一定可以获得礼物)。现在Ocean想知道,给定任意路段的左边界和右边界,问若走这段路可以获得多少礼物。不过幸运的是,Ocean很快就解决了,并且获得了大量的礼物。玩的十分开心。但是有一天,这段路神奇的发生了改变。它不但会给你礼物。它还可能随时的改变其任意某处的格子上的数字。这下Ocean可就犯愁了,他想知道任意一段路可以获得的礼物是多少。聪明的你可以帮下他吗?

Input 

第一行输入一个整数nn,代表格子数。(1≤n≤106)(1≤n≤106) 

第二行输入nn个整数xx。(1≤x≤108)(1≤x≤108) 

第三行输入一个整数mm,代表mm次操作。(1≤m≤2∗105)(1≤m≤2∗105) 

接下来第四行到3+m3+m行每行33个数op,x,yop,x,y。

若op=1op=1则把xx处的数修改为yy。(1≤x≤n,1≤y≤108)(1≤x≤n,1≤y≤108) 

若op=2op=2,询问区间[x,y][x,y]内可以获得的礼物数。(1≤x≤y≤n)(1≤x≤y≤n) 

Output 

对于每个询问输出一个整数,代表可以获得的礼物数

Sample Input 



1 2 3 4 5 6 



2 1 6 

1 2 3 

2 2 3 

2 3 4 

Sample Output 





2

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int cnt,a[1111111];
struct node
{
int l,r,val;
}p[2222222];
void pushup(int i)
{
p[i].val=p[i<<1].val+p[i<<1|1].val;
}
void build(int i,int x,int y)
{
p[i].l=x;
p[i].r=y;
if(p[i].r==p[i].l)
{
int pos=p[i].l;
if(a[pos]!=a[pos-1]||pos==1)
p[i].val=1;
else p[i].val=0;
return;
}
int m=p[i].r+p[i].l>>1;
build(i<<1,x,m);
build(i<<1|1,m+1,y);
pushup(i);
}
void update(int i,int x,int val)
{
if(p[i].l==p[i].r)
{
p[i].val=val;
return;
}
int m=p[i].r+p[i].l>>1;
if(x<=m)
update(i<<1,x,val);
if(x>m)
update(i<<1|1,x,val);
pushup(i);
}
void query(int i,int x,int y)
{
if(p[i].l>=x&&p[i].r<=y)
{
cnt+=p[i].val;
return;
}
int m=p[i].l+p[i].r>>1;
if(x<=m)
query(i<<1,x,y);
if(y>m)
query(i<<1|1,x,y);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
int Q;
scanf("%d",&Q);
while(Q--)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(x==1)
{
a[y]=z;
if(y>1)
{
if(a[y]==a[y-1])
update(1,y,0);
else
update(1,y,1);
}
if(y<n)
{
if(a[y]==a[y+1])
update(1,y+1,0);
else
update(1,y+1,1);
}
}
if(x==2)
{
cnt=1;
query(1,y+1,z);
printf("%d\n",cnt);
}
}
return 0;
}

A.Ocean的礼物线段树的更多相关文章

  1. Ocean的礼物(线段树单点修改)

    题目链接:http://oj.ismdeep.com/contest/Problem?id=1284&pid=0 A: Ocean的礼物 Time Limit: 5 s      Memory ...

  2. [计蒜客T2238]礼物_线段树_归并排序_概率期望

    礼物 题目大意: 数据范围: 题解: 这题有意思啊($md$卡常 直接做怎么做? 随便上个什么东西,维护一下矩阵乘和插入,比如说常数还算小的$KD-Tree$(反正我是没见人过过 我们漏掉了一个条件, ...

  3. 【BZOJ-4556】字符串 后缀数组+二分+主席树 / 后缀自动机+线段树合并+二分

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 657  Solved: 274[Su ...

  4. [BZOJ5139][Usaco2017 Dec]Greedy Gift Takers 权值线段树

    Description Farmer John's nemesis, Farmer Nhoj, has NN cows (1≤N≤10^5), conveniently numbered 1…N. T ...

  5. 字符串(tjoi2016,heoi2016,bzoj4556)(sam(后缀自动机)+线段树合并+倍增+二分答案)

    佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为\(n\)的字符串\(s\),和\(m\)个问题.佳媛姐姐必须正确回答这\(m\)个问题, ...

  6. BZOJ4556 Tjoi2016&Heoi2016 字符串【后缀自动机+倍增+线段树合并】

    Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开 ...

  7. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  8. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  9. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

随机推荐

  1. Netty实现简单WebSocket服务器

    本文参考<Netty权威指南>├── WebSocketServerHandler.java├── WebSocketServer.java└── wsclient.html packag ...

  2. dubbo源码分析8——服务暴露概述

    从上文中可知,com.alibaba.dubbo.config.spring.ServiceBean类是负责解析<dubbo:service/>的配置的,下面是它的类图 从类图上可知它继承 ...

  3. Aurelius vs mORMot vs EntityDAC Delphi 的 ORM框架

    Aurelius vs mORMot vs EntityDAC   Delphi 的 ORM框架: http://www.tmssoftware.com/site/aurelius.asp#produ ...

  4. requests库入门13-会话对象

    会话对象可以在跨请求保持某些参数,会话对象有requests api的大部分方法,我理解会话对象就是一个资源共享池 使用requests.Session()可以创建会话对象的实例 还是以之前GitHu ...

  5. CentOS(Linux)中解决MySQL乱码

    环境:CentOS 6.3.mysql5.1 Centos 6.3在上安装mysql client和server之后,出现乱码,不得不修改编码. 注意: 关于utf8和gbk的区别详细见:linux中 ...

  6. 题解-PKUWC2018 随机算法

    Problem loj2540 题意简述:给定\(n\)个点的无向图,给定求最大独立集的近似算法:随机排列\(1\cdots n\),按照该排列顺序贪心构造最大独立集(即对每个点能加入独立集就加),求 ...

  7. strstr()函数的使用

    strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地址:否则,返回NULL. 实例: /** *Descriptio ...

  8. 028_shell脚本递归求值

    一. #!/bin/sh factorial() { if [ "$1" -gt "1" ]; then i=`expr $1 - 1` j=`factoria ...

  9. List集合三种遍历方法

    List<String> list = new ArrayList<String>();list.add("aaa");list.add("bbb ...

  10. Android:四大架构的优缺点,你真的了解吗?

    声明|转载于作者:KunMinX原文链接:https://www.jianshu.com/p/9ef813d5c1af 前言 前不久刚结束对 20 模块项目的第 3 轮重构,一路见证 MVC.MVP. ...