数列(seq)

Time Limit: 1 Sec

Memory Limit: 256 MB

题目连接

http://acm.uestc.edu.cn/#/problem/show/1157

Description

给出一个长度为n的数列A。现有如下两种操作:

修改操作:把数列中第i个数改为x

询问操作:给定一个位置i,问数列中有多少个位置j ( j>i ),满足位置i与位置j间所有的数都不超过Ai与Aj的较大值。

现共有m个操作,请对每个询问操作做出回答。

Input

第一行两个正整数n、m。

随后n行,每行一个正整数Ai。

随后m行,若是修改操作,则以一个大写C开头,随后两个正整数i和x;若是查询操作,则以一个大写Q开头,随后一个正整数i。

Output

每行一个整数,依次对每个询问操作给出回答。

Sample Input

5 3
1
3
2
3
2
Q 1
C 1 3
Q 1

Sample Output

2
4

HINT

对于40%的数据,n、m<=5000

对于100%的数据,n、m<=50000,|Ai|、x<=100000

题意

题解:

简单分析一下,就知道,他是让你求有多少个数在他右边比他小

然后再求一个不递减的序列长度

假设,ans[x]表示以a[x]开头的单调不减序列的长度的话

如果查询的位置是x的话,有y个数在他右边比他小,那么答案就是y+ans[y+1]

--------------------

具体做法的话:

如果不分块的话,根本不会……

右边有多少个比他小的,就用线段树来二分就好了

不递减的序列长度,就用分块来维护就好了

代码:

