SUDTOJ 3323园艺问题 (线段树)
园艺问题
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
本巨养了一盆双色茉莉。这种花有一种特点:第i朵花在第Di天盛开,刚开时是紫色的,Ai天之后会变成白色,再过Bi天就会凋谢。如Di = 3,Ai = 4,Bi = 5,那么在第3至6天为紫色,第7至11天为白色,第11天之后就凋谢了。
现在给出一些事件,你需要按要求给出答案。
事件1:在第Di天开了一朵花,这朵花Ai天后变成白色,再过Bi天就会凋谢。
事件2:询问在第X天时,紫色花朵和白色花朵各有多少。
输入
输入包含多组。对于每组数据:
第一行包含一个整数n (1 <= n <= 300,000)。
接下来的n行,为下述两种格式的一种,分别代表事件1和事件2。
1 Di Ai Bi
2 X
对于所有数据有:1 <= Di,Ai,Bi <= 1,000,000,000 ,1 <= Ai <= 3,000,000,000;
输出
对于每个事件2输出一行,包含两个整数代表答案。
示例输入
4
1 3 2 3
2 4
1 2 1 1
2 10
示例输出
1 0
0 0
周赛的时候没有想到可以先全部输入进行离散化,再进行建树,我啸的一句话惊醒了我
#include <bits/stdc++.h>
#define LL long long
#define esp 1e-8
#define INF 0x3f3f3f3f
#define Fread() freopen("../in.in","r",stdin)
#define Fwrite() freopen("../out.out","w",stdout)
using namespace std;
const int Max = 301000;
typedef struct Flow
{
LL l,r,L,R;
}Flow;
union Flower
{
Flow F;
LL Q;
};
typedef struct Seg
{
int sum1;
int sum2;
} Tree;
int Sta[Max];
Flower FF[Max];
Tree T[Max*5];
LL Da[Max*2];
int top2,top3;
LL a,b,d;
int c;
int num1,num2;
void Update_down(int site,int L,int R)//向下更新
{
if(L==R)
{
return ;
}
T[site<<1].sum1+=T[site].sum1;
T[site<<1].sum2+=T[site].sum2;
T[site<<1|1].sum1+=T[site].sum1;
T[site<<1|1].sum2+=T[site].sum2;
T[site].sum1=T[site].sum2=0;
}
void Build(int L,int R,int site)//建树
{
T[site].sum1=0;
T[site].sum2=0;
if(L==R)
{
return ;
}
int mid=(L+R)>>1;
Build(L,mid,site<<1);
Build(mid+1,R,site<<1|1);
}
void Update(int L,int R,int l,int r,int site,int ans)//更新
{
if(L==l&&R==r)
{
if(ans==1)
{
T[site].sum1++;
}
else
{
T[site].sum2++;
}
return ;
}
int mid=(L+R)>>1;
if(r<=mid)
{
Update(L,mid,l,r,site<<1,ans);
}
else if(l>mid)
{
Update(mid+1,R,l,r,site<<1|1,ans);
}
else
{
Update(L,mid,l,mid,site<<1,ans);
Update(mid+1,R,mid+1,r,site<<1|1,ans);
}
}
void Query(int L,int R,int x,int site)//查询
{
if(L==R)
{
num1=T[site].sum1;
num2=T[site].sum2;
return ;
}
Update_down(site,L,R);
int mid=(L+R)>>1;
if(x<=mid)
{
Query(L,mid,x,site<<1);
}
else
{
Query(mid+1,R,x,site<<1|1);
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
vector<LL>Arr;
for(int i=1; i<=n; i++)
{
scanf("%d",&Sta[i]);
if(Sta[i]==1)
{
scanf("%lld %lld %lld",&d,&a,&b);
FF[i].F.l=d;
FF[i].F.r=d+a-1;
FF[i].F.L=d+a;
FF[i].F.R=d+a+b-1;
Arr.push_back(d);
Arr.push_back(d+a-1);
Arr.push_back(d+a);
Arr.push_back(d+a+b-1);
}
else
{
scanf("%lld",&FF[i].Q);
Arr.push_back(FF[i].Q);
}
}
sort(Arr.begin(),Arr.end());
Arr.erase(unique(Arr.begin(),Arr.end()),Arr.end());//去重
int ans=0;
map<LL,int>Ma;
for(int i=0; i<Arr.size(); i++)
{
Ma[Arr[i]]=++ans;//编号
}
Build(1,ans,1);
for(int i=1;i<=n;i++)
{
if(Sta[i]==1)
{
Update(1,ans,Ma[FF[i].F.l],Ma[FF[i].F.r],1,1);
Update(1,ans,Ma[FF[i].F.L],Ma[FF[i].F.R],1,2);
}
else
{
num1=num2=0;
Query(1,ans,Ma[FF[i].Q],1);
printf("%d %d\n",num1,num2);
}
}
}
return 0;
}
SUDTOJ 3323园艺问题 (线段树)的更多相关文章
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
随机推荐
- DOS运行命令
运行命令主要是DOS操作系统的运行方式.DOS时代的时候,为了方便用户的操作,微软公司将一些常用的命令,如DIR,CD等命令全部集成在系统里面. 基本定义 对于DOS来说是一个很大的优点.而存放这些内 ...
- 链表的C++实现——创建-插入-删除-输出-清空
注:学习了数据结构与算法分析后,对链表进行了C++实现,参考博文:http://www.cnblogs.com/tao560532/articles/2199280.html 环境:VS2013 // ...
- 设置sublime text2/3中默认预览浏览器快捷键的方法
各位前端大神们,大家在用IDE编辑器的时候喜欢用哪些呢?是Dreamweaver.Zend Studio.editplus又或者是sublime text?今天马浩周给大家就要说说设置sublime ...
- 蓝牙物理链路类型:SCO和ACL链路
蓝牙物理链路ACL(Asynchronous Connectionless), 另外的一种链路是SCO(Synchronous Connection Oriented)主要用来传输对时间要求很高的数据 ...
- iOS仿网易新闻栏目拖动重排添加删除效果
仿网易新闻栏目选择页面的基本效果,今天抽了点时间教大家如何实现UICollectionView拖动的效果! 其实实现起来并不复杂,这里只是基本的功能,没有实现细节上的修改,连UI都是丑丑的样子,随手画 ...
- Xcode 杂七杂八
一.Exception 的捕捉 1.message send to dealloc instance a, 输出控制台(lldb)后面输入:c + enter, 找到对应的行 b, po ...
- Web性能API——帮你分析Web前端性能
前端性能统计必备api,有不知道的吗? 正文从这开始- 开发一个现代化的互联网网站是一项复杂的任务,需要各种职能的密切合作以应对用户日新月异的需求.其中,网页的性能直接决定了用户的体验,而随着新型客户 ...
- 使用NSURLSession
NSURLConnection在iOS9被宣布弃用,NSURLSession从13年发展到现在,终于迎来了它独步江湖的时代.NSURLSession是苹果在iOS7后为HTTP数据传输提供的一系列接口 ...
- Elasticsearch + logstash中文指南
http://kibana.logstash.es/content/logstash/examples/nginx-access.html http://es.xiaoleilu.com/030_Da ...
- ubuntu编译运行xv6
最近想找个简单的类Unix系统学习下, xv6不错的, 所有代码加起来不到一万行,首先把代码跑起来还是很重要的. # 下载xv6源码并编译 git clone git://pdos.csail.mit ...