看出来是二分了,但不知道自己有没有写对
#include <iostream>
#include <math.h>
using namespace std;
const int N = 60;
int n;
int a[N];
bool check(int eps){
int m = (a[1] - eps) > 0 ? (a[1] - eps) : 0;
for(int i = 2; i <= n; i++){
m = max(m + 1, a[i] - eps);
if(a[i] + eps < m)
return false;
}
return true;
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
int l = 0, r = 1e9, mid;
while(l < r){
mid = (l + r) >> 1;
if(check(mid)){
r = mid;
}else{
l = mid + 1;
}
}
cout << l;
return 0;
}
(省略一段,那段感觉就是拿来迷惑人的,其实根本没用线段树
package saikr;
import java.util.Scanner;
public class 看错题 {
static long n, q, dep, ans, sum;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextLong();
q = sc.nextLong();
for(int i = 1; i <= n; i++) {
long x = sc.nextLong();
sum += x;
}
long x = n;
// 计算有多少层
while(x > 0) {
x >>= 1;
dep++;
}
ans = sum * ((1<<dep) - 1);
for(int i = 0; i < q; i++) {
long l = sc.nextLong();
long r = sc.nextLong();
long v = sc.nextLong();
ans += (r-l+1)*v*((1<<dep)-1);
System.out.println(ans);
}
}
}