poj 2201 构造
这个题目的构造方法应该还算是很好想的,先给a按照从小到大排序,然后按顺序插入数据,构造一棵二叉查找树,而且50000的数据,nlogn的做法,应该还是很好的。不过这个题目的编码比想象中要麻烦一点,并且编码完成后居然返回了一个tle。
表示不能理解,生成了一个大数据后,发现如果排序后k也有序,那么就会二叉树退化,n*n的复杂度。简单画画图可以找到一个优化,先找要插入数据的后继或者前驱,然后从哪个位置开始插入,那么可以大大稳定复杂度。找这个东西的工作就交给set来完成即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
const int maxn=5e4+9;
int lon,f[maxn];
struct D
{
int a,k,id;
bool operator <(const D & xx) const
{
return k<xx.k;
}
}data[maxn]; bool cmp(const D &p,const D &q)
{
return p.a<q.a;
} struct
{
int l,r,id,fa;
}tr[maxn]; set <D> s;
int maxm;
void insert(int t)
{
// cout<<t<<endl;
int root;
if(t!=1)
{
if(data[t].k>data[maxm].k)
{
root=f[data[maxm].id];
maxm=t;
}
else root=f[s.lower_bound(data[t])->id];
}
else
{
root=1;
maxm=1;
}
while(tr[root].id!=0)
{
// cout<<root<<endl;
if(data[t].k<data[tr[root].id].k)
{
if(tr[root].l==0)
{
tr[root].l=++lon;
tr[lon].fa=root;
}
root=tr[root].l;
}
else
{
if(tr[root].r==0)
{
tr[root].r=++lon;
tr[lon].fa=root;
}
root=tr[root].r;
}
}
tr[root].id=t;
f[data[t].id]=root;
s.insert(data[t]);
} int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d %d",&data[i].k,&data[i].a);
data[i].id=i;
}
sort(data+1,data+1+n,cmp);
memset(tr,0,sizeof(tr));
lon=1;
for(int i=1;i<=n;i++)
insert(i);
printf("YES\n");
for(int i=1;i<=n;i++)
{
printf("%d %d %d\n",data[tr[tr[f[i]].fa].id].id,data[tr[tr[f[i]].l].id].id,data[tr[tr[f[i]].r].id].id);
}
}
return 0;
}
poj 2201 构造的更多相关文章
- POJ 2201 Cartesian Tree ——笛卡尔树
[题目分析] 构造一颗笛卡尔树,然后输出这棵树即可. 首先进行排序,然后用一个栈维护最右的树的节点信息,插入的时候按照第二关键字去找,找到之后插入,下面的树成为它的左子树即可. 然后插入分三种情况讨论 ...
- Matrix Power Series(POJ 3233 构造新矩阵求解+ 快速矩阵幂)
题目大意:给定A,k,m(取模),求解S = A + A2 + A3 + … + Ak. 思路:此题为求解幂的和,一开始直接一个个乘,TLE.时间消耗在累加上.此处巧妙构造新矩阵 p= A 0 ...
- POJ 2396 构造矩阵(上下流)
题意: 要求构造一个矩阵,给你行和,列和,还有一些点的上下范围,输出一个满足题意的矩阵. 思路: 这个题目很经典,这是自己看上下流后接触的第一道题,感觉很基础的一道题目,现在我 ...
- poj 2166 构造
一个看了解题报告才能想明白的题目,第一点比较容易想明白,就是每次把1交换到堆顶之后如果能够换到最后面的位置那么一定是最优的,但是怎么实现这个没有想明白. 题解的那种构建方法,及从2开始插入,是可以保证 ...
- Day6 - J - Cartesian Tree POJ - 2201
Let us consider a special type of a binary search tree, called a cartesian tree. Recall that a binar ...
- poj 3735 Training little cats(构造矩阵)
http://poj.org/problem?id=3735 大致题意: 有n仅仅猫,開始时每仅仅猫有花生0颗,现有一组操作,由以下三个中的k个操作组成: 1. g i 给i仅仅猫一颗花生米 2. e ...
- POJ 1776 Task Sequences(竞赛图构造哈密顿通路)
链接:http://poj.org/problem?id=1776 本文链接:http://www.cnblogs.com/Ash-ly/p/5458635.html 题意: 有一个机器要完成一个作业 ...
- POJ 2778:DNA Sequence(AC自动机构造矩阵)
http://poj.org/problem?id=2778 题意:有m个病毒DNA,问构造一个长度为n的不带病毒DNA的字符串可以有多少种. 思路:看到这题有点懵,想了挺久题解的思路. 使用AC自动 ...
- 构造 + 离散数学、重言式 - POJ 3295 Tautology
Tautology Description WFF 'N PROOF is a logic game played with dice. Each die has six faces represen ...
随机推荐
- 怎样制作一个相似Tiny Wings的游戏 Cocos2d-x 2.1.4
在第一篇<怎样使用CCRenderTexture创建动态纹理>基础上,添加�创建动态山丘,原文<How To Create A Game Like Tiny Wings with C ...
- ASP.NET - 匹配标签中的内容
string str = @"<td>Csdn</td>\r\n<td>V1.0</td>\r\n<td>2014-10-23&l ...
- sql: PL/SQL proc
A PL/SQL block has the following structure: [DECLARE declaration_statements ] BEGIN executable_state ...
- phpcms 列表页中,如何调用其下的所有子栏目(或特定的子栏目)?
{pc:get sql="select * from phpcms_category where catid in(你的子栏目ID)" return="data" ...
- JQuery Ajax实例总结
jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对 ...
- Android开源框架AsyncHttpClient (android-async-http)使用
android-async-http 开源框架可以使我们轻松地获取网络数据或者向服务器发送数据,最关键的是,它是异步框架,在底层使用线程池处理并发请求,效率很高,使用又特别简单. 以往我们在安卓上做项 ...
- redhat6.3 jfreechar中文乱码解决途径
最近使用到jfreechar的项目,在转移到linux上面时出现中文乱码(中文被显示为框框),网上查了一些资料,结合自身系统的特性,总结了一种安装字体的方式.在说字体安装之前首先上个测试的代码吧:we ...
- Swift - 数字格式化转成字符串(保留两位小数)
1,下面是一个浮点类型的数字转成String字符串的例子 1 2 var f = 123.32342342 var s:String = "\(f)" //123.32342342 ...
- pc2日记——有惊无险的第二天2014/08/29
今天下午如期的用pc2进行了第二场比赛.因为昨天的出错经历和早上充足的准备,下午的比赛尽管在開始的时候出了点小小的问题,但总的来说还是非常成功的. 早上八点过去504開始又一次配置client,由于开 ...
- ConnectivityManager
ConnectivityManager 主要管理网络连接的相关的类它主要负责的是1 监视网络连接状态 包括(Wi-Fi, GPRS, UMTS, etc)2 当网络状态改变时发送广播通知3 当网络连接 ...