sert(3,4,1);
t.print();
t.insert(2,3,-1);
t.print();
*/
double ans=0;a[0].h=a[1].h;
for (int i=1;i<=2*n;i++)
{
ans+=(a[i].h-a[i-1].h)*t.sum[1];
t.insert(hpos[a[i].x1]+1,hpos[a[i].x2],a[i].type);
/* t.print();
cout< cout< cout< */ }
printf("Test case #%d\nTotal explored area: %.2lf\n\n",tt,ans);
}
return 0;
}
上述程序效率较慢(m(logm)^2) ,m为边数
我们考虑到,每次上传实在太耗时了。
仔细观察方程,发现每次修改的点一定是从叶结点到根节点的路上的结点的兄弟(不包括路上)
因此每次被影响的一定是路上的结点。
故我们每次只更新结点的值,最后直接由根节点向上递归,得到程序2-效率为O(mlogm) :
[cpp]
#include
#include
#include
#include
#include
#include
#include
#include
#include