帕吉的肉钩

帕吉的肉钩

帕吉的肉钩

在DotA游戏中,帕吉的肉钩是很多英雄最害怕的东西。钩子由连续若干段的等长金属棒制成。

现在帕吉对钩子由一些操作:

我们将金属棒1~n依次编号,帕吉可以把编号x~y的金属棒变成铜棒、银棒、金棒。

每段铜棒的价值是1;每段银棒的价值是2;每段金棒的价值是3。

肉钩的总价值是n段金属棒价值之和。帕吉想知道若干操作以后钩子的总价值。

输入格式

第一行一个整数N(1≤N≤105),表示肉钩金属棒的数量,初始状态为铜棒。

第二行一个整数Q(1≤Q≤105),表示操作数。

接下来Q行,一行三个整数,X,Y,Z(1≤X≤Y≤N,1≤Z≤3)。

输出格式

一行一个整数,表示钩子的总价值,用样例中的格式。

代码:

#include

using namespace std;

int n,q;

const int MAX_N = 1e5+5;

int s[4 * MAX_N],col[4 * MAX_N];

//父节点合并

void up(int p){

s[p] = s[p * 2] + s[p * 2 + 1];

}

//向下更新一层 区间更新使用延迟更新的思想提高效率

void down(int p, int l, int r){

if(col[p]){

int mid = (l + r) / 2;

s[p * 2] = col[p] * (mid - l + 1);

s[p * 2 + 1] = col[p] * (r - mid);

col[p * 2] = col[p];

col[p * 2 + 1] = col[p];

col[p] = 0;

}

}

//更新

void modify(int p,int l,int r,int x,int y,int v){

if(x <= l && r <=y){

s[p] = (r - l + 1) * v; //对父结点修改

col[p] = v; //标记子节点需要延迟更新

return;

}

down(p, l, r);//向下更新一层

int mid = (l + r)/2;

if(x <= mid){

modify(p * 2, l, mid, x, y, v);

}

if(y > mid){

modify(p * 2 + 1, mid + 1,r,x,y,v);

}

up(p);

}

//查询

int query(int p,int l,int r,int x,int y){

if(x <= l && r <= y){

return s[p];

}

down(p,l,r);//如果没有return,这时子节点必须更新了 就向下更新一层

int mid = (l + r) / 2, res = 0;

if(x <= mid){

res += query(p * 2, l,mid,x,y);

}

if(y > mid){

res += query(p * 2 + 1,mid + 1,r,x,y);

}

return res;

}

int main(){

scanf("%d%d",&n,&q);

for(int i=1;i<=n;i++){

modify(1,1,n,i,i,1);

}

while(q--){

int x,y,z;

scanf("%d%d%d",&x,&y,&z);

modify(1,1,n,x,y,z);

}

cout<<"The total value of the hook is "<

return 0;

}

相关数据

打完飞机之后多久才能恢复
365体育欧洲版本

打完飞机之后多久才能恢复

⌛ 07-01 👁️ 6580
没钱过年怎么办?如何攒钱过年?
365bet娱乐场游戏

没钱过年怎么办?如何攒钱过年?

⌛ 07-16 👁️ 8155