C_Pos_Princess
2024-11-16 16:17:03
意思就是给你一堆棍子,问你最多可以组成多少等腰三角形。然后带修改。
既然有这个围成三角形的限制条件:两边之和大于第三边。
放到等腰三角形中就是第三边长度
我们把一个三角形分成 腰 和 底 分开来看,那一个腰要配上一个底,并且这个底的范围在
具体操作就是,对于每一个长度
如果所有的前缀和都大于等于 0,那么答案就是我们贪心的结果。如果有小于 0 的怎么办呢。
首先我们一定是让某些腰变成底,计算变化后的结果,自然就是在
注意到我们只需要找到最小的那个不满足条件的值,记为
至于
那么
注意大小开两倍,由于
signed main() {
read(n,q);
xb = 2*n;
for(int i = 1; i<=n; i++) {
read(c[i]);
int num1 = c[i]/2; //作为腰
all+=num1;
a[i*2-1]-=num1;
num1 = c[i]%2;
a[i]+=num1;
}
for(int i = 1; i<=xb; i++) {
a[i] = a[i-1]+a[i];
}
build(1,1,xb);
while(q--) {
int x,d;
read(x,d);
int num1 = c[x]/2;
all-=num1;
update(1,2*x-1,xb,num1);
num1 = c[x]%2;
update(1,x,xb,-num1);
c[x] +=d;
num1 = c[x]/2;
all+=num1;
update(1,2*x-1,xb,-num1);
num1 = c[x]%2;
update(1,x,xb,num1);
int minn = tr[1].minn;
int ans = all;
if(minn<=0)
ans = all+minn/3-(minn%3!=0);
write(ans);
LF;
}
return 0;
}