CCF(除法):线段树区间修改(50分)+线段树点修改(100分)+线段树(100分)
除法 201709-5 这道题有很多种方法来做,最常用的就是线段树和树状数组。 如果使用线段树来做,就会想到区间修改的update函数。但是这里可能会涉及到v是1或者a[j]是0的情况,所以用这种方法会超时,最多50分。 可以修改一下代码,使用点修改来做这道题。在main函数里面增加一个循环,用来判断。 当然,还有一种方法就是树状数组,这种方法和上面这种方法运行时间相差无几,但是代码量大大减少。 需要注意的是,如果v是long long型,最好不要用scanf %lld的方式读入,否则超时。 使用线段树代码: //线段树求解 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<vector> using namespace std; const int maxn=100005; int n,m; int a[maxn]; long long sum[maxn<<2]; void pushup(int id,int l,int r){ int lc=id<<1; int rc=id<<1|1; sum[id]=sum[lc]+sum[rc]; } void build(int id,int l,int r){ if(l==r){ sum