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 ...
随机推荐
- ActiveMQ之jmscorrelationid与selector
前面讲过JMSCorrelationID主要是用来关联多个Message,例如需要回复一个消息的时候,通常把回复的消息的JMSCorrelationID设置为原来消息的ID.在下面这个例子中,创建了三 ...
- Android Studio快速开发之道(各种语法糖)
现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. Post ...
- C++ 字符串相关函数
<转>自:http://zhidao.baidu.com/question/173202165.html 首先就是memcpy表头文件: #include <string.h> ...
- 悲惨的Android程序员
Android程序员太悲惨了,连Android官网都访问不了,整个Android程序员的水平都被拉低了一个等级.受不了了.说说悲惨的遭遇吧. 起源:高射炮打苍蝇,驴受伤了 Android一个纯技术网站 ...
- WPF解析PPT为图片
偶遇需要解析 PPT为单张图片 其中,对于包含动画的PPT页,分别对动画最后效果进行截取,即每个连续动画截取 (动画N个)N+1(原图)张 http://git.oschina.net/jiailiu ...
- 小王子浅读Effective javascript(一)了解javascript版本
哈哈,各位园友新年快乐!愚安好久没在园子里写东西了,这次决定针对javascript做一个系列,叫做<小王子浅读Effective javascript>,主要是按照David Herma ...
- Careercup - Facebook面试题 - 5188884744896512
2014-05-02 07:18 题目链接 原题: boolean isBST(const Node* node) { // return true iff the tree with root 'n ...
- android 播放语音文件出现 prepare failed ,不能下载amr文件
amr文件的路径正确,但是android 却不能播放出来. 调试发现时根本就没有下载下来 原因: IIS服务器不允许下载该文件,需要配置MIME 解决方法: 进入IIS目录,配置MIME
- 自己的一些 Demo,源码链接
1.指纹解锁(GitHub). 2.JS 与 OC 交互(GitHub). 3.模仿 HTML 下拉菜单(GitHub). 4.OC开发常用类目(GitHub).
- as3.0服务端FMS软件常用的方法与属性参考示例
转自:http://www.cuplayer.com/player/PlayerCode/RTMP/2012/0918429.html Application类的方法汇总方法 描述Applicatio ...