1631 小鲨鱼在51nod小学(线段树区间修改+单点查询:不用下传lazy的区间修改)
题目描述:
1631 小鲨鱼在51nod小学
鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学。并依靠算法方面的特长,在班里担任了许多职务。
每一个职务都有一个起始时间A和结束时间B,意为小鲨鱼在[A, B]时间内,担任了某职务(inclusively)。
现在给定小鲨鱼的职务履历表,你可以高效的给出小鲨鱼在某天担任了哪些职务吗?
p.s. 由于小鲨鱼担任的职务太多,所有任期小于一个自然月的职务都忽略不计。(如1月1日~2月1日为一个自然月,即月份加1)
p.p.s. 输入数据保证小鲨鱼同时不担任超过200种职务。(牛!)
p.p.p.s 输入的日期均为合法日期,范围在2000年01月01日~2999年12月31日。
输入
第一行为一个整数n,代表小鲨鱼担任过N种职务。(1 <= n <= 10^5) 接下来的n行,每一行为七个整数,y0, m0, d0, y1, m1, d1, x。意为在<y0, m0, d0>到<y1, m1, d1>时间内,小鲨鱼担任了职务x。(1 <= x <= 10^9) 给定的时间皆合法,且起始日期小于或等于截止日期。职务x是唯一的。接下来是一个整数q,代表q次查询。(1 <= q <= 10^4) 接下来的q行,每一行为三个整数<y, m, d>,代表查询的日期。时间皆合法。输出
每一次查询输出一行结果。 首先输出一个整数n,代表此时小鲨鱼担任的职务数。(n可以为0) 接下来是n个整数,代表小鲨鱼担任的职务。职务列表保持升序。输入样例
4 2000 01 01 2000 01 01 111 2000 01 02 2001 02 02 222 2000 01 28 2000 02 29 333 2000 01 29 2000 02 28 444 4 2000 01 01 2000 01 02 2000 01 28 2000 02 29输出样例
0 1 222 2 222 333 2 222 333
思路描述:
乍一看离线查询,但实际上按时间排序后假如职务1被查询1和查询2占用,到了职务2时,
依旧可能被查询3之前几个查询占用;假设换一种策略,先枚举查询再枚举职务,面临同样的
回溯问题,所以离线查询不可行。
正解在2000~2999年的每一天上建立线段树,每一次设定职务即在树上作区间修改,每一次查询
即单点查询。区间修改+单点查询的线段树是不用下传懒标记什么的,当修改区间完全覆盖某点时,
修改该点并返回,单点查询时只要将从根节点一直到目标叶子节点上的附加值全部相加即可,本体
附加值换成了一个容器。
PS:为方便在线段树上进行区间操作,用 的散列
函数将输入时间简化。
代码实现:
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e6+100;
int dateHash(int y,int m,int d){return (y-2000)*372+(m-1)*31+d;
}
int Left[N],Right[N];
vector<int>dat[N],res;
void build(int p,int l,int r){Left[p]=l;Right[p]=r;dat[p].clear();//利用建树的过程清空 if(l==r)return ;int mid=(l+r)/2;build(2*p,l,mid);build(2*p+1,mid+1,r);
}
void change(int p,int l,int r,int v){if(l<=Left[p]&&r>=Right[p]){ //针对单点查询的区间修改 dat[p].push_back(v);return ;}int mid=(Left[p]+Right[p])/2;if(l<=mid)change(2*p,l,r,v);if(r>mid)change(2*p+1,l,r,v);
}
int query(int p,int x){ //查询要一直搜到叶子节点 if(Left[p]==Right[p]){res.insert(res.end(),dat[p].begin(),dat[p].end());return dat[p].size();}int mid=(Left[p]+Right[p])/2,val=0;if(x<=mid)val=query(2*p,x);else val=query(2*p+1,x);res.insert(res.end(),dat[p].begin(),dat[p].end());//容器叠加 return dat[p].size()+val;//本题的输入确保了同一路径上不同节点相同职务不会重复存
}
int main(){int n,q,y,m,d,yb,mb,db,x;while(cin>>n){memset(Left,0,sizeof(Left));memset(Right,0,sizeof(Right));build(1,1,dateHash(2999,12,31));for(int i=1;i<=n;i++){cin>>y>>m>>d;cin>>yb>>mb>>db>>x;if(dateHash(yb,mb,db)-dateHash(y,m,d)<31)continue;change(1,dateHash(y,m,d),dateHash(yb,mb,db),x);}cin>>q;while(q--){res.clear();cin>>y>>m>>d;cout<<query(1,dateHash(y,m,d))<<" ";sort(res.begin(),res.end());for(vector<int>::iterator it=res.begin();it!=res.end();it++){cout<<*it<<" ";}cout<<endl;}}return 0;
}
THE END;
1631 小鲨鱼在51nod小学(线段树区间修改+单点查询:不用下传lazy的区间修改)相关推荐
- 51nod 1631 小鲨鱼在51nod小学 【线段树--】
1631 小鲨鱼在51nod小学 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学.并依靠算法方面的 ...
- 51NOD 1631 小鲨鱼在51nod小学 区间线段树
1631 小鲨鱼在51nod小学 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学.并依 ...
- 1631 小鲨鱼在51nod小学
1631 小鲨鱼在51nod小学 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学. ...
- 1631 小鲨鱼在51nod小学 暴力
1631 小鲨鱼在51nod小学 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学.并依 ...
- 51Nod——T 1631 小鲨鱼在51nod小学
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1631 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 ...
- 51nod 1631 小鲨鱼在51nod小学
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学.并依靠算法方面的特长,在班里担任了许多职务. 每一 ...
- 51Nod 1631 小鲨鱼在51Nod小学 【 扫描线 】
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1631 题意: 分析: 吐槽:没想到这题n*q暴力都能过~~ 我的做 ...
- 51Nod1631 小鲨鱼在51nod小学
1631 小鲨鱼在51nod小学 1 秒 131,072 KB 20 分 3 级题 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学.并依靠算法方面的特长,在班里担任了许多职务. 每一 ...
- Assign the task HDU - 3974(线段树+dfs建树+单点查询+区间修改)
题意: 染色问题:给一个固定结构的树,现在有两个操作: (1) y 将结点x及其所有后代结点染成颜色y: (2)查询结点x当前的颜色. 其实就是区间染色问题,不过需要dfs预处理, 题目: There ...
最新文章
- Web Serveice服务代理类生成及编译
- 为什么明星公司会选择Go作为编程语言?
- YOLObile:面向移动设备的「实时目标检测」算法
- Keycloak SSO集成到jBPM和Drools Workbench中
- android封装aidl接口,Android远端接口AIDL及服务回调用法
- Linux/UNIX不同shell环境下数组的处理
- 2020全国高考作文题出炉!网友:信心满满的点开,一脸懵逼的退出
- bat脚本交互输入_windows 10 如何设定计划任务自动执行 python 脚本?
- Anaconda prompt下常用命令
- 在Laravel中使用自己的类库三种方式
- 物联网四大产业群的典型应用场景
- python打开chrome浏览器登录用户名密码_[工具]Python获取Chrome浏览器已保存的所有账号密码...
- 中小型企业网络规划设计方案_实战:企业网络系统规划与设计与事项
- roboware下载链接
- 并发请求多 服务器响应慢 post,从服务端视角看高并发问题
- 关于win10X64 连接oracle
- SQL宝典(中文版) 高清PDF版下载
- 印象笔记android,印象笔记(Evernote) Android SDK 更新
- prometheus监控预警之AlertManager邮箱报警
- Alphapose - 在Alphapose中使用yolov3-tiny检测器大幅提升检测性能
热门文章
- 日暮下的东汉-外戚、宦官与党锢
- 【Unity打包崩溃】安卓包遇到CrashReport-Native: Faile to open comm file(/system/build.prop)就闪退
- linux用不了wifi密码忘记了,极路由wifi密码忘记了怎么办?
- CDS View-Part8Part9Part10Part16 内置函数
- 那些年啊,那些事——一个程序员的奋斗史 ——98
- Vue学习之认识到应用(三)
- JMeter基本使用
- 学习无止境,一起来学最好用的正则表达式大全
- 【更新中】人教版高一数学知识点汇总(必修1)
- 行波进位(Ripple Carry)与超前进位(Loodahead Carry)