view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
#define lson l,m,ls[rt]
#define rson m+1,r,rs[rt]
const int N = 200020;
const int M = N*40;
int T[M], ls[M], rs[M], sum[M], id[N];
ll val[M];
int n, m, X, P, tot; struct seg
{
int p, h, id;
seg() {}
seg(int p, int h, int id):p(p),h(h),id(id) {}
bool operator < (const seg &o) const{
return p<o.p || (p==o.p&&h>o.h);
}
}e[N];
int ecnt; struct node
{
int h, id;
node(int h=0, int id=0):h(h),id(id) {}
bool operator < (const node &o) const
{
return h<o.h;
}
}sto[N]; void build(int l, int r, int& rt)
{
rt = ++tot;
sum[rt] = val[rt]=0;
if(l==r) return ;
int m = (l+r)>>1;
build(lson);
build(rson);
} void update(int p, int c, ll v, int last, int l, int r, int &rt)
{
rt = ++tot;
ls[rt] = ls[last], rs[rt] = rs[last];
sum[rt]=sum[last]+c, val[rt] = val[last]+v;
if(r==l) return ;
int m = (l+r)>>1;
if(p<=m) update(p, c, v, ls[last], lson);
else update(p, c, v, rs[last], rson);
} ll query(int k, int l, int r, int rt)
{
if(k==0) return 0;
if(l==r) return val[rt];
int m = (l+r)>>1;
ll ans = 0;
if(sum[ls[rt]]>k) ans = query(k, lson);
else ans = val[ls[rt]] + query(k-sum[ls[rt]], rson);
return ans;
} int find(int key) //找到最后一个小于key||(等于key&&高度大于0) 位置
{
int l = 1, r = ecnt, ans=0;
while(l<=r)
{
int m = (l+r)>>1;
if(e[m].p<key || (e[m].p==key&&e[m].h>=0))
ans = m, l = m+1;
else r = m-1;
}
// int l=1,r=ecnt+1, ans;
// while (l<r)
// {
// int mid=(l+r)>>1;
// if (e[mid].p<key || (e[mid].p==key && e[mid].h>=0)){
// ans=mid;
// l=mid+1;
// }
// else{
// r=mid;
// }
// }
return ans;
} void show()
{
for(int i=1; i<ecnt; i++)
{
printf("e[%d] = {%d, %d, %d}\n", i, e[i].p, e[i].h, id[e[i].id]);
}
} int main()
{
// freopen("in.txt", "r", stdin);
while(scanf("%d%d%d%d", &n, &m, &X, &P)>0)
{
ecnt = 0, tot = 0;
int l, r, w;
for(int i=1; i<=n; i++)
{
scanf("%d%d%d", &l, &r, &w);
e[++ecnt] = seg(l, w, i);
e[++ecnt] = seg(r, -w, i);
sto[i] = node(w, i);
}
sort(e+1, e+ecnt+1);
sort(sto+1, sto+n+1);
for(int i=1; i<=n; i++) id[sto[i].id]=i; // show();
build(1, n, T[0]);
for(int i=1; i<=ecnt; i++)
{
update(id[e[i].id], (e[i].h>=0?1:-1), e[i].h, T[i-1], 1, n, T[i]);
}
ll pre=1;
int pos, a, b, c;
while(m--)
{
scanf("%d%d%d%d", &pos, &a, &b, &c);
ll k = (ll)(a*pre+b)%c;
int p =find(pos);
// printf("pos = %d, p = %d, k = %I64d\n", pos, p, k);
// printf("sum[%d] = %I64d\n", p, val[T[p]]);
ll ans = query(k, 1, n, T[p]);
if(pre>P) ans *=2;
pre = ans;
printf("%I64d\n", ans);
}
}
return 0;
}
view code#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
#define lson l,m,ls[rt]
#define rson m+1,r,rs[rt]
const int N = 200020;
const int M = N*40;
int T[M], ls[M], rs[M], sum[M], id[N];
ll val[M];
int n, m, X, P, tot; struct seg
{
int p, h, id;
seg() {}
seg(int p, int h, int id):p(p),h(h),id(id) {}
bool operator < (const seg &o) const{
return p<o.p || (p==o.p&&h>o.h);
}
}e[N];
int ecnt; struct node
{
int h, id;
node(int h=0, int id=0):h(h),id(id) {}
bool operator < (const node &o) const
{
return h<o.h;
}
}sto[N]; void build(int l, int r, int& rt)
{
rt = ++tot;
sum[rt] = val[rt]=0;
if(l==r) return ;
int m = (l+r)>>1;
build(lson);
build(rson);
} void update(int p, int c, ll v, int last, int l, int r, int &rt)
{
rt = ++tot;
ls[rt] = ls[last], rs[rt] = rs[last];
sum[rt]=sum[last]+c, val[rt] = val[last]+v;
if(r==l) return ;
int m = (l+r)>>1;
if(p<=m) update(p, c, v, ls[last], lson);
else update(p, c, v, rs[last], rson);
} ll query(int k, int l, int r, int rt)
{
if(k==0) return 0;
if(l==r) return val[rt];
int m = (l+r)>>1;
ll ans = 0;
if(sum[ls[rt]]>k) ans = query(k, lson);
else ans = val[ls[rt]] + query(k-sum[ls[rt]], rson);
return ans;
} int find(int key)
{
int l = 1, r = ecnt, ans=0;
while(l<=r)
{
int m = (l+r)>>1;
if(e[m].p<=key)
ans=m, l = m+1;
else r = m-1;
}
return ans;
} int gettype(int x)//negative or not
{
return x>=0?1:-1;
} int main()
{
while(scanf("%d%d%d%d", &n, &m, &X, &P)>0)
{
ecnt = 0, tot = 0;
int l, r, w;
for(int i=1; i<=n; i++)
{
scanf("%d%d%d", &l, &r, &w);
e[++ecnt] = seg(l, w, i);
e[++ecnt] = seg(r+1, -w, i);
sto[i] = node(w, i);
} sort(e+1, e+ecnt+1);
sort(sto+1, sto+n+1);
for(int i=1; i<=n; i++) id[sto[i].id]=i; build(1, n, T[0]);
for(int i=1; i<=ecnt; i++)
{
update(id[e[i].id], gettype(e[i].h), e[i].h, T[i-1], 1, n, T[i]);
}
ll pre=1;
int pos, a, b, c;
while(m--)
{
scanf("%d%d%d%d", &pos, &a, &b, &c);
ll k = (ll)(a*pre+b)%c;
int p =find(pos);
ll ans = query(k, 1, n, T[p]);
if(pre>P) ans *=2;
pre = ans;
printf("%I64d\n", ans);
}
}
return 0;
}

