题意:
解法:
存在性质:x变为d(x),最多变6次之后,x<=2.
当x<=2时,d(x)=x,之后x就不会再变了.
解法1:
线段树维护区间max,当区间max<=2的之后,就不修改了.
区间和线段树也可以直接维护.
解法2:
因为当x<=2时,d(x)=x,之后x就不会再变了,
那么可以考虑存一个链表,每次暴力修改,当a[i]<=2的时候,将其从链表中删掉.
可以用并查集做:令pre[i]表示i位置右边的下一个节点(包含i),删除很方便.
区间和考虑用前缀和快速计算,因为值会修改,需要动态维护前缀和,需要树状数组.
ps:
代码用的是解法2.
code:
#include
using namespace std;
#define int long long
const int maxm=1e6+5;
int pre[maxm];
int d[maxm];
int a[maxm];
int n,m;
struct BIT{
int c[maxm];
int lowbit(int i){return i&-i;}
void add(int i,int t){while(i
int ask(int i){int ans=0;while(i)ans+=c[i],i-=lowbit(i);return ans;}
}T