SUDTOJ 3323园艺问题 (线段树)
2015-09-15 19:50
183 查看
园艺问题
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
周赛的时候没有想到可以先全部输入进行离散化,再进行建树,我啸的一句话惊醒了我
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; }
相关文章推荐
- Delphi 截取被遮挡窗口图片
- UISlider
- python笔记之中缀语法和管道实现
- 大数据竞赛平台——Kaggle 入门(转)
- Nvidia Nsight + .NET
- SUDTOJ 3323园艺问题 (线段树)
- 雨林木风Win10开始菜单点开很慢怎么办?Win10开始菜单反应迟钝解决方法
- Android Studio 代码页面保护色配置
- Mediarecorder录音
- 14级结训赛3314-扩展欧几里德
- 从一台2005数据库备份后 ,想到另一台2005数据恢复 但发生 备份集中的数据库备份与现有的XX 数据库不同 选择覆盖现有数据库 也不行
- 台大机器学习第一讲
- 2015广东移动“灯塔计划”暑期实习面试小记
- javascript判断非空
- python笔记之bisect模块
- python笔记之常用模块用法分析
- light oj 1019【最短路模板】
- ios7 侧滑返回
- ORM对象关系映射之GreenDAO高级用法
- Cache技术――OSCache(转-全)