NUAA上次热身赛的题目
自己用线段树写了一遍
还需...
#include <stdio.h>
#include <math.h>
#include <string.h>
struct node
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
int left, right;
node * pl, * pr;
int height;
int hCount;
int Lheight, Rheight;
}line[80002];
![](/Images/OutliningIndicators/None.gif)
int n;
int lineCount;
int point[80002];
int area;
![](/Images/OutliningIndicators/None.gif)
node * newNode()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
node *pt = &line[lineCount++];
memset(pt,0,sizeof(node));
return pt;
}
![](/Images/OutliningIndicators/None.gif)
node * makeTree(int ileft, int iright)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
node * root=newNode();
root->left=ileft;
root->right=iright;
if(iright-ileft>1)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int mid=(ileft+iright)/2;
root->pl=makeTree(ileft,mid);
root->pr=makeTree(mid,iright);
}
![](/Images/OutliningIndicators/InBlock.gif)
return root;
}
![](/Images/OutliningIndicators/None.gif)
void height(node * root, int height)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
root->height=height;
root->Lheight=root->Rheight=height;
}
![](/Images/OutliningIndicators/None.gif)
void update(node * root, int x1, int x2, int h)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
if(root->left==x1 && root->right==x2)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
height(root,h);
return;
}
if(root->hCount==1)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
height(root->pl,root->height);
height(root->pr,root->height);
}
root->hCount++;
![](/Images/OutliningIndicators/InBlock.gif)
if(root->pl->right>x1)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(root->pl->right>x2)
update(root->pl,x1,x2,h);
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int mid=(root->left+root->right)/2;
update(root->pl,x1,mid,h);
update(root->pr,mid,x2,h);
}
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
update(root->pr,x1,x2,h);
}
![](/Images/OutliningIndicators/InBlock.gif)
root->Lheight=root->pl->Lheight;
root->Rheight=root->pr->Rheight;
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
void count(node * root, int x1, int x2)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
if(root->hCount==1)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
area+=(root->right-root->right)*root->height;
return;
}
if(root->right-root->left<=1 || root->hCount==0)
return;
![](/Images/OutliningIndicators/InBlock.gif)
if(root->pl->right>x1)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(root->pl->right>=x2)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
count(root->pl,x1,x2);
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int mid=(root->left+root->right)/2;
count(root->pl,x1,mid);
count(root->pr,mid,x2);
}
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
count(root->pr,x1,x2);
}
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
int main()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
lineCount=0;
node * root=makeTree(0,8002);
while(scanf("%d", &n) != EOF && n)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
area=0;
int x1, x2, h;
int i;
for(i=0;i<n;i++)
line[i].hCount=line[i].height=line[i].Lheight=line[i].Rheight=0;
for(i=0;i<n;i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
scanf("%d%d%d",&x1,&x2,&h);
update(root,x1,x2,h);
}
![](/Images/OutliningIndicators/InBlock.gif)
count(root,0,8002);
![](/Images/OutliningIndicators/InBlock.gif)
printf("%d\n",area);
![](/Images/OutliningIndicators/InBlock.gif)
}
return 0;
![](/Images/OutliningIndicators/InBlock.gif)
}
原文地址:https://www.cnblogs.com/SQL/p/920172.html