这个题目  其实可以暴力  用两个 set 合并; 每次放进去一个元素只要找到这个元素第一个比他大的元素和最后一个比他小的元素;然后更新最优值;

证明为什么不会超时;  假如最后集合的小的为 S1,大的集合为S2; 这样将 S1合并到S2; 这样S2 》= S1×2;合并 t 次后 大小就成了 S1×(2^t); 但是集合大小只有N 个元素  也就是说  N 》= S1×(2^t ); 但S1等于1时 也就是说一个元素最多合并t 《= log(N) 次;

 #include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
using namespace std; struct date{
int v,next;
}edge[]; int N,M,total,head[];
void add_edge( int u,int v ){
edge[total].v = v;
edge[total].next = head[u];
head[u] = total++;
}
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
set<int>s[]; int res[]; int tab[];
int dfs( int sta )
{
bool fell = false; bool fall = false; int ans = ;
for( int i = head[sta]; i != -; i = edge[i].next )
{
int v = edge[i].v; ans = min( ans,dfs( v ) ); set<int>::iterator it,now;
if( !fell ){ tab[sta] = tab[v]; res[sta] = ; fell = true; continue; }
int len1 = s[tab[sta]].size(); int len2 = s[tab[v]].size();
if( len1 > len2 ){
for( it = s[tab[v]].begin(); it != s[tab[v]].end(); it++ )
{
now = s[tab[sta]].lower_bound(*it);
if( now != s[tab[sta]].end() ){ ans = min( ans,*now-*it ); }
if( now != s[tab[sta]].begin() ){ now--;ans = min( ans,*it-*now ); }
if( s[tab[sta]].find(*it) == s[tab[sta]].end() ) s[tab[sta]].insert(*it);
}
}else {
for( it = s[tab[sta]].begin(); it != s[tab[sta]].end(); it++ )
{
now = s[tab[v]].lower_bound(*it);
if( now != s[tab[v]].end() ){ ans = min( ans,*now-*it ); }
if( now != s[tab[v]].begin() ){ ans = min( ans,*it-*(--now) ); }
if( s[tab[v]].find(*it) == s[tab[v]].end() )s[tab[v]].insert(*it);
}
tab[sta] = tab[v];
}
}
res[sta] = ans; return ans;
}
int main( )
{
while( scanf("%d%d",&N,&M) != EOF )
{
for( int i = ; i <= N; i++ )s[i].clear();
for( int i = ; i <= N; i++ )tab[i] = i;
total = ; int k = N-M+; memset( head,-,sizeof(head) );
for( int i = ; i <= N ;i++ ){
int v; scanf("%d",&v);
add_edge( v,i );
}
for( int i = ; i <= M; i++ ){
int num; scanf("%d",&num); s[k++].insert(num);
}
dfs( );
printf("%d",res[]);
for( int i = ; i <= N-M; i++ )
printf(" %d",res[i]);
puts("");
}
return ;
}

SGU 507 Treediff的更多相关文章

  1. SGU - 507 启发式合并维护平衡树信息

    题意:给定一颗树,每个叶子节点\(u\)都有权值\(val[u]\),求每个非叶子节点子树的最小叶子距离,若该子树只有一个叶子节点,输出INF 貌似本来是一道树分治(并不会)的题目,然而可以利用平衡树 ...

  2. SGU 495. Kids and Prizes

    水概率....SGU里难得的水题.... 495. Kids and Prizes Time limit per test: 0.5 second(s)Memory limit: 262144 kil ...

  3. ACM: SGU 101 Domino- 欧拉回路-并查集

    sgu 101 - Domino Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Desc ...

  4. 【SGU】495. Kids and Prizes

    http://acm.sgu.ru/problem.php?contest=0&problem=495 题意:N个箱子M个人,初始N个箱子都有一个礼物,M个人依次等概率取一个箱子,如果有礼物则 ...

  5. SGU 455 Sequence analysis(Cycle detection,floyd判圈算法)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=455 Due to the slow 'mod' and 'div' operati ...

  6. SGU 422 Fast Typing(概率DP)

    题目大意 某人在打字机上打一个字符串,给出了他打每个字符出错的概率 q[i]. 打一个字符需要单位1的时间,删除一个字符也需要单位1的时间.在任意时刻,他可以花 t 的时间检查整个打出来的字符串,并且 ...

  7. sgu 104 Little shop of flowers 解题报告及测试数据

    104. Little shop of flowers time limit per test: 0.25 sec. memory limit per test: 4096 KB 问题: 你想要将你的 ...

  8. 树形DP求树的重心 --SGU 134

    令一个点的属性值为:去除这个点以及与这个点相连的所有边后得到的连通分量的节点数的最大值. 则树的重心定义为:一个点,这个点的属性值在所有点中是最小的. SGU 134 即要找出所有的重心,并且找出重心 ...

  9. SGU 170 Particles(规律题)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=170 解题报告:输入两个由'+'和'-'组成的字符串,让你判断第二个串能不能由第一个 ...

随机推荐

  1. Web层辅助工具类

    Java web开发中经常用到的一些方法: import java.io.BufferedReader; import java.net.InetAddress; import java.net.Un ...

  2. Apache 源码包安装

    系统:Centos 7.4 服务:Apache 2.4.33.apr 1.5.2.apr-util 1.5.4 依赖包: pcre.x86_64 pcre-devel.x86_64 openssl.x ...

  3. Go语言学习之数据类型以及类型转换(The way to go)

    生命不止,继续go go go 介绍来go中的变量和常量,今天介绍一下go中的基本类型. 可以分为四大类,现在一点点道来. Boolean Types 布尔类型,不用过多介绍来吧,就是true和fal ...

  4. menubar下面的选项不可以输入中文

    这是一个QT5的bug. 1.不用中文,使用英文: 2.先输入中文,然后在属性Action里面的text里改成中文.

  5. Hibernate多对多关系映射

    两张表的多对多关系,在数据库中通常是通过第三张中间表来实现的,第三张中间表放的是两张表各自的主键值,通过主键与主键的对应来体现表直接的关系.比如在权限系统中,一个用户可以拥有多种权限,而一种权限也可以 ...

  6. Graph_Master(连通分量_A_双连通分量+桥)

    hdu 5409 题目大意:给出一张简单图,求对应输入的m条边,第i-th条边被删除后,哪两个点不连通(u,v,u<v),若有多解,使得u尽量大的同时v尽量小. 解题过程:拿到题面的第一反应缩点 ...

  7. Hibernate常见优化策略

    ① 制定合理的缓存策略(二级缓存.查询缓存). ② 采用合理的Session管理机制. ③ 尽量使用延迟加载特性. ④ 设定合理的批处理参数. ⑤ 如果可以,选用UUID作为主键生成器. ⑥ 如果可以 ...

  8. Sudoku Solver, 求数独

    问题描述:填充数独表中空元素.空元素为'.' 算法分析:没填充一个数,都要看这个数所在的行,列,小矩阵是否合法.然后还要看整个数独表是否正确,而判断整个数独表只能通过递归,因为前一个结果的判断要依赖后 ...

  9. ZC_01_获取Class对象

    1. package reflectionZ; public class TreflectionZ { public static void main(String[] args) throws Cl ...

  10. ToggleButton开关状态按钮控件

    ToggleButton开关状态按钮控件 一.简介 1. 2.ToggleButton类结构 父类是CompoundButton,引包的时候注意下 二.ToggleButton开关状态按钮控件使用方法 ...