hdu 4358 欧拉树形变线性+树状数组+离散化+离线+区间内出现k次的不同的数有几个+手动扩展栈

本文主要是介绍hdu 4358 欧拉树形变线性+树状数组+离散化+离线+区间内出现k次的不同的数有几个+手动扩展栈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://acm.hdu.edu.cn/showproblem.php?pid=4358

性价比很高的一道题,一题练很多东西,逐一道来:
1、离散化的一种方法:

我在http://blog.csdn.net/u011026968/article/details/38542827里面写了一种离散化的方法,但是当时认为这种方法没法处理有重复元素的,这篇博客里的离散化的方法完善了我之前写的,可以保证相同元素离散化之后仍然相同,不同元素离散化之后仍然不同

其中a[]存的是待离散化的数

bool cmp(const int x,const int b)
{
return a[x]<a[b];
}
void dis()//离散化的方法---保证原来相等的还想等,不等的还不等,O(nlogn)
{
int tmpdis[MAXN];
for(int i=0;i<=N;i++)
tmpdis[i]=i;
sort(tmpdis+1,tmpdis+1+N,cmp);
int tmp=0,prev=a[tmpdis[1]]-1;//pre初始化的时候保证和第一个数不一样,因为已经排过序,所以最小的数-1满足需求
for(int i=1;i<=N;i++)
{
if(prev!=a[tmpdis[i]])
{
prev=a[tmpdis[i]];
a[tmpdis[i]]=++tmp;//两句不可以互换
}
else
{
a[tmpdis[i]]=tmp;
}
}
}
2、欧拉树形变线性

之前做过一道LCA的题---其实到现在还没有AC,,,学到的树形变线性,其实就是记录先序遍历的结果

调用直接dfs(root),root为树根,最终在li[]里面存储了结果,以u为根的子树的区间是le[u],rig[u],

void dfs(int u)
{vis[u]=1;le[u]=++treecnt;li[treecnt]=a[u];//已经离散化过的a[]for(int j=0;j<g[u].size();j++){int v=g[u][j];if(!vis[v])dfs(v);}rig[u]=treecnt;
}

3、树状数组+离线+区间内出现k次的不同的数有几个

我的方法参照之前一道CF的题:http://blog.csdn.net/u011026968/article/details/38589907

还看到一种方法:http://blog.csdn.net/julyana_lin/article/details/7872393

我看的不是很明白......不过跟我的另一篇博客应该是同样的方法:http://blog.csdn.net/u011026968/article/details/38583153

4、手动扩展栈

我RE了一下午,以为是自己的做法没想好导致错误-----然后手动模拟却觉得对,后来扩展栈,AC %>_<%

#pragma comment(linker, "/STACK:102400000,102400000")

其实G++交的话,不支持这句代码但是可以AC,不需要扩展栈

C++代码如下:

#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)const int MAXN = 100000+100;
int N,K;
int a[MAXN],vis[MAXN],tree[MAXN],treecnt;
int le[MAXN],rig[MAXN],c[MAXN*4],ans[MAXN];
int li[MAXN];vector<int>g[MAXN*2];struct Query
{int l,r,id;bool operator < (const Query &t)const{return r<t.r;}
}q[MAXN*4];inline int lowbit(int x){return x&(-x);}void add(int x, int v)
{while(x<=treecnt){c[x]+=v;x+=lowbit(x);}
}int sum(int x)
{int ret=0;while(x>0){ret+=c[x];x-=lowbit(x);}return ret;
}void dfs(int u)
{vis[u]=1;le[u]=++treecnt;li[treecnt]=a[u];//已经离散化过的a[]for(int j=0;j<g[u].size();j++){int v=g[u][j];if(!vis[v])dfs(v);}rig[u]=treecnt;
}void inittree()
{CL(tree,0);CL(vis,0);CL(le,0);CL(rig,0);treecnt=0;dfs(1);
}bool cmp(const int x,const int b)
{return a[x]<a[b];
}void dis()//离散化的方法---保证原来相等的还想等,不等的还不等,O(nlogn)
{int tmpdis[MAXN];for(int i=0;i<=N;i++)tmpdis[i]=i;sort(tmpdis+1,tmpdis+1+N,cmp);int tmp=0,prev=a[tmpdis[1]]-1;//pre初始化的时候保证和第一个数不一样,因为已经排过序,所以最小的数-1满足需求for(int i=1;i<=N;i++){if(prev!=a[tmpdis[i]]){prev=a[tmpdis[i]];a[tmpdis[i]]=++tmp;//两句不可以互换}else{a[tmpdis[i]]=tmp;}}
}
vector<int>data[MAXN];
int main()
{//IN("hdu4358.txt");int ncase,Q;int u,v,ic=0;scanf("%d",&ncase);while(ncase--){for(int i=0;i<MAXN;i++)data[i].clear();scanf("%d%d",&N,&K);for(int i=0;i<MAXN;i++)g[i].clear();///for(int i=1;i<=N;i++)scanf("%d",&a[i]);dis();//离散化for(int i=1;i<N;i++){scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}inittree();//剩下的就是查找从scanf("%d",&Q);for(int i=1;i<=Q;i++){scanf("%d",&u);q[i].l=le[u];q[i].r=rig[u];q[i].id=i;//printf("u=%d l=%d r=%d\n",u,le[u],rig[u]);}sort(q+1,q+1+Q);/////for(int i=1;i<=treecnt;i++)// printf("a[%d]=%d li=%d\n",i,a[i],li[i]);///CL(c,0);for(int i=1,qu=1;i<=treecnt;i++)//{int vv=li[i];data[vv].push_back(i);int sz=data[vv].size();//K=li[i];if(sz>=K){add(data[vv][sz-K],1);if(sz>K)add(data[vv][sz-K-1],-2);if(sz>K+1)add(data[vv][sz-K-2],1);}while(q[qu].r==i && qu<=Q){ans[q[qu].id]=sum(i)-sum(q[qu].l-1);/////for(int i=1;i<=treecnt;i++)//   printf("##i=%d %d\n",i,c[i]);// printf("ans=%d id=%d l=%d r=%d\n",ans[q[qu].id],q[qu].id,q[qu].l,i);//qu++;}}printf("Case #%d:\n",++ic);for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);if(ncase)putchar('\n');}return 0;
}

另外格式上---如果是case之间隔一个空行,最后一个case是不需要输出\n的,因为这个PE了





这篇关于hdu 4358 欧拉树形变线性+树状数组+离散化+离线+区间内出现k次的不同的数有几个+手动扩展栈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009581

相关文章

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

Maven如何手动安装依赖到本地仓库

《Maven如何手动安装依赖到本地仓库》:本文主要介绍Maven如何手动安装依赖到本地仓库问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、下载依赖二、安装 JAR 文件到本地仓库三、验证安装四、在项目中使用该依赖1、注意事项2、额外提示总结一、下载依赖登