嗯。。好久没做题了,最近都在忙期末啊。。下学期开始要认真学习了,毕竟开始学专业课了,应该蛮有意思的吧。最近压力好大,真的好大,好好学java,争取拿下大鹏给的任务!!
题意:
就是一个区间,每个点初始值为1,然后有q个操作,x y z,代表x到y的区间每个点赋值为z。
题解:
对每个要重新赋值的区间,去寻找并标记,寻找的时候注意下拉已经标记的区间。最后再总的去找一遍多少值。
#include<stdio.h>
#include<string.h>
int cas,l,q,tree[300001],flag[300001];
void buildtree(int lf,int rt,int pos){
// tree[pos]=0;
flag[pos]=0;
if(lf==rt){
tree[pos]=1;
return ;
}
int mid=(lf+rt)/2;
buildtree(lf,mid,pos*2);
buildtree(mid+1,rt,pos*2+1);
return ;
}
void find(int left,int right,int lf,int rt,int value,int pos){
if(flag[pos]){
flag[pos*2]=flag[pos*2+1]=flag[pos];
flag[pos]=0;
}
if(left==lf&&right==rt){
flag[pos]=value;
return;
}
int mid=(left+right)/2;
if(rt<=mid){
find(left,mid,lf,rt,value,pos*2);
return ;
}
else if(lf>mid){
find(mid+1,right,lf,rt,value,pos*2+1);
return;
}
else{
find(left,mid,lf,mid,value,pos*2);
find(mid+1,right,mid+1,rt,value,pos*2+1);
return;
}
}
int getit(int lf,int rt,int pos){
if(flag[pos]){
return (rt-lf+1)*flag[pos];
}
if(lf==rt){
return 1;
}
else{
int mid=(lf+rt)/2;
return getit(lf,mid,pos*2)+getit(mid+1,rt,pos*2+1);
}
}
int main(){
scanf("%d",&cas);
int it=0;
while(it++<cas){
scanf("%d%d",&l,&q);
buildtree(1,l,1);
for(int i=1;i<=q;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
find(1,l,x,y,z,1);
}
// printf("!!\n");
printf("Case %d: The total value of the hook is %d.\n",it,getit(1,l,1));
}
return 0;
}