开始超时,后来请教了hdu的大牛才过
自己的超时版:
/*
* File: hdu1698.cpp
* Author: Administrator
*
* Created on 2010年1月25日, 下午8:24
*/
#include <stdlib.h>
#include<iostream>
using namespace std;
#define N 100005
struct Node {
int l, r, sum;
} Tree[3 * N];
int A[N], temp[N],s;
void Build_Tree(int l, int r, int k) {
Tree[k].l = l;
Tree[k].r = r;
if (l == r) {
Tree[k].sum = A[l];
return;
}
int mid = (l + r) / 2;
Build_Tree(l, mid, k + k);
Build_Tree(mid + 1, r, k + k + 1);
Tree[k].sum = Tree[k + k].sum + Tree[k + k + 1].sum;
}
void Update_Tree(int l, int r, int k) {
if (Tree[k].l == l && Tree[k].r == r && Tree[k].l == Tree[k].r) {
temp[l]=s-A[l];
A[l]=s;
Tree[k].sum += temp[Tree[k].l];
return;
}
int mid = (Tree[k].l + Tree[k].r) / 2;
if (r <= mid)Update_Tree(l, r, k + k);
else if (l > mid)Update_Tree(l, r, k + k + 1);
else {
Update_Tree(l, mid, k + k);
Update_Tree(mid + 1, r, k + k + 1);
}
Tree[k].sum = Tree[k + k].sum + Tree[k + k + 1].sum;
}
/*
*
*/
int main(int argc, char** argv) {
int n, m, i, j, t, x, y, i0;
//cin >> t;
scanf("%d",&t);
for (i = 1; i <= t; i++) {
//cin >> n;
scanf("%d",&n);
for (i0 = 1; i0 <= n; i0++) {
A[i0] = 1;
temp[i0] = 0;
}
Build_Tree(1, n, 1);
// cin >> m;
scanf("%d",&m);
while (m--) {
//cin >> x >> y >> s;
scanf("%d%d%d",&x,&y,&s);
Update_Tree(x, y, 1);
}
int ans = Tree[1].sum;
cout << "Case " << i << ": The total value of the hook is " << ans << "." << endl;
}
return (EXIT_SUCCESS);
}
AC代码:
/*
* File: main.cpp
* Author: Administrator
*
* Created on 2010年1月25日, 下午9:35
*/
#include <stdlib.h>
#include<iostream>
using namespace std;
#define N 100005
struct Node
{
int l,r,value;
bool cover;
}Tree[3*N];
void Build_Tree(int l,int r,int k)
{
Tree[k].l=l;
Tree[k].r=r;
Tree[k].value=1;
Tree[k].cover=true;
if(l==r)return ;
int mid=(l+r)/2;
Build_Tree(l,mid,k+k);
Build_Tree(mid+1,r,k+k+1);
}
void Update_Tree(int l,int r,int k,int value)
{
if(Tree[k].l==l&&Tree[k].r==r)
{
Tree[k].cover=true;
Tree[k].value=value;
return ;
}
if(Tree[k].cover==true)
{
Tree[k].cover=false;
Tree[k+k].value=Tree[k].value;
Tree[k+k].cover=true;
Tree[k+k+1].value=Tree[k].value;
Tree[k+k+1].cover=true;
}
int mid=(Tree[k].l+Tree[k].r)/2;
if(r<=mid)Update_Tree(l,r,k+k,value);
else if(l>mid)Update_Tree(l,r,k+k+1,value);
else
{
Update_Tree(l,mid,k+k,value);
Update_Tree(mid+1,r,k+k+1,value);
}
}
int Get_Value(int k)
{
if(Tree[k].cover==true)
{
return Tree[k].value*(Tree[k].r-Tree[k].l+1);
}
int a=Get_Value(k+k);
int b=Get_Value(k+k+1);
return a+b;
}
/*
*
*/
int main(int argc, char** argv) {
int n, m, i, j, t, x, y,s, i0;
scanf("%d",&t);
for (i = 1; i <= t; i++) {
scanf("%d",&n);
Build_Tree(1, n, 1);
scanf("%d",&m);
while (m--) {
scanf("%d%d%d",&x,&y,&s);
Update_Tree(x, y, 1,s);
}
int ans = Get_Value(1);
cout << "Case " << i << ": The total value of the hook is " << ans << "." << endl;
}
return (EXIT_SUCCESS);
}