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

题目意思:

给你N个花开的时间段,然后在有M个时间点,问你在这个时间点有多少花开着。

昨天刚做的一个类似的题,用线段树加离散化,然后赶紧敲,然后错八次。

最后还是没做出来。

那么思路还是线段树加离散化。

题目给的每个花开花谢的范围很大,但花的数目只有1e5,很容易就想到了离散化,然后就是用线段树去处理,找每个花开的段,最后lazy下放到

每个时间点,这样就知道每个时间点开的花数。

这题大致思路是这样的,但你会发现M次查询时,有的时间点,你在离散化时,你没将它加入,所以你在离散化后的数组里找不到这个点。当时没想到将询问的点加入一起离散化,然后各种二分,然并ruan.。

下面给出代码:

  1 /*sjy*/
2 #include<stdio.h>
3 #include<algorithm>
4 #include<stdlib.h>
5 #include<string.h>
6 #include<iostream>
7 #include<math.h>
8 void add(int l,int r,int k,int aa,int dd);
9 int kr(int n,int m,int t);
10 void lazy(int l,int r,int k);
11 int findd(int l,int r,int k,int aa,int dd);
12 int cmp(const void*p,const void*q);
13 /*int er(int n,int m,int t);*/
14 typedef struct pp
15 {
16 int x;
17 int y;
18 }ss;
19 int N,M,V;
20 int tree[8*100005];//线段树数组
21 ss a[100005];
22 ss b[2*100005];
23 int c[2*100005];
24 /*int yk[2*100005];*/
25 int kp[100005];
26 using namespace std;
27 int main(void)
28 {
29 int n,i,j,k,p,q,x,y,s;
30 scanf("%d",&n);
31 for(i=1; i<=n; i++)
32 {
33 memset(tree,0,sizeof(tree));
34 scanf("%d %d",&N,&M);
35 int cnt=0;
36 int sum=-1;
37 for(j=0; j<N; j++)
38 {
39 scanf("%d %d",&a[j].x,&a[j].y);
40 b[cnt].x=a[j].x;
41 cnt++;
42 b[cnt].x=a[j].y;
43 cnt++;
44 if(sum<a[j].y)
45 {
46 sum=a[j].y;
47 }
48 }
49 for(j=0;j<M;j++)
50 {
51 scanf("%d",&kp[j]);
52 b[cnt++].x=kp[j];
53 }//询问的点加入离散化
54 qsort(b,cnt,sizeof(ss),cmp);//排序离散化
55 int vv=0;
56 c[vv]=0;
57 int rr=0;
58 for(j=1; j<cnt; j++)
59 {
60 if(b[j].x!=b[j-1].x)
61 {
62 vv++;
63 c[j]=vv;
64 rr=0;
65 /*yk[j]=rr;*/
66 }
67 else
68 {
69 c[j]=vv;
70 /*yk[j]=rr;*/
71 }
72 }
73 for(j=0; j<N; j++)
74 {
75 x=kr(0,cnt-1,a[j].x);//二分找点
76 y=kr(0,cnt-1,a[j].y);
77 add(x,y,0,0,vv);//线段数更新加段
78 }
79 lazy(0,vv,0);printf("Case #%d:\n",i);
80 for(j=0;j<M;j++)
81 {
82 int uu=kr(0,cnt-1,kp[j]);
83 int yy=findd(uu,uu,0,0,vv);//查询问的时间段因为为点所以l=r
84 printf("%d\n",yy);
85 }
86
87 }
88 return 0;
89
90 }
91 void add(int l,int r,int k,int aa,int dd)//线段数更新
92 {
93 if(l>dd||r<aa)
94 {
95 return ;
96 }
97 else if(l<=aa&&r>=dd)
98 {
99 tree[k]++;
100 }
101 else
102 {
103 add(l,r,2*k+1,aa,(aa+dd)/2);
104 add(l,r,2*k+2,(aa+dd)/2+1,dd);
105 }
106 }
107
108 void lazy(int l,int r,int k)//最后下放操作
109 {
110 if(l==r)
111 {
112 return ;
113 }
114 else
115 {
116 tree[2*k+1]+=tree[k];
117 tree[2*k+2]+=tree[k];
118 lazy(l,(l+r)/2,2*k+1);
119 lazy((l+r)/2+1,r,2*k+2);
120 }
121 }
122
123
124 int findd(int l,int r,int k,int aa,int dd)
125 {
126 if(l>dd||r<aa)
127 {
128 return 0;
129 }
130 else if(l<=aa&&r>=dd)
131 {
132 return tree[k];
133 }
134 else
135 {
136 int nx=findd(l,r,2*k+1,aa,(aa+dd)/2);
137 int ny=findd(l,r,2*k+2,(aa+dd)/2+1,dd);
138 return nx+ny;
139 }
140
141 }
142
143 /*int er(int n,int m,int t)
144 {
145 int y=(n+m)/2;
146 if(b[y].x==t)
147 {
148 return c[y];
149 }
150 if(m<n)
151 {
152 return -1;
153 }
154 if(m==n&&b[m].x!=t)
155 {
156 return -1;
157 }
158
159 else if(m-n==1&&b[n].x<=t&&b[m].x>=t)
160 {
161 V=yk[n];
162 return c[n];
163 }
164 else if(b[y].x<t)
165 {
166 return er(y,m,t);
167 }
168 else return er(n,y,t);
169
170 }*/
171 int kr(int n,int m,int t)//二分找点
172 {
173 int yy=(n+m)/2;
174 if(b[yy].x==t)
175 {
176 return c[yy];
177 }
178 else if(b[yy].x>t)
179 {
180 return kr(n,yy-1,t);
181 }
182 else return kr(yy+1,m,t);
183 }
184 int cmp(const void*p,const void*q)
185 {
186 ss*w=(ss*)p;
187 ss*ww=(ss*)q;
188
189 return w->x-ww->x;
190 }

