HDU1556---树状数组 | 线段树 |*
输入n,紧接n行,每行a,b
n个气球,a,b表示从第a到第b个气球涂一次色,输出每个球最终的涂几次色
暴力超时,优化数据结构
1.树状数组
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<cstdio>
#define F(i,a,b) for (int i=a;i<b;i++)
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=,MAX=; int n,c[MAX]; int lowbit(int x) {
//计算2^k
return x&-x;
} void update(int x,int val)
{
//向上更新,使所有包含了x的区间都更新一下
while(x<=n) {
c[x]+=val;
x+=lowbit(x);
}
} int Sum(int x)
{
//向下查询
int sum=;
while(x>) {
sum+=c[x];
x-=lowbit(x);
}
return sum;
} int main()
{
while(~scanf("%d",&n),n) {
mes(c,);
int a,b;
FF(i,,n) {
scanf("%d%d",&a,&b);
update(a,);
update(b+,-);
}
F(i,,n) printf("%d ",Sum(i));
printf("%d\n",Sum(n));
} return ;
}
2.线段树
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#define Lson left,mid,n<<1
#define Rson mid+1,right,n<<1|1
const int MAX=;
const int Max=<<;
int s[Max];
int m;
using namespace std;
typedef struct Node
{
int left;
int right;
int value;
};
Node node[Max];
void build_tree(int left,int right,int n)
{
node[n].left=left;
node[n].right=right;
node[n].value=;
if(node[n].left==node[n].right)
return;
int mid=(node[n].left+node[n].right)>>;
build_tree(Lson);
build_tree(Rson);
}
void query(int left,int right,int n)
{
if(node[n].left>=left&&node[n].right<=right)///找到要涂颜色区间,这里很重要,表示用区间后再慢慢回归到子节点上
{
node[n].value+=;
return;
}
int mid=(node[n].left+node[n].right)>>;
if(right<=mid)
query(left,right,n<<);
else if(left>mid)
query(left,right,n<<|);
else
{
query(Lson);
query(Rson);
}
}
void sum(int n)
{
if(node[n].left==node[n].right)
{
s[m]=node[n].value;
m+=;
return;
}
node[n<<].value+=node[n].value;
node[n<<|].value+=node[n].value;
sum(n<<);
sum(n<<|);
}
int main()
{
int n,i,j,a,b;
while(scanf("%d",&n)&&n)
{
build_tree(,n,);
for(i=;i<n;i++)
{
scanf("%d%d",&a,&b);
query(a,b,);
}
m=;
sum();
for(i=;i<m;i++)
{
if(i==m-)
printf("%d\n",s[i]);
else
printf("%d ",s[i]);
}
}
return ;
}
3.奇技淫巧
从此题discuss中看到
每个气球有两属性
作为起点的次数st
作为终点的次数ed
一共享变量sum_st记录到当前点的所有作为染色起点次数和
在进行下一个点前,要先减去此点作为染色终点的次数
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define maxn 100000+5 struct st_ed
{
int st;
int ed;
}p[maxn]; int N; int main()
{
#ifndef ONLINE_JUDGE
// freopen("in","r",stdin);
#endif
int a,b;
while(scanf("%d",&N) && N)
{
memset(p,,sizeof(p));
for(int i = ; i <= N; i++)
{
scanf("%d%d",&a,&b);
p[a].st++;
p[b].ed++;
}
int sum_st = , sum_ed = ;
for(int i = ; i <= N; i++)
{
if(i!=)
printf(" ");
sum_st += p[i].st;
printf("%d",sum_st);
sum_st -= p[i].ed;
}
printf("\n");
}
}
同理
数组离散化?
#include "stdio.h"
int main()
{
int j,n,i,a,m,b;
while(scanf("%d",&n),n)
{
int c[]={};
j=n;
m=;
while(j--)
{
scanf("%d %d",&a,&b);
c[a]++;
c[b+]--;
}
for(i=;i<n;i++)
{
m+=c[i];
printf("%d ",m);
}
printf("%d\n",m+c[n]);
}
return ;
}
HDU1556---树状数组 | 线段树 |*的更多相关文章
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- 树状数组 && 线段树应用 -- 求逆序数
参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...
- hdu1394(枚举/树状数组/线段树单点更新&区间求和)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- 数据结构--树状数组&&线段树--基本操作
随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...
- BZOJ_1901_&_ZJU_2112_Dynamic_Rankings_(主席树+树状数组/线段树+(Treap/Splay))
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1901 给出一个长度为n的数列A,有m次询问,询问分两种:1.修改某一位置的值;2.求区间[l, ...
- BZOJ 3333 排队计划 树状数组+线段树
题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...
- 第十四个目标(dp + 树状数组 + 线段树)
Problem 2236 第十四个目标 Accept: 17 Submit: 35 Time Limit: 1000 mSec Memory Limit : 32768 KB Probl ...
- Curious Robin Hood(树状数组+线段树)
1112 - Curious Robin Hood PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 64 ...
随机推荐
- dts--tests(三)
sample_built.py """ DPDK Test suite. Test sample_built. """ import uti ...
- 【转载】VS2015 + EF6连接MYSQL5.6
引用文章:https://jingyan.baidu.com/article/ce09321b9cc43f2bff858fbf.html 安装包注意点说明: 1.程序名称:mysql-for-visu ...
- 彻底搞定C指针--“函数名与函数指针”
函数名与函数指针 一 通常的函数调用 一个通常的函数调用的例子: //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); 点击打开链 ...
- P1282
题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...
- python基础之函数参数、嵌套、返回值、对象、命名空间和作用域
函数的使用原则 函数的使用必须遵循:先定义后使用的原则 函数的定义,与变量的定义是相似的,如果没有事先定义函数而直接引用就相当于在引用一个不存在变量名 定义阶段:只检测语法,不执行代码,当出现语法错误 ...
- 【文件处理】xml 文件 SAX解析
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口. 与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式. 当使用SAX分析器对XML文档 ...
- 基于原版Hadoop的YDB部署(转)
YDB依赖环境准备 一.硬件环境 硬件如何搭配,能做到比较高的性价比,不存在短板.合理的硬件搭配,对系统的稳定性也很关键. 1.CPU不是核数越高越好,性价比才是关键. 经常遇到很多的企业级客户,他们 ...
- android singleTop 不起作用
今天,排查问题,发现设置了singleTop 的activity, 多次启动依然是多个acitivity,而不是一个. 明明在清单里面设置了,但是就是启动了多个. 可能是因为启动的太快,导致系统判断有 ...
- Android Stadio 导入moudle 不显示
Android Stadio 导入moudle 不显示,moudle 里面的java类也没有识别,只当是普通的txt文件. 后来,我发现,每个moudle 都有一个.iml 文件~ 然后我就随便翻翻配 ...
- 阿里巴巴Java开发规约Eclipse插件安装及使用
技术交流群:233513714 插件安装 环境:JDK1.8,Eclipse4+.有同学遇到过这样的情况,安装插件重启后,发现没有对应的菜单项,从日志上也看不到相关的异常信息,最后把JDK从1.6升级 ...