Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

晒代码 纪念第一道线段树

Posted by hust_ELT at 2010-07-09 22:08:44 on Problem 2777
#include <iostream>
#include <string.h>
#include <stdio.h>
#define MAXN 300000
using namespace std;

void BuildTree (int a, int b);
void Paint (int a, int b, int color, int index);
void Calc (int a, int b, int index);
void Combine (int index);
void Combine (int index);
void Down (int index);
void GetRes (int x);
int Begin[MAXN];
int End[MAXN];
int Left[MAXN];
int Right[MAXN];
int Count[MAXN];
int pos = 0;
int total;
int l, t, n;

int main()
{
	char cmd[3];
	int ls, rs, color, tmp;
	cin>>l>>t>>n;
	BuildTree (1, l);
	while (n--)
	{
		scanf ("%s", cmd);
		scanf ("%d%d", &ls, &rs);
		if (ls > rs)
		{
			tmp = ls;
			ls = rs;
			rs = tmp;
		}
		if (cmd[0] == 'C')
		{
			scanf ("%d", &color);
			Paint (ls, rs, color, 1);
		}
		else
		{
			total = 0;
			Calc (ls, rs, 1);
			GetRes (total);
		}
	}
	return 0;
}

void BuildTree (int a, int b)
{
	pos++;
	int v = pos;
	Begin[v] = a;
	End[v] = b;
	Count[v] = 1;
	if (b != a)
	{
		int mid = (b + a) / 2;
		Left[v] = pos + 1;
		BuildTree (a, mid);
		Right[v] = pos + 1;
		BuildTree (mid + 1, b);
	}
}

void Paint (int a, int b, int color, int index)
{
	Down (index);
	int mid = (Begin[index] + End[index]) / 2;
	if (a <= Begin[index] && b >= End[index])
	{
		Count[index] = color; 
	}
	else
	{
		if (Count[index] != color)
		{
			if (Count[index] != -1)
			{
				Count[Left[index]] = Count[index];
				Count[Right[index]] = Count[index];
				Count[index] = -1;			//mixed color
			}
		}
		if (a <= mid)
		{
			Paint (a, b, color, Left[index]);
		}
		if (b > mid)
		{
			Paint(a, b, color, Right[index]);
		}
		Combine (index);
	}
}

void Calc (int a, int b, int index)
{
	Down (index);
	int mid = (Begin[index] + End[index]) / 2;
	if (a <= Begin[index] && b >= End[index] && Count[index] != -1)
	{	
		total = (total | (1<<(Count[index] - 1)));
	}
	else
	{
		if (a <= mid)
		{
			Calc (a, b, Left[index]);
		}
		if (b > mid)
		{
			Calc (a, b, Right[index]);
		}
		Combine (index);
	}
}

void GetRes (int x)
{
	int res = 0;
	while (x > 0)
	{
		res += (x % 2);
		x /= 2;
	}
	cout<<res<<endl;
}

void Down (int index)
{
	if (Left[index] != 0)
	{
		if (Count[index] != -1)
		{
			Count[Left[index]] = Count[Right[index]] = Count[index];
		}
	}
}

void Combine (int index)
{
	if (Left[index] != 0)
	{
		if (Count[Left[index]] == Count[Right[index]] && Count[Left[index]])
		{
			Count[index] = Count[Left[index]];
		}
		else
		{
			Count[index] = -1;
		}
	}
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator