POJ 1470 & zoj 1141

被卡RE好久,原因是数组开的不够大

利用RMQ在线算法求解LCA,但是目前不知道为何POJ AC,but ZOJ TLE

ZOJ问题已修正,关于询问部分,输入格式与POJ不同,需要处理逗号

// use LCA->RMQ
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int maxn= 9e2+3;

vector > fa;
int elsq[maxn<<1], depth[maxn<<1];
int fst[maxn];
int ST[maxn<<1][33];
int len;
int ans[maxn], dad[maxn];

void dfs(int u, int d)
{
	depth[u]= d;
	fst[u]= len;
	elsq[len++]= u;
	for (int i= 0; i< int(fa[u].size()); ++i){
		dfs(fa[u][i], d+1);
		elsq[len++]= u;
	}
}
inline int m_min(int a, int b)
{
	return depth[a] < depth[b] ? a : b;
}
void RMQ(void)
{
	int k= floor(log(len+0.0)/log(2.0));
	for (int i= 0; i< len; ++i){
		ST[i][0]= elsq[i];
	}
	for (int j= 1; j<= k; ++j){
		int step= 1<<(j-1), ub= len+1-(1< r){
		swap(l, r);
	}	
	int k= floor(log(r-l+1.0)/log(2.0));
	return m_min(ST[l][k], ST[r-(1<

ZOJ

// use LCA->RMQ
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int maxn= 9e2+3;

vector > fa;
int elsq[maxn<<1], depth[maxn<<1];
int fst[maxn];
int ST[maxn<<1][33];
int len;
int ans[maxn], dad[maxn];

void dfs(int u, int d)
{
	depth[u]= d;
	fst[u]= len;
	elsq[len++]= u;
	for (int i= 0; i< int(fa[u].size()); ++i){
		dfs(fa[u][i], d+1);
		elsq[len++]= u;
	}
}
inline int m_min(int a, int b)
{
	return depth[a] < depth[b] ? a : b;
}
void RMQ(void)
{
	int k= floor(log(len+0.0)/log(2.0));
	for (int i= 0; i< len; ++i){
		ST[i][0]= elsq[i];
	}
	for (int j= 1; j<= k; ++j){
		int step= 1<<(j-1), ub= len+1-(1< r){
		swap(l, r);
	}	
	int k= floor(log(r-l+1.0)/log(2.0));
	return m_min(ST[l][k], ST[r-(1<

你可能感兴趣的:(POJ 1470 & zoj 1141)