| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
那个大牛可以讲下关于线段树的上传和下传标记啊,我可能就是WA在这个地方。代码的可读性应该还是不错的,另外问下这题有必要离散化数据么,没有必要吧。
#include <iostream>
using namespace std;
const int L = 100001;
const int T = 31;
bool flag[T];
typedef struct node
{
int start, end;
int color;
}TreeNode;
class SegmentTree
{
private:
TreeNode nodes[L * 3];
public:
void buildtree ( int, int, int );
void update ( int, int, int, int );
void query ( int, int, int );
};
void SegmentTree::buildtree ( int start, int end, int p )
{
nodes[p].start = start;
nodes[p].end = end;
nodes[p].color = 0;
if ( start == end )
return;
int mid = ( start + end ) >> 1;
buildtree ( start, mid, p * 2 );
buildtree ( mid + 1, end, p * 2 + 1 );
}
void SegmentTree::update ( int start, int end, int p, int color )
{
if ( nodes[p].start >= start && nodes[p].end <= end )
{
nodes[p].color = color;
return;
}
if ( nodes[p].color > 0 && nodes[p].color != color )
{
nodes[p * 2].color = nodes[p * 2 + 1].color = nodes[p].color;
nodes[p].color = -1;
}
int mid = ( nodes[p].start + nodes[p].end ) >> 1;
if ( start <= mid )
update ( start, end, p * 2, color );
if ( mid < end )
update ( start, end, p * 2 + 1, color );
if ( nodes[p * 2].color == nodes[p * 2 + 1].color )
nodes[p].color = nodes[p * 2].color;
}
void SegmentTree::query ( int start, int end, int p )
{
if ( start <= nodes[p].start && nodes[p].end <= end && nodes[p].color != -1 )
{
flag[nodes[p].color] = true;
return;
}
int mid = ( nodes[p].start + nodes[p].end ) >> 1;
if ( start <= mid )
query ( start, mid, p * 2 );
if ( mid < end )
query ( start, end, p * 2 + 1 );
}
void swap ( int &a, int &b )
{
if ( a > b )
{
int t = a;
a = b;
b = t;
}
}
SegmentTree tree;
int main()
{
int l, t, o, i, s, e, color;
char c;
freopen ("2777.txt", "r", stdin );
scanf ( "%d%d%d", &l, &t, &o );
tree.buildtree ( 1, l, 1 );
tree.update ( 1, l, 1, 1 );
getchar ();
for ( i = 0; i < o; i++ )
{
scanf ( "%c", &c );
if ( c == 'C' )
{
scanf ( "%d%d%d", &s, &e, &color );
swap ( s, e );
tree.update ( s, e, 1, color );
}
else
{
scanf ( "%d%d", &s, &e );
memset ( flag, false, sizeof ( flag ) );
swap ( s, e );
tree.query ( s, e, 1 );
int sum = 0;
for ( int i = 1; i < T; i++ )
if ( flag[i] )
sum++;
printf ( "%d\n", sum );
}
getchar ();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator