数列(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
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 #include #include #include #include #include #include #include #include #include #include #include #include #include