//qscqesze
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <bitset>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 200006
#define mod 1000000007
#define eps 1e-9
#define e exp(1.0)
#define PI acos(-1)
#define lowbit(x) (x)&(-x)
const double EP  = 1E-10 ;
int Num;
//const int inf=0x7fffffff;
const ll inf=999999999;
inline ll read()
{ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
//*************************************************************************************int n;
int a[maxn];struct data{int l,r,mn;
}tr[maxn*4];
void build(int k,int s,int t)
{tr[k].l=s;tr[k].r=t;if(s==t){tr[k].mn=a[s];return;}int mid=(s+t)>>1;build(k<<1,s,mid);build(k<<1|1,mid+1,t);tr[k].mn=max(tr[k<<1].mn,tr[k<<1|1].mn);
}
int ask(int k,int s,int t)
{int l=tr[k].l,r=tr[k].r;if(s==l&&t==r)return tr[k].mn;int mid=(l+r)>>1;if(t<=mid)return ask(k<<1,s,t);if(s>mid)return ask(k<<1|1,s,t);return max(ask(k<<1,s,mid),ask(k<<1|1,mid+1,t));
}
void update(int k,int x,int y)
{int l=tr[k].l,r=tr[k].r;if(l==r){tr[k].mn=y;return;}int mid=(l+r)>>1;if(x<=mid)update(k<<1,x,y);if(x>mid)update(k<<1|1,x,y);tr[k].mn=max(tr[k<<1].mn,tr[k<<1|1].mn);
}int l[300],r[300];
int belong[50001];
int block;
vector<int> Q[500];
int ans[maxn];
int num;
int main()
{n = read();int q=read();for(int i=1;i<=n;i++)a[i]=read();block = sqrt(n);int num = n/block;if(n%block)num++;for(int i=1;i<=num;i++)l[i]=(i-1)*block+1,r[i]=i*block;r[num]=n;for(int i=1;i<=n;i++)belong[i]=(i-1)/block+1;for(int i=1;i<=num;i++){int tmp = 0;for(int j=l[i];j<=r[i];j++){if(a[j]>=tmp){Q[i].push_back(a[j]);tmp = a[j];}}}build(1,1,n);char c[5];while(q--){scanf("%s",c);if(c[0]=='Q'){int x=read();int L = x+1 , R = n;while(L<=R){int mid = (L+R)>>1;if(ask(1,x+1,mid)<=a[x])L = mid+1;elseR = mid-1;}//cout<<l<<endl;ans[x] = L - x - 1;int x2=ans[x]+1+x;int k = belong[x2];int tmp = a[x2];int Ans = 0;if(x2!=n+1){for(int i=x2;i<=r[k];i++){if(a[i]>=tmp){Ans++;tmp = a[i];}}for(int i=k+1;i<=num;i++){if(!Q[i].empty()){if(tmp>Q[i][Q[i].size()-1])continue;Ans+=Q[i].end()-lower_bound(Q[i].begin(),Q[i].end(),tmp);tmp = Q[i][Q[i].size()-1];}}}printf("%d\n",Ans + ans[x]);}else{int x=read();int y=read();a[x]=y;update(1,x,y);int k = belong[x];Q[belong[x]].clear();int tmp = 0;for(int i=l[k];i<=r[k];i++){if(a[i]>=tmp){Q[k].push_back(a[i]);tmp = a[i];}}}}
}

转载于:https://www.cnblogs.com/qscqesze/p/4843820.html

CDOJ 1157 数列(seq) 分块+线段树相关推荐

  1. 19.CF803G Periodic RMQ Problem 线段树+分块+线段树标记

    19.CF803G Periodic RMQ Problem 线段树+分块+线段树标记 个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客 ...

  2. LibreOJ 6282,6284,6285 数列分块入门6,8,9 树状数组,分块,线段树等.

    分块6 分块8 分块9 终于结尾了. 诶?我定义的常量变成yuzu了?我不要可怜了? 可怜有剧毒!我再用可怜我要爆零了. 好吧其实是因为我研究了橘学.这里我推荐一下Citrus. 分块6 支持插入一个 ...

  3. LibreOJ 6277,6278,6280 数列分块入门1,2,4 树状数组,分块,线段树等.

    分块1 分块2 分块4 模板一共有九个.我试着在三天内做了3个. 应该不用超链接吧. 分块1 区间加,单点询问. 这不是裸的改版树状数组吗?用树状数组处理前缀和水过. #include<bits ...

  4. CDOJ 1292 卿学姐种花 暴力 分块 线段树

    卿学姐种花 题目连接: http://acm.uestc.edu.cn/#/problem/show/1292 Description 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一 ...

  5. BZOJ5286 HNOI/AHOI2018转盘(分块/线段树)

    显然最优走法是先一直停在初始位置然后一次性走完一圈.将序列倍长后,相当于找一个长度为n的区间[l,l+n),使其中ti+l+n-1-i的最大值最小.容易发现ti-i>ti+n-(i+n),所以也 ...

  6. Acwing 4339 敌兵布阵 暴力 + 分块 + 线段树 + Zkw线段树 + 树状数组

    来一篇超全题解 数据结构大杂烩 原题连接 题目描述 敌人有 NNN 个工兵营地,编号 1∼N1∼N1∼N. 初始时,第 iii 个营地有 aia_iai​ 个人. 接下来有若干个命令,命令有 444 ...

  7. 【AHOI2009】【BZOJ1798】Seq 维护序列seq(线段树模板,易错提醒)

    problem 给定一个长为n的序列,m次询问 每次询问有3种操作 1.一段区间全部乘一个值 2.一段区间全部加一个值 3.询问一段区间和%P solution 不就一颗线段树么,看朕10分钟A掉.. ...

  8. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq(线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1798 之前写了个快速乘..........................20多s...... 还好 ...

  9. 【洛谷P2357】守墓人【线段树】

    linklinklink 分析: 如果普通暴力做 肯定过不了 那么我们就要考虑 更高效的 数据结构 比如分块 线段树 树状数组等 然后就可以用 线段树过了 要加lazylazylazy标记 比分块快2 ...

  10. CDOJ 1292 卿学姐种花(暴力,分块,线段树)

    众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一样美丽的花.所以卿学姐家的后院有很多的花坛. 卿学姐有n 个花坛,一开始第 i个花坛里有 A[i] 朵花.每过一段时间,卿学姐都会在花坛 ...

最新文章

  1. destoon 多表联合查询时出现解析错误,parse_str函数解析错误
  2. 当前页面怎么调用子集iframe页面的方法
  3. 【ABAP】获取程序中的Include
  4. 【题解】luogu P1757 通天之分组背包
  5. 基于java的络教学平台的设计与实现 (含源文件)
  6. 你(也)是吴恩达的学生么?
  7. 蓝桥杯2016年第七届C/C++省赛A组第一题-网友年龄
  8. Autodesk MapGuide Enterprise 2012开发技术入门培训视频录像下载
  9. 《遥感原理与应用》孙家抦版知识点总结(含简答题、论述题)——第八章
  10. 报童问题求解最大利润_Ortools调用第三方求解器
  11. oracle设计案例,Oracle课程设计案例精编
  12. SRT编码器之Rendezvous模式详解
  13. 【Codeforces】 B. Make it Divisible by 25
  14. Android——新大陆云平台配置(2)
  15. OKRs,自由之风劲吹,发挥无限创造力 | Chatopera
  16. windows Outlook邮箱无法连接服务器
  17. 关于人工智能不会使大脑变懒惰的议论文_人工智能的好处和风险:所有您需要知道的...
  18. 程序员自由工作平台国内外汇总篇
  19. win10家庭版下面修改配置host文件虚拟主机
  20. 初学者学习app2sd并且成功使用它的全过程

热门文章

  1. 无法在web 服务器上启动调试。打开的url的iis辅助进程当前没有运行
  2. 【读书笔记】代理模式代码(C#)
  3. MacOS下搭建Fabric开发环境
  4. 太牛逼了!这个开源项目,可以把我从视频中移除!
  5. Spring Boot 如何使用拦截器、过滤器、监听器?
  6. Java Web项目开发从0开始的要点!
  7. Shell 神技:掩盖 Linux 服务器上的操作痕迹
  8. python爬虫百度翻译997_python爬取百度翻译返回:{'error': 997, 'from': 'zh', 'to': 'en', ......
  9. JAVA基础——设计模式之观察者模式
  10. Rsyslog的模板template详解