依然不是十分理解……待考虑……

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> #define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1 using namespace std; const int MAXN = ; struct node
{
int num;
int lnode, rnode;
int root;
node(): num(), lnode(), rnode(), root(){ }
}; int root[ MAXN << ];
int num[ MAXN << ];
int lnode[ MAXN << ];
int rnode[ MAXN << ];
int all[ << ][ << ]; int GetRoot( int a )
{
if ( !a ) return ;
if ( a % ) return a % ;
return ;
} void init()
{
for ( int i = ; i < ( << ); ++i )
for ( int j = ; j < ( << ); ++j )
{
all[i][j] = ;
for ( int x = ; x < ; ++x )
if ( i & ( << x ) )
{
for ( int y = ; y < ; ++y )
if ( j & ( << y ) )
all[i][j] |= ( << GetRoot( x + y ) );
}
}
return;
} void PushUp( int rt )
{
int lc = rt << ;
int rc = rt << | ;
root[rt] = root[lc] | root[rc] | all[ rnode[lc] ][ lnode[rc] ];
num[rt] = all[ num[lc] ][ num[rc] ];
lnode[rt] = lnode[lc] | all[ num[lc] ][ lnode[rc] ];
rnode[rt] = rnode[rc] | all[ num[rc] ][ rnode[lc] ];
return;
} void build( int l, int r, int rt )
{
if ( l == r )
{
int a;
scanf( "%d", &a );
a = GetRoot(a);
lnode[rt] = rnode[rt] = num[rt] = root[rt] = ( << a );
return;
} int m = ( l + r ) >> ;
build( lson );
build( rson );
PushUp( rt );
return;
} node Query( int L, int R, int l, int r, int rt )
{
if ( L <= l && r <= R )
{
node D;
D.root = root[rt];
D.lnode = lnode[rt];
D.rnode = rnode[rt];
D.num = num[rt];
return D;
} int m = ( l + r ) >> ; if ( R <= m ) return Query( L, R, lson );
else if ( L > m ) return Query( L, R, rson );
else
{
node LD, RD, D;
LD = Query( L, R, lson );
RD = Query( L, R, rson );
D.root = LD.root | RD.root | all[ LD.rnode ][ RD.lnode ];
D.num = all[ LD.num ][ RD.num ];
D.lnode = LD.lnode | all[ LD.num ][ RD.lnode ];
D.rnode = RD.rnode | all[ RD.num ][ LD.rnode ];
return D;
}
} int main()
{
init();
int T, cas = ;
scanf( "%d", &T );
while ( T-- )
{
int n;
scanf( "%d", &n );
build( , n, ); int Q;
scanf( "%d", &Q );
printf( "Case #%d:\n", ++cas );
while ( Q-- )
{
int a, b;
scanf( "%d%d", &a, &b );
node ans = Query( a, b, , n, ); int cnt = ;
bool first = false;
for ( int i = ; i >= && cnt < ; --i )
if ( ans.root & ( << i ) )
{
if ( first ) putchar(' ');
printf( "%d", i );
first = true;
++cnt;
}
for ( ; cnt < ; ++cnt ) printf(" -1");
puts("");
} if ( T ) puts("");
}
return ;
}

HDU 4351 Digital root 线段树区间合并的更多相关文章

  1. HDU 6638 - Snowy Smile 线段树区间合并+暴力枚举

    HDU 6638 - Snowy Smile 题意 给你\(n\)个点的坐标\((x,\ y)\)和对应的权值\(w\),让你找到一个矩形,使这个矩阵里面点的权值总和最大. 思路 先离散化纵坐标\(y ...

  2. hdu 3397 Sequence operation (线段树 区间合并 多重标记)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意: 给你一串01串,有5种操作 0. 区间全部变为0 1.区间全部变为1 2.区间异或 3.询问 ...

  3. HDU 5316——Magician——————【线段树区间合并区间最值】

    Magician Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  4. hdu 4453 约会安排(线段树区间合并)

    约会安排 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  5. HDU 1540 Tunnel Warfare 线段树区间合并

    Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...

  6. (简单) HDU 3308 LCIS,线段树+区间合并。

    Problem Description Given n integers. You have two operations: U A B: replace the Ath number by B. ( ...

  7. hdu 3308 LCIS(线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3308 LCIS Time Limit: 6000/2000 MS (Java/Others)     ...

  8. hdu 1540 Tunnel Warfare 线段树 区间合并

    题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...

  9. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

随机推荐

  1. [Java][RCP] 引入第三方jar包时出错: XXXcannot be found XXX

    为什么会这样? 下面的博客有介绍,不在累赘 http://dengmin.iteye.com/blog/260585 这些博客貌似忘掉了一点,或者是我本地的Eclipse新建的项目Version不够高 ...

  2. 如何正确理解深度学习(Deep Learning)的概念

    现在深度学习在机器学习领域是一个很热的概念,不过经过各种媒体的转载播报,这个概念也逐渐变得有些神话的感觉:例如,人们可能认为,深度学习是一种能够模拟出人脑的神经结构的机器学习方式,从而能够让计算机具有 ...

  3. phpstrom 7.0 序列号

    phpstrom 7.0 用户名 www.goipc.cn license key 13748-1204201000001dZdtN0KxZbl8zNH8RHFCz9t"gjKv9yXf2c ...

  4. iOS中使用自定义字体

    1.确定你的项目工程的Resources下有你要用的字体文件(.ttf或者.odf). 2.然后在你的工程的Info.plist文件中新建一行,添加key为:UIAppFonts,类型为Array或D ...

  5. cocos2dx中创建动画的三种方法

    1.最最原始的方法,先创建动画帧,再创建动画打包(animation),再创建动画(animate) 第一步: 创建动画帧:CCSpriteFrame,依赖于原始的资源图片(xx.png,xx.jpg ...

  6. NodeJS -Express 4.0 用include取代partial

    在Express 4.0 下按如下方法设置: (1)运行cmd 输入:npm install express-partials -g (2)下载成功后.在app.js 中引用此插件   var par ...

  7. execute、executeUpdate、executeQuery三者的区别(及返回值)

    1. ResultSet executeQuery(String sql); 执行SQL查询,并返回ResultSet 对象. 2.int executeUpdate(String sql); 可执行 ...

  8. mysql安装篇

    装了vps,环境又要自己配置.mysql比较难装上. 1.安装MySQL 5.5.x的yum源:rpm -Uvh http://repo.webtatic.com/yum/centos/5/lates ...

  9. 1891: 丘比特的烦恼 - BZOJ

    Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭.于是 ...

  10. text-align:justify实现文本两端对齐布局,兼容IE

    要想更好的理解 css, 尤其是 IE 下对 css 的渲染,haslayout 是一个非常有必要彻底弄清楚的概念.大多 IE下的显示错误,就是源于 haslayout. 什么是 haslayout ...