题目大意是:给定一个初始长度为n的钩子。。。由一节一节构成。。。有三种不同的类型。。。长度分别为1,2,3,现在改变其中x,y区间的长度,,要你最后求出总长度的大小。。。。学了线段树做这个题目还是非常简单的 ,,,,这次自己手撸一个线段树,,,,所谓的模板只是别人想的。。自己理解并加以运用才是最棒的。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define maxn 200005
int a[maxn*3];
int setx[maxn*3];
int b[maxn];
int x,y,z;
void build_tree(int root,int l,int r)
{
int mid=l+(r-l)/2;
if(l==r){a[root]=1;return ;}
build_tree(root*2,l,mid);
build_tree(root*2+1,mid+1,r);
a[root]=a[root*2]+a[root*2+1];
}
void pushdown(int root,int l,int r)
{
int mid=l+(r-l)/2;
if(setx[root]>=1)
{
setx[root*2]=setx[root];
setx[root*2+1]=setx[root];
// a[root*2]=setx[root]*(mid-l+1);
// a[root*2+1]=setx[root]*(r-mid+1+1);
setx[root]=0;
}
}
void weihu(int root,int l,int r)
{
if(setx[root]>=1)
a[root]=setx[root]*(r-l+1);
else
{
if(l<r){
a[root]=a[root*2]+a[root*2+1];
}
}
}
void set_tree(int root,int l,int r)
{
//printf("%d %d %d\n",root,l,r);
if(x<=l&&y>=r)
{
setx[root]=z;
}
else
{
pushdown(root,l,r);
int mid=l+(r-l)/2;
if(x<=mid)set_tree(root*2,l,mid);
else weihu(root*2,l,mid);
if(y>mid)set_tree(root*2+1,mid+1,r);
else weihu(root*2+1,mid+1,r);
}
weihu(root,l,r);
// printf("%d %d %d %d\n",l,r,root,a[root]);
}
int main()
{
int T;
int k=1;
// freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
int n,m;
memset(a,0,sizeof(a));
memset(setx,0,sizeof(setx));
scanf("%d",&n);
build_tree(1,1,n);
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
set_tree(1,1,n);
}
printf("Case %d: The total value of the hook is %d.\n",k++,a[1]);
}
return 0;
}
404

被折叠的 条评论
为什么被折叠?



