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

 #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. R语言基础(一) 可视化基础

    ##数据获取 x1=round(runif(100,min=80,max=100)) x2=round(rnorm(100,mean=80, sd=7)) x3=round(rnorm(100,mea ...

  2. JAVA面试题集之基础知识

                           JAVA面试题集之基础知识 基础知识:  1.C 或Java中的异常处理机制的简单原理和应用. 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就 ...

  3. C#二维数组及其本质(转)

    C#中二维数组包含两类:二维数组和数据矩阵.(这是我个人分类法,我认为比较能反映本质). 如上图,是二维数组,横向为第一维度,纵向为第二维度,不同维度可以有不同长度. 如果去掉元素7,那么上图也可能是 ...

  4. 源码编译安装MySQL 5.7.9

    安装CentOS 6.3 配置yum:[root@hank-yoon ~]# cd /etc/yum.repos.d/ [root@hank-yoon yum.repos.d]# mkdir a [r ...

  5. c语言调试接口

    http://blog.chinaunix.net/uid-10106787-id-2985587.html 在C语言程序设计中,常会出现各种各样的bug:段错误.参数异常等等.我们需要尽快定位错误, ...

  6. makefile教程网址

    http://www.cnblogs.com/wang_yb/p/3990952.html

  7. telnet 时代的 bbs

    人类曾经用telnet 来访问 bbs,后来有了www,web 浏览器取代了telnet Telnet协议是TCP/IP协议族中的一员 arp和ping的区别 ping也属于一个通信协议,是TCP/I ...

  8. 使用PHP计算上一个月的今天

    一日,遇到一个问题,求上一个月的今天. 最开始我们使用 strtotime(“-1 month”) 函数求值,发现有一个问题,月长度不一样的月份的计算结果有误. 比如:2011-03-31,得到的结果 ...

  9. iOS 进阶 第五天(0330)

    0330 cell的一些常见属性 设置cell右边指示器的类型 设置cell右边指示器的view cell的backgroundView和selectedBackgroundView cell的bac ...

  10. duilib中各控件响应的消息类型

    消息 说明 Sender click 鼠标点击 CButtonUI dropdown 下拉显示 CComboUI headerclick 点击列标题 CListHeaderItemUI itemact ...