给出一些花瓶,有两种操作,1.从x位置向后插入y朵花,遇见已经有的就跳过,直到最后一个花瓶为止,输出第一和最后一个花瓶的位置,2.将x和y之间的花瓶清空输出花数。
线段树的写法差不多一致,关键是用二分来确定每次查询的左右端点。
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N=500005;
struct node
{
int val;
int mark;
}tree[N*4];
void pushdown(int i,int m)
{
if(tree[i].mark!=-1)
{
tree[i*2+1].mark=tree[i*2].mark=tree[i].mark;
tree[i*2+1].val=(m>>1)*tree[i].mark;
tree[i*2].val=(m-(m>>1))*tree[i].mark;
tree[i].mark=-1;
}
}
void build(int i,int l,int r)
{
tree[i].mark=-1;//标记-1 0也是需要传输的标记
tree[i].val=0;
if(l==r)
return ;
int mid=(l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
}
void updata(int l,int r,int L,int R,int i,int num)
{
if(l>=L&&r<=R)
{
tree[i].mark=num;
tree[i].val=(r-l+1)*tree[i].mark;
return ;
}
pushdown(i,r-l+1);
int mid=(l+r)/2;
if(L<=mid)
updata(l,mid,L,R,i*2,num);
if(R>mid)
updata(mid+1,r,L,R,i*2+1,num);
tree[i].val=tree[i*2].val+tree[i*2+1].val;
}
int query(int l,int r,int L,int R,int i)
{
if(l>=L&&r<=R)
return tree[i].val;
int mid=(l+r)/2;
int ans=0;
pushdown(i,r-l+1);
if(L<=mid)
ans+=query(l,mid,L,R,i*2);
if(R>mid)
ans+=query(mid&#