hdu -4325-Flowers(离散化 线段树)的更多相关文章

  1. hdoj 4325 Flowers【线段树+离散化】

    Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  2. 离散化+线段树/二分查找/尺取法 HDOJ 4325 Flowers

    题目传送门 题意:给出一些花开花落的时间,问某个时间花开的有几朵 分析:这题有好几种做法,正解应该是离散化坐标后用线段树成端更新和单点询问.还有排序后二分查找询问点之前总花开数和总花凋谢数,作差是当前 ...

  3. 南阳理工 题目9:posters(离散化+线段树)

    posters 时间限制:1000 ms  |  内存限制:65535 KB 难度:6   描述 The citizens of Bytetown, AB, could not stand that ...

  4. SGU 180 Inversions(离散化 + 线段树求逆序对)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...

  5. 【POJ】2528 Mayor's posters ——离散化+线段树

    Mayor's posters Time Limit: 1000MS    Memory Limit: 65536K   Description The citizens of Bytetown, A ...

  6. hpu校赛--雪人的高度(离散化线段树)

    1721: 感恩节KK专场——雪人的高度 时间限制: 1 Sec  内存限制: 128 MB 提交: 81  解决: 35 [提交][状态][讨论版] 题目描述 大雪过后,KK决定在春秋大道的某些区间 ...

  7. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  8. 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树

    [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...

  9. 【bzoj4636】蒟蒻的数列 离散化+线段树

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801379.html 题目描述 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个 ...

  10. Mayor's posters (离散化线段树+对lazy的理解)

    题目 题意: n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围 li,ri(1<=li<=ri<=10000000) .求出最后还能看见多少张海报. 思路: 由于 ...

随机推荐

  1. Redis集合解决大数据筛选

    Redis集合:集合是什么,就是一堆确定的数据放在一起,数学上集合有交集.并集的概念,这个就可以用来做大数据的筛选功能. 以商品为例,假如商品有颜色和分类.价格区间等属性. 给所有统一颜色的商品放一个 ...

  2. CMSIS-RTOS 信号量Semaphores

    信号量Semaphores 和信号类似,信号量也是一种同步多个线程的方式,简单来讲,信号量就是装有一些令牌的容器.当一个线程在执行过程中,就可能遇到一个系统调用来获取信号量令牌,如果这个信号量包含多个 ...

  3. mysql数据查询语言DQL

    DB(database)数据库:存储数据的'仓库',保存了一系列有组织的数据 DBMS(Database Management System)数据库管理系统:用于创建或管理DB SQL(Structu ...

  4. Hadoop入门 集群崩溃的处理方法

    目录 集群崩溃的处理方法 搞崩集群 错误示范 正确处理方法 1 回到hadoop的家目录 2 杀死进程 3 删除每个集群的data和logs 4 格式化 5 启动集群 总结 原因分析 集群崩溃的处理方 ...

  5. Linux基础命令---mail邮件管理程序

    mail mail是一个邮件的管理程序,可以用来发送或者接收邮件. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.   1.语法       mail  [选项] ...

  6. Linux学习 - Bash变量

    一.用户自定义变量(本地名) 用户自定义变量只有在当前的shell中生效 1 定义变量 name="zheng huiwei" aa=123 2 变量叠加 aa="$aa ...

  7. 部署应用程序到Tomcat的webapps目录

    一.方法如下 1.通过MyEclipse上方工具栏Manage Deployments,依次选择项目和服务器: 2.通过右击项目Export,生成war包到webapps中: 3.复制项目WebRoo ...

  8. [笔记] Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting

    原文地址:https://arxiv.org/abs/2012.07436 源码地址:https://github.com/zhouhaoyi/Informer2020

  9. 了解C#的Expression

    我们书接上文,我们在了解LINQ下面有说到在本地查询IEnumerbale主要是用委托来作为传参,而解析型查询 IQueryable则用Expression来作为传参: public static I ...

  10. 如何查看电脑IP地址

    如何查看电脑的IP地址 win+r输入cmd回车,然后输入:ipconfig回车