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

 #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. SQLserver关于教学楼中教室在某个时间段是否被占用的数据库设计

    需求:关于教学楼中教室在周几某个时间段是否被占用的数据库设计 具体代码如下: -------------------教学楼维度 CREATE TABLE TeacBuild ( tbID int no ...

  2. 如何在LINUX VPS上安装VPN详细步骤

    在vps上安装vpn是个难点,很多朋友都不会,这儿结合一位朋友的安装经验做下介绍.注意你的vps要安装做vpn使用,一定要注意你的流量限制,使用Vpn上游戏上youtube看视频等都比较耗费资源,否则 ...

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

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

  4. UAP如何根据DeviceFamily显示不同的页面

    背景 微软推出UAP 推荐使用响应式的UI,但是难免遇到一些特殊情况需要使用不同的Page来在不同的设备显示. 微软目前最新的VS2015在10074上安装后能够支持这个功能特性,只是暂时没有文档介绍 ...

  5. 百度地图API使用

    1.引用js脚本 <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&am ...

  6. JSON-JObject

    http://james.newtonking.com/json/help/index.html http://www.cnblogs.com/usharei/archive/2012/04/24/2 ...

  7. mysql innodb 引擎

    innodb 引擎 一.概述 InnoDB 是一个用的比较广泛的存储引擎,因为它支持事物和外键,还有不错的效率;我们先看看官方教程怎么说; 我们先读一下, 对于上面的文档, 对一个InnoDB的表首先 ...

  8. 文本编辑器 markdown

    http://www.cnblogs.com/youxia/p/linux014.html markdown对数学公式的支持http://www.linuxidc.com/Linux/2014-08/ ...

  9. HDU 5629 Clarke and tree dp+prufer序列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=562 题意: 求给每个节点的度数允许的最大值,让你求k个节点能组成的不同的生成树个数. 题解: 对于n ...

  10. C++文件操作之 seekg/seekp/tellg/tellp

    问题描述: C++文件操作之 tellg/tellp/seekg/seekp 的使用 问题解决: (1)seekg/tellg/seekp/tellp 使用 tellp用于ostream调用,用来&q ...