HDU 4866 Shooting(持久化线段树)的更多相关文章

  1. HDU 5820 (可持久化线段树)

    Problem Lights (HDU 5820) 题目大意 在一个大小为50000*50000的矩形中,有n个路灯.(n<=500000) 询问是否每一对路灯之间存在一条道路,使得长度为|x1 ...

  2. HDU 4866 Shooting (主席树)

    题目链接  HDU 4866 题意  给定$n$条线段.每条线段平行$x$轴,离x轴的距离为$D$,覆盖的坐标范围为$[L, R]$.   现在有$m$次射击行动,每一次的射击行动可以描述为在横坐标$ ...

  3. HDU 4866 Shooting 扫描线 + 主席树

    题意: 在二维平面的第一象限有\(n(1 \leq n \leq 10^5)\)条平行于\(x\)轴的线段,接下来有\(m\)次射击\(x \, a \, b \, c\). 每次射击会获得一定的分数 ...

  4. HDU 4866 Shooting(主席树)题解

    题意:在一个射击游戏里面,游戏者可以选择地面上[1,X]的一个点射击,并且可以在这个点垂直向上射击最近的K个目标,每个目标有一个价值,价值等于它到地面的距离.游戏中有N个目标,每个目标从L覆盖到R,距 ...

  5. HDU 5919 Sequence II(可持久化线段树)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...

  6. 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...

  7. HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  8. HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和

    To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...

随机推荐

  1. 通过rsync+inotify实现数据实时备份同步

    一.环境描述 测试环境 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 环境描述: 主服务器172.26.7.50 ,从 ...

  2. 在腾讯云上面搭建WordPress博客网站

    一.准备工作 我们使用腾讯云服务器来运行WordPress,腾讯云会给新用户七天的产品体验时间还有一些代金券,做为新手尝试成本是比较小的. 腾讯云长期举办 "云+校园" 活动,学生 ...

  3. B树详解

    B树 具体讲解之前,有一点,再次强调下:B-树,即为B树.因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解.如人们可能会以为 ...

  4. 设计人员应该看的15个很酷的 iOS 8 设计

    苹果新一代智能手机 iPhone 6 发布已经有一段时间了,一些创意设计师已经开始在设计中采用 iOS 8 设计理念.当然,其中有些是对于未来的展望和大胆的设计.我在这里收集了15个很酷的 iOS 8 ...

  5. 从0开始学angularjs-笔记04

    由于公司加班,刚到家不久,然而却毫无睡意,可能是老了吧--- 不废话了,没睡意那就做点有意义的事情吧,继续我们的angular学习之路,深夜博文,希望能造福大家! 这次我们来详细讲解angular的双 ...

  6. 《The Linux Command Line》 读书笔记02 关于命令的命令

    <The Linux Command Line> 读书笔记02 关于命令的命令 命令的四种类型 type type—Indicate how a command name is inter ...

  7. 为什么relativelayout.layoutParams的width为-1

    源码里看下就知道了.. -1不代表宽度,代表MATCH_PARENT常量的值public static final int FILL_PARENT = -1; public static final ...

  8. MJRefresh自定义刷新动画

    [一]常见用法 最原始的用法,耦合度低,但是不能统一管理.我们需要在每一个控制器都写以下代码,很繁琐,以后项目修改起来更繁琐,得一个控制器一个控制器的去定位.修改. 1.1 使用默认刷新(耦合度底,但 ...

  9. SDWebImage原理及使用

    这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理,异步下载,同一个URL下载次数控制和优化等特征. SDWebImage加载图片的流程 入口 setImageWit ...

  10. Safari 快捷键

    标签和网页导航快捷键 8 个 切换到下一个标签页 – Control+Tab 切换到上一个标签页 – Control+Shift+Tab 向下滚动一屏 – 空格 向上滚动一屏 – Shift+空格 焦 ...