POJ2201+RMQ
/*
RMQ
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
const int maxn = ;
struct Node{
int ki,ai,id;
}node[ maxn ];
int dp[ maxn ][ ];
int bit[ ];
int ans[ maxn ][ ]; void init(){
memset( ans,,sizeof( ans ) );
bit[] = ;
for( int i=;i<;i++ )
bit[ i ] = bit[ i- ]*;
return ;
} int cmp( Node a,Node b ){
return a.ki<b.ki;
} void ST( int n ){
int K = (int)(log( 1.0*n )/log( 2.0 ));
for( int i=;i<=n;i++ )
dp[ i ][ ] = i;//存储着i,j之间ai值最小的位置
for( int j=;j<=K;j++ ){
for( int i=;i<=n-bit[j]+;i++ ){
if( node[ dp[i][j-] ].ai<node[ dp[i+bit[j-]][j-] ].ai )
dp[ i ][ j ] = dp[i][j-];
else
dp[ i ][ j ] = dp[i+bit[j-]][j-];
}
}
} int RMQ( int l,int r ){
int k = (int)(log((+r-l)*1.0)/log(2.0));
if( node[ dp[l][k] ].ai<node[ dp[r-bit[k]+][k] ].ai ) return dp[l][k];
else return dp[r-bit[k]+][k];
} int solve( int fa,int l,int r ){
if( l>r ) return ;
int pos = RMQ( l,r );
int id = node[pos].id;
ans[ id ][ ] = fa;
ans[ id ][ ] = solve( id,l,pos- );
ans[ id ][ ] = solve( id,pos+,r );
return id;
} int main(){
int n;
init();
while( scanf("%d",&n)!=EOF ){
for( int i=;i<=n;i++ ){
scanf("%d%d",&node[i].ki,&node[i].ai);
node[i].id = i;
}
sort( node+,node+n+,cmp );
ST( n );
solve( ,,n );
puts("YES");
for( int i=;i<=n;i++ ){
printf("%d %d %d\n",ans[i][],ans[i][],ans[i][]);
}
}
return ;
}
改变了dp中存储的内容
/*
RMQ
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
const int maxn = ;
struct Node{
int ki,ai,id;
}node[ maxn ];
int dp[ maxn ][ ];
int bit[ ];
int ans[ maxn ][ ];
int Ai[ ];
const int MAX = ; void init(){
memset( ans,,sizeof( ans ) );
bit[] = ;
for( int i=;i<;i++ )
bit[ i ] = bit[ i- ]*;
return ;
} int cmp( Node a,Node b ){
return a.ki<b.ki;
} void ST( int n ){
int K = (int)(log( 1.0*n )/log( 2.0 ));
for( int i=;i<=n;i++ )
dp[ i ][ ] = node[i].ai;//存储着i,j之间ai值最小的位置
for( int j=;j<=K;j++ ){
for( int i=;i<=n-bit[j]+;i++ ){
dp[ i ][ j ] = min( dp[i][j-],dp[i+bit[j-]][j-]);
}
}
} int RMQ( int l,int r ){
int k = (int)(log((+r-l)*1.0)/log(2.0));
int value = min( dp[l][k],dp[r-bit[k]+][k] );
return Ai[ value+MAX ];
} int solve( int fa,int l,int r ){
if( l>r ) return ;
int pos = RMQ( l,r );
int id = node[pos].id;
ans[ id ][ ] = fa;
ans[ id ][ ] = solve( id,l,pos- );
ans[ id ][ ] = solve( id,pos+,r );
return id;
} int main(){
int n;
init();
while( scanf("%d",&n)!=EOF ){
for( int i=;i<=n;i++ ){
scanf("%d%d",&node[i].ki,&node[i].ai);
node[i].id = i;
//Ai[ node[i].ai ] = i;
}
sort( node+,node+n+,cmp );
for( int i=;i<=n;i++ )
Ai[ node[i].ai+MAX ] = i;
ST( n );
solve( ,,n );
puts("YES");
for( int i=;i<=n;i++ ){
printf("%d %d %d\n",ans[i][],ans[i][],ans[i][]);
}
}
return ;
}
POJ2201+RMQ的更多相关文章
- BZOJ 3489: A simple rmq problem
3489: A simple rmq problem Time Limit: 40 Sec Memory Limit: 600 MBSubmit: 1594 Solved: 520[Submit] ...
- UVA 11235Frequent values(RMQ)
训练指南P198 题意:给出一个非降序排列的整数数组a1, a2…… an,你的任务是对于一系列询问(i,j),回答ai, ai+1 ……aj 中出现的次数最多的次数 这题不仅学到了rmq的应用还学到 ...
- 51nod1174(RMQ)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1174 题意:中文题诶- 思路:RMQ模板题 关于RMQ: h ...
- 2016 ACM/ICPC Asia Regional Dalian Online 1008 Function 二分+RMQ
Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...
- Gym 100646 F Tanks a Lot RMQ
Problem F: Tanks a Lot Imagine you have a car with a very large gas tank - large enough to hold what ...
- (RMQ版)LCA注意要点
inline int lca(int x,int y){ if(x>y) swap(x,y); ]][x]]<h[rmq[log[y-x+]][y-near[y-x+]+]])? rmq[ ...
- 洛谷P2412 查单词 [trie树 RMQ]
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...
- POJ3368Frequent values[RMQ 游程编码]
Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17581 Accepted: 6346 ...
- [tem]RMQ(st)
倍增思想 代码中有两个测试 #include <iostream> #include <cmath> using namespace std; const int N=1e5; ...
随机推荐
- 结果集一组数据的第几条ROW_NUMBER基本用法
因为项目中用到,今天来记录下 ROW_NUMBER的用法. 说明:返回结果集分区内行的序列号,每个分区的第一行从 1 开始. 语法:ROW_NUMBER () OVER ([ <partitio ...
- openvswitch安装和使用 --修订通用教程的一些错误
1.下载openvswitch源文件,注意版本要适合操作系统内核. 推荐openvswitch2.0及其以上版本. 2.开始安装openvswitch cd openvswitch sudo ./bo ...
- ASP.NET MVC模型绑定的6个建议(转载)
ASP.NET MVC模型绑定的6个建议 发表于2011-08-03 10:25| 来源博客园| 31 条评论| 作者冠军 validationasp.netmvc.netasp 摘要:ASP.NET ...
- java_集合框架
一.集合框架图 二.Collection接口 Collection中可以存储的元素间无序,可以重复的元素. Collection接口的子接口List和Set,Map不是Collecti ...
- eNSP
L2交换机 sysvlan 200q interface Vlanif 200ip address 192.168.0.1 24dis thisq interface Ethernet 0/0/1po ...
- 百练_4120 硬币(DP)
描述 宇航员Bob有一天来到火星上,他有收集硬币的习惯.于是他将火星上所有面值的硬币都收集起来了,一共有n种,每种只有一个:面值分别为a1,a2… an. Bob在机场看到了一个特别喜欢的礼物,想买来 ...
- Pulltorefresh使用中碰到的问题
第一 在使用XScrollView布局是,无法在该布局.xml文件,放置内容布局控件,假如放置了会报错, <com.markmao.pulltorefresh.widget.XScrollVie ...
- STL 常见容器
vector: 是一种在结尾处高效插入.删除的容器,本质上是一个动态数组,可以自动维护数组的空间分配.它也允许在开头和中间插入.删除数据,但是效率极低. <span style="fo ...
- UniqueID,页面子控件唯一标示
aspx: <form id="form1" runat="server"> <asp :Repeater ID="MyDa ...
- NpoiUtil
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...