#include <iostream>
#include <string>
using namespace std;
#define MAX_N 50000
string str;
int sum; //记录总兵数
int num[MAX_N+1]={0}; //记录各个兵营的兵数
typedef struct node
{
int left;
int right;
int data;
node* lchild;
node* rchild;
node()
{
left = right = data = 0;
}
}Tree;
Tree* CreateTree(int a,int b)
{
Tree* r;
r = (Tree*)malloc(sizeof(Tree));
r->left = a;
r->right = b;
if(a == b)
{
r->data = num[a];
r->lchild = r->rchild = NULL;
}
else
{
int mid = (a+b)>>1;
r->lchild = CreateTree(a,mid);
r->rchild = CreateTree(mid+1,b);
r->data = r->lchild->data + r->rchild->data;
}
return r;
}
void insert(Tree* r,int a,int b)
{
if(r->left == a && r->right == a)
{
r->data += b;
return;
}
int mid = (r->left + r->right)>>1;
if(a <= mid)
{
insert(r->lchild,a,b);
}
else
{
insert(r->rchild,a,b);
}
r->data += b;
}
void find(Tree* r,int a,int b)
{
if(r->left == a && r->right == b)
{
sum += r->data;
return;
}
int mid = (r->left + r->right)>>1;
if(b<=mid)
{
find(r->lchild,a,b);
}
else if(a>mid)
{
find(r->rchild,a,b);
}
else
{
find(r->lchild,a,mid);
find(r->rchild,mid+1,b);
}
}
int main()
{
int t,n,x,y;
int i;
int ca = 0;
scanf("%d",&t);
while(t--)
{
printf("Case %d:/n",++ca);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
Tree* T;
T = CreateTree(1,n);
while(cin>>str)
{
if(str == "Query")
{
sum = 0;
scanf("%d%d",&x,&y);
find(T,x,y);
printf("%d/n",sum);
}
else if(str == "Add")
{
scanf("%d%d",&x,&y);
insert(T,x,y);
}
else if(str == "Sub")
{
scanf("%d%d",&x,&y);
insert(T,x,-y);
}
else
{
break;
}
}
}
return 0;
}
2.hdu1754 I Hate It
#include <iostream>
using namespace std;
#define MAX_N 200000
int big;
typedef struct node
{
int left;
int right;
int data;
int maxx;
}node;
node stu[MAX_N*4];
//int num[MAX_N+1];
int Max(int a,int b)
{
return a>b?a:b;
}
void CreateTree(int ii,int a,int b)
{
stu[ii].left = a;
stu[ii].right = b;
stu[ii].maxx = 0;
stu[ii].data = 0;
if(a == b)
{
return;
}
else
{
int mid = (a+b)>>1;
CreateTree(ii*2,a,mid);
CreateTree(ii*2+1,mid+1,b);
}
}
void updata(int ii,int a,int b)
{
if(stu[ii].left == a && stu[ii].right == a)
{
stu[ii].data = b;
stu[ii].maxx = b;
}
else
{
int mid = (stu[ii].left+stu[ii].right)>>1;
if(a <= mid)
{
updata(ii*2,a,b);
}
else
{
updata(ii*2+1,a,b);
}
if(b > stu[ii].maxx)
stu[ii].maxx = b;
}
}
void find(int ii,int a,int b)
{
if(stu[ii].left == a && stu[ii].right == b)
{
//printf("%d/n",stu[ii].maxx);
if(stu[ii].maxx > big)
big = stu[ii].maxx;
}
else
{
int mid = (stu[ii].left + stu[ii].right)>>1;
if(b <= mid)
{
find(ii*2,a,b);
}
else if(a > mid)
{
find(ii*2+1,a,b);
}
else
{
find(ii*2,a,mid);
find(ii*2+1,mid+1,b);
}
}
}
int main()
{
int n,m,num;
int i;
while(scanf("%d%d",&n,&m)!=EOF)
{
CreateTree(1,1,n);
for(i=1;i<=n;i++)
{
scanf("%d",&num);
updata(1,i,num);
}
char c;
int x1,x2;
while(m--)
{
scanf("%*c%c",&c);
scanf("%d%d",&x1,&x2);
if(c == 'Q')
{
big = 0x80000000;
find(1,x1,x2);
printf("%d/n",big);
}
else
{
updata(1,x1,x2);
}
}
}
return 0;
}
3.hdu1698 Just a Hook
#include <iostream>
using namespace std;
#define MAX_N 100000
struct node
{
int left;
int right;
int data;
int sum;
};
node hook[4*MAX_N];
void CreateTree(int ii,int a,int b)
{
hook[ii].left = a;
hook[ii].right = b;
if(a == b)
{
hook[ii].data = 1;
hook[ii].sum = 1;
}
else
{
int mid = (a+b)>>1;
CreateTree(ii*2,a,mid);
CreateTree(ii*2+1,mid+1,b);
hook[ii].data = 0;
hook[ii].sum = (hook[ii*2].sum + hook[ii*2+1].sum);
}
}
void updata(int ii,int a,int b,int c)
{
if(hook[ii].left == a && hook[ii].right == b)
{
hook[ii].data = c;
hook[ii].sum = (b-a+1)*c;
}
else
{
if(hook[ii].data > 0)
{
hook[ii*2].data = hook[ii].data;
hook[ii*2].sum = (hook[ii*2].right - hook[ii*2].left+1)*hook[ii*2].data;
hook[ii*2+1].data = hook[ii].data;
hook[ii*2+1].sum = (hook[ii*2+1].right - hook[ii*2+1].left+1)*hook[ii*2+1].data;
}
hook[ii].data = 0; //写的时候这个丢掉了。一直错
int mid = (hook[ii].left + hook[ii].right)>>1;
if(b <= mid)
{
updata(ii*2,a,b,c);
}
else if(a > mid)
{
updata(ii*2+1,a,b,c);
}
else
{
updata(ii*2,a,mid,c);
updata(ii*2+1,mid+1,b,c);
}
hook[ii].sum = hook[ii*2].sum + hook[ii*2+1].sum;
}
}
int main()
{
int t,n,m,x1,x2,x3;
int i;
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d",&n);
CreateTree(1,1,n);
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&x1,&x2,&x3);
updata(1,x1,x2,x3);
}
printf("Case %d: The total value of the hook is %d./n",i,hook[1].sum);
}
return 0;
}
.hdu2795 Billboard
#include <iostream>
using namespace std;
#define MAX_N 200000
int h,w,n;
struct node
{
int left;
int right;
int data; //表示这一段中最大的数
};
node T[4*MAX_N];
int Max(int a,int b)
{
return a>b?a:b;
}
void CreateTree(int ini,int a,int b)
{
T[ini].left = a;
T[ini].right = b;
T[ini].data = w; //一开始最大都是宽度
if(a == b)
{
return;
}
else
{
int mid = (a + b) >> 1;
CreateTree(ini*2,a,mid);
CreateTree(ini*2+1,mid+1,b);
}
}
void insert(int ini,int a)
{
if(T[ini].left == T[ini].right)
{
printf("%d/n",T[ini].left);
T[ini].data -= a;
}
else
{
if(T[ini*2].data >= a)
{
insert(ini*2,a);
}
else
{
insert(ini*2+1,a);
}
T[ini].data = Max(T[ini*2].data,T[ini*2+1].data);
}
}
int main()
{
int i,num;
while(scanf("%d%d%d",&h,&w,&n)!=EOF)
{
if(h < n)
CreateTree(1,1,h);
else
CreateTree(1,1,n);
//建树按照min(h,n)来建,这样就保证最大时n。
for(i=0;i<n;i++)
{
scanf("%d",&num);
if(num > T[1].data)
{
printf("-1/n");
}
else
insert(1,num);
}
}
return 0;
}