HDU 4351 Digital root 线段树区间合并
依然不是十分理解……待考虑……
#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 线段树区间合并的更多相关文章
- HDU 6638 - Snowy Smile 线段树区间合并+暴力枚举
HDU 6638 - Snowy Smile 题意 给你\(n\)个点的坐标\((x,\ y)\)和对应的权值\(w\),让你找到一个矩形,使这个矩阵里面点的权值总和最大. 思路 先离散化纵坐标\(y ...
- hdu 3397 Sequence operation (线段树 区间合并 多重标记)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意: 给你一串01串,有5种操作 0. 区间全部变为0 1.区间全部变为1 2.区间异或 3.询问 ...
- HDU 5316——Magician——————【线段树区间合并区间最值】
Magician Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- hdu 4453 约会安排(线段树区间合并)
约会安排 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- HDU 1540 Tunnel Warfare 线段树区间合并
Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...
- (简单) HDU 3308 LCIS,线段树+区间合并。
Problem Description Given n integers. You have two operations: U A B: replace the Ath number by B. ( ...
- hdu 3308 LCIS(线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3308 LCIS Time Limit: 6000/2000 MS (Java/Others) ...
- hdu 1540 Tunnel Warfare 线段树 区间合并
题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
随机推荐
- ActiveMQ之jmscorrelationid与selector
前面讲过JMSCorrelationID主要是用来关联多个Message,例如需要回复一个消息的时候,通常把回复的消息的JMSCorrelationID设置为原来消息的ID.在下面这个例子中,创建了三 ...
- 为什么C/C++语言使用指针
这是参加面试时,面试官问的一道开放性题目. 问题是:为什么C/C++语言使用指针? 这个问题一问出来,直接被面试官秒杀了,面试官大神,你怎么不按套路出牌啊? 说好的malloc和new的区别呢?说好的 ...
- 【nodejs】json value出现 undefined 将会无法解析 问题来了
如果 value 的值就要 undefined 怎处理呢?
- phpstrom 7.0 序列号
phpstrom 7.0 用户名 www.goipc.cn license key 13748-1204201000001dZdtN0KxZbl8zNH8RHFCz9t"gjKv9yXf2c ...
- Careercup - Facebook面试题 - 6204973461274624
2014-05-02 02:28 题目链接 原题: I/P: N, k O/P: all subset of N with exactly K elements. eg: I/p: N = , K = ...
- 自己的一些 Demo,源码链接
1.指纹解锁(GitHub). 2.JS 与 OC 交互(GitHub). 3.模仿 HTML 下拉菜单(GitHub). 4.OC开发常用类目(GitHub).
- maven学习心得整理
maven的学习心得 已经接触了maven项目有一段时间了,开始时仅仅会使用,在使用中发现了它的强大和方便,于是决心研究一下: 首先,普及一下maven参数: -D:传入属性参数 -P:使用POM中指 ...
- mysql myisam
.frm .myd .myi insert delayted show variables like '%delayed%' lock read, write, read local pointer ...
- mysql数据恢复
[1] 当数据库被删除后的恢复方法 首先建立一个测试用的数据库. mysql -u root -p123123 ← 用root登录到MySQL服务器 Enter password: ← ...
- java递归查询方法
一.需求 项目里要让用户能够设置所选择教材的章课节,以针对章课节提供相应的题目供用户做题. 设计:用户设置了教材后,首次登录,进行章节设置时.默认为用户选择第一章.第一课.第一节. 思路:用户访问页面 ...