题意
给你一个数组 再给你一个区间 让你对区间里的每一个数开根 最后在求和
分析:对于一个long long 型的数 开7次根就会变成1 所以我思想就是把区域更新变成单点更新 因为每一个数最多被开7次根 7次以后在对他开根就不必要对他操作了。因为只查询一次所以不必要写查询函数
AC代码
#include <iostream>
#include <stdio.h>
using namespace std;
const int maxn=100000;
struct node {
int l,r,val,lazy;
}tree[maxn*4];
void build(int left,int right,int id){
tree[id].l=left;
tree[id].r=right;
tree[id].lazy=0;
if(tree[id].l==tree[id].r){
tree[id].val=1;
return ;
}
int mid=(left+right)/2;
build(left,mid,id*2);
build(mid+1,right,id*2+1);
tree[id].val=tree[id*2].val+tree[id*2+1].val;
}
void updown(int id){
if(tree[id].lazy!=0){
tree[id*2].lazy=tree[id].lazy;
tree[id*2+1].lazy=tree[id].lazy;
tree[id*2].val=tree[id].lazy*(tree[id*2].r-tree[id*2].l+1);
tree[id*2+1].val=tree[id].lazy*(tree[id*2+1].r-tree[id*2+1].l+1);
tree[id].lazy=0;
}
}
void update(int left,int right,int val,int id){
if(left<=tree[id].l&&tree[id].r<=right){
tree[id].lazy=val;
tree[id].val=val*(tree[id].r-tree[id].l+1);
return;
}
updown(id);
int mid=(tree[id].l+tree[id].r)/2;
if(right<=mid){
update(left,right,val,id*2);
}
else if(left>=mid+1){
update(left,right,val,id*2+1);
}
else {
update(left,mid,val,id*2);
update(mid+1,right,val,id*2+1);
}
tree[id].val=tree[id*2].val+tree[id*2+1].val;
}
int main (){
int t,count1=1;
scanf ("%d",&t);
while (t--){
int len,q;
scanf ("%d %d",&len,&q);
build(1,len,1);
while (q--){
int x,y,val;
scanf ("%d %d %d",&x,&y,&val);
update(x,y,val,1);
}
printf ("Case %d: The total value of the hook is %d.\n",count1++,tree[1].val);
}
return 0;
}