标签:style os io for ar 代码 amp size
题意:给你一个数为n的区间,区间的起始价值为1,然后要进行m次操作,操作即为改变给定区间的值(范围为1-3),要你计算最终的权值
思路:就是线段树的区间跟新了
AC代码:
#include <iostream> #include<cstdio> using namespace std; struct node { int value; int a,b; }tree[300010]; void maketree(int i,int a,int b) { tree[i].a=a; tree[i].b=b; tree[i].value=1; if(a==b) { return ; } int mid=(a+b)/2; maketree(2*i,a,mid); maketree(2*i+1,mid+1,b); } void update(int i,int a,int b,int v) { if(tree[i].value==v) //如果该区域内值一样则不用修改 return ; if(tree[i].a==a && tree[i].b==b )//如果修改区域一样,则直接把该区域的值改为指定值 { tree[i].value=v; return ; } if(tree[i].value !=-1) //如果是纯色的,而修改区域不一致,则先将其子区域置为父值,对子区域进行操作 { tree[2*i].value=tree[2*i+1].value=tree[i].value; tree[i].value =-1; //标记为杂色 } int mid=(tree[i].a+tree[i].b)/2; //下面一系列行为都是在父区间为杂色时对子区间进行的操作 if(a>mid) //更新区间为右区间 update(2*i+1,a,b,v); else if(b<=mid) //更新区间为左区间 update(2*i,a,b,v); else //否则左右区间皆更新 { update(2*i,a,mid,v); update(2*i+1,mid+1,b,v); } } int search(int i) //计算总值 { if(tree[i].value!=-1) return (tree[i].b-tree[i].a+1)*tree[i].value; else return search(i*2)+search(i*2+1); } int main() { int a,b,t,q,v,i,n; scanf("%d",&t); for(i=1;i<=t;i++) { scanf("%d",&n); maketree(1,1,n); scanf("%d",&q); while(q--) { scanf("%d%d%d",&a,&b,&v); update(1,a,b,v); } printf("Case %d: The total value of the hook is %d.\n",i,search(1)); } return 0; }
HDU 1698 Just a Hook,布布扣,bubuko.com
标签:style os io for ar 代码 amp size
原文地址:http://blog.csdn.net/u012313382/article/details/38467123