HDU 4358 Boring counting 树状数组+思路
研究了整整一天orz……直接上官方题解神思路

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <algorithm> using namespace std; const int MAXN = ; struct node
{
int v, next;
}; struct subTree
{
int st, ed;
}; struct Queryy
{
int i;
int st, ed;
}; int N, K, Q;
int EdgeN, TimeFlag;
node D[MAXN]; //树节点
int C[MAXN]; //树状数组
int head[MAXN];
subTree tree[MAXN]; //子树映射成线性序列之后对应的区间
Queryy qry[MAXN]; //查询信息
int weight[MAXN], addr[MAXN];
int ans[MAXN];
vector<int> pos[MAXN]; void AddEdge( int u, int v )
{
D[EdgeN].v = v;
D[EdgeN].next = head[u];
head[u] = EdgeN++;
return;
} void DFS( int cur ) //树形结构转线性结构
{
tree[ cur ].st = ++TimeFlag;
addr[ TimeFlag ] = weight[ cur ];
for ( int i = head[cur]; i != -; i = D[i].next )
DFS( D[i].v );
tree[cur].ed = TimeFlag;
return;
} int lowbit( int x )
{
return (-x) & x;
} void add( int x, int val )
{
while ( x <= N )
{
C[x] += val;
x += lowbit(x);
}
return;
} int query( int x )
{
int res = ;
while ( x > )
{
res += C[x];
x -= lowbit(x);
}
return res;
} bool cmp( int a, int b )
{
return weight[a] < weight[b];
} void init() //将weight离散化
{
sort( addr + , addr + N + , cmp ); int cnt = , pre = -;
for ( int i = ; i <= N; ++i )
{
if ( weight[ addr[i] ] != pre )
pre = weight[ addr[i] ], weight[ addr[i] ] = ++cnt;
else weight[ addr[i] ] = cnt;
}
return;
} bool cmp2( Queryy a, Queryy b )
{
return a.ed < b.ed;
} void solved()
{
for ( int i = ; i <= N; ++i ) pos[i].clear(); sort( qry, qry + Q, cmp2 );
int cur = ;
for ( int i = ; i <= N; ++i )
{
int val = addr[i];
pos[val].push_back(i);
int sz = pos[val].size();
if ( sz == K )
add( pos[val][ sz - K ], );
else if ( sz > K )
{
add( pos[val][ sz - K ], );
add( pos[val][ sz - K - ], - );
}
//printf( "ed = %d\n", qry[cur].ed );
while ( cur < Q && qry[cur].ed == i )
{
int id = qry[cur].i;
ans[id] = query( qry[cur].ed ) - query( qry[cur].st - );
// printf("ans[%d] = %d\n", id, ans[id] );
++cur;
}
}
return;
} int main()
{
int T, cas = ;
scanf( "%d", &T );
while ( T-- )
{
memset( head, -, sizeof( head ) );
memset( C, , sizeof(C) ); scanf( "%d%d", &N, &K );
for ( int i = ; i <= N; ++i )
{
scanf( "%d", &weight[i] );
addr[i] = i;
}
init(); EdgeN = ; for ( int i = ; i < N; ++i ) //建树
{
int u, v;
scanf( "%d%d", &u, &v );
AddEdge( u, v );
} TimeFlag = ;
DFS(); //树形结构转线性结构 scanf( "%d", &Q );
printf( "Case #%d:\n", ++cas );
for ( int i = ; i < Q; ++i )
{
int u;
scanf( "%d", &u );
qry[i].i = i;
qry[i].st = tree[u].st;
qry[i].ed = tree[u].ed;
// printf( "%d %d\n", qry[i].st, qry[i].ed );
}
solved();
for ( int i = ; i < Q; ++i )
printf( "%d\n", ans[i] ); if ( T ) puts("");
}
return ;
}
HDU 4358 Boring counting 树状数组+思路的更多相关文章
- HDU 4638 Group 树状数组 + 思路
实际上就是问这个区间编号连续的段的个数,假如一个编号连续的段有(a+b)个人,我把他们分在同一组能得到的分值为(a+b)^2,而把他们分成人数为a和b的两组的话,得到的分值就是a^2+b^2,显然(a ...
- HDU 4325 Flowers(树状数组+离散化)
http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:给出n个区间和m个询问,每个询问为一个x,问有多少个区间包含了x. 思路: 因为数据量比较多,所以需 ...
- HDU - 1541 Stars 【树状数组】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意 求每个等级的星星有多少个 当前这个星星的左下角 有多少个 星星 它的等级就是多少 和它同一 ...
- HDU 3333 | Codeforces 703D 树状数组、离散化
HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...
- HDU 3854 Glorious Array(树状数组)
题意:给一些结点,每个结点是黑色或白色,并有一个权值.定义两个结点之间的距离为两个结点之间结点的最小权值当两个结点异色时,否则距离为无穷大.给出两种操作,一种是将某个结点改变颜色,另一个操作是询问当前 ...
- hdu 4217 Data Structure? 树状数组求第K小
Data Structure? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)
题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...
- hdu 1541 Stars(树状数组)
题意:求坐标0到x间的点的个数 思路:树状数组,主要是转化,根据题意的输入顺序,保证了等级的升序,可以直接求出和即当前等级的点的个数,然后在把这个点加入即可. 注意:树状数组下标从1开始(下标为0的话 ...
- HDU 3333 Turing Tree (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...
随机推荐
- 用Python作GIS之三:入口程序 - stargui.py
"""gui start file for Space-Time Analysis of Regional Systems#STARS的图形用户界面入口(高级用户可以直接 ...
- 基于FPGA的线阵CCD图像测量系统研究——笔记
本文是对基于FPGA的线阵CCD图像测量系统研究(作者:高尚)的阅读笔记 第一章绪论 1. 读读看 读了前面的摘要依然没有看懂作者要做什么.接着往下读....终于看到了一个字眼“基于机器视觉的图像测量 ...
- .net speed up
Ngen.exe http://www.cnblogs.com/yukaizhao/archive/2011/11/07/how-to-use-ugen.html Merge.exe Merge dl ...
- Aspose 导出excel小demo
//转为pdf private void CelltoPDF(string cellPath, string pdfPath) { Workbo ...
- Log4Net学习【一】
如果项目上过线的话,那你一定知道Log是多么重要.为什么说Log重要呢?因为上线项目不允许你调试,你只能通过Log来分析问题.这时打一手好Log的重要性绝不亚于写一手好代码.项目出问题时,你要能拿出L ...
- BLOB或TEXT字段使用散列值和前缀索引优化提高查询速度
1.创建表,存储引擎为myisam,对大文本字段blob使用MD5函数建立一个散列值 create table t2(id varchar(60), content blob, hash_value ...
- 自选项目--手机锁屏软件--NABC分析
N(Need 需求) 关键字:利用碎片时间加强对想记的事物的记忆.备忘.一般来说,锁屏目的大致有三点: 1.保护手机隐私 2.防止误操作手机 3.在不关闭系统软件的情况下节省电量 对于市面上已有的锁屏 ...
- DB天气app冲刺二阶段第四天
今天就进度来说没有丝毫进度..考虑直接把数据库文件弄到代码里.因为每次挑选城市的时候都有时会出bug ,所以我想明天试一下看看是不是这个的问题,虽然工程量有点大,但是应该不困难,所以明天试一下需要. ...
- C# - 设置DLL的属性Embed Interop Type 设为False
错误: Error msg: A reference was created to embedded interop assembly. because of an indirect referenc ...
- BestCoder Round #2
TIANKENG’s restaurant http://acm.hdu.edu.cn/showproblem.php?pid=4883 竟然暴力1.44*10^7 还要*T=100 竟然过了 # ...