线段树521
最近线段树狂写中 争取以后啥都不看就能写出来
#include<stdio.h>
#include<string.h>
![](/Images/OutliningIndicators/None.gif)
struct node
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
node * pl, * pr;
int left, right;
int color;
int colCount;
int cl, cr;
}mem[200020];
![](/Images/OutliningIndicators/None.gif)
int memCount;
int Col[31];
int ColCnt;
int result;
node * newNode()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
node * pt= &mem[memCount++];
pt->color= pt->colCount= pt->cr= pt->cl= 1;
return pt;
}
![](/Images/OutliningIndicators/None.gif)
node * buildTree(int l, int r)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
node * root=newNode();
root->left=l;
root->right=r;
if(r-l>1)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int mid=(l+r)/2;
root->pl=buildTree(l, mid);
root->pr=buildTree(mid, r);
}
return root;
}
![](/Images/OutliningIndicators/None.gif)
void color(node * root, int c)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
root->colCount=1;
root->color = root->cl = root->cr = c;
}
![](/Images/OutliningIndicators/None.gif)
void update(node * root, int l, int r, int c)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
if(root->left==l && root->right==r)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
color(root, c);
return ;
}
if(root->colCount==1)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
color(root->pl,root->color);
color(root->pr,root->color);
}
if(root->colCount==1 && root->color==c)
return;
root->colCount=2;
if(root->pl->right>l)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(root->pl->right>=r)
update(root->pl,l,r,c);
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int mid=(root->left+root->right)/2;
update(root->pl,l,mid,c);
update(root->pr,mid,r,c);
}
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
update(root->pr,l,r,c);
}
root->cl=root->pl->cl;
root->cr=root->pr->cr;
}
![](/Images/OutliningIndicators/None.gif)
void ques(node * root, int l, int r)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
if(root->colCount==1)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Col[ColCnt++]=root->color;
return;
}
![](/Images/OutliningIndicators/InBlock.gif)
if(root->right-root->left<=1)
return ;
if(root->pl->right>l)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(root->pl->right>=r)
ques(root->pl,l,r);
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int mid=(root->left+root->right)/2;
ques(root->pl,l,mid);
ques(root->pr,mid,r);
}
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ques(root->pr,l,r);
}
}
![](/Images/OutliningIndicators/None.gif)
void clean()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
int i, j;
for(i=1; i<=30; i++)
for(j=0; j<ColCnt; j++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(i==Col[j])
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
result++;
break;
}
}
}
![](/Images/OutliningIndicators/None.gif)
int main()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
int l, t, o;
while(scanf("%d%d%d", &l, &t, &o)==3)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
memCount=0;
node * root=buildTree(0, l);
int i;
char op;
int l, r, c;
for(i=0; i<o; i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
scanf("%s", &op);
if(op=='C')
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
scanf("%d%d%d", &l, &r, &c);
if(l<=r)
update(root,l-1,r,c);
else
update(root,r-1,l,c);
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ColCnt=0;
result=0;
memset(Col,0,sizeof(Col));
scanf("%d%d", &l, &r);
if(l<=r)
ques(root,l-1, r);
else
ques(root,r-1,l);
clean();
printf("%d\n", result);
}
}
}
return 0;
}
![](/Images/OutliningIndicators/None.gif)
原文地址:https://www.cnblogs.com/SQL/p/926666.html