题目链接

洛谷P4559

题解

只会做\(70\)分的\(O(nlog^2n)\)

如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑
找到这些空位就用二分 + 主席树
理应可以在主席树上的区间二分而做到\(O(nlogn)\),但是写不出来,先留着坑

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define REP(i,n) for (register int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,long long int>(a,b)
#define cp pair<int,long long int>
#define LL long long int
using namespace std;
const int maxn = 500005,maxm = 11000005,INF = 1000000000;
inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
int N,n,m,rt[maxn];
int ls[maxm],rs[maxm],num[maxm],cnt;
LL sum[maxm];
void modify(int& u,int pre,int l,int r,int pos){u = ++cnt;sum[u] = sum[pre] + pos; num[u] = num[pre] + 1;ls[u] = ls[pre]; rs[u] = rs[pre];if (l == r) return;int mid = l + r >> 1;if (mid >= pos) modify(ls[u],ls[pre],l,mid,pos);else modify(rs[u],rs[pre],mid + 1,r,pos);
}
int q_num(int u,int v,int l,int r,int L,int R){if (l >= L && r <= R) return num[u] - num[v];int mid = l + r >> 1;if (mid >= R) return q_num(ls[u],ls[v],l,mid,L,R);if (mid < L) return q_num(rs[u],rs[v],mid + 1,r,L,R);return q_num(ls[u],ls[v],l,mid,L,R) + q_num(rs[u],rs[v],mid + 1,r,L,R);
}
LL q_sum(int u,int v,int l,int r,int L,int R){if (l >= L && r <= R) return sum[u] - sum[v];int mid = l + r >> 1;if (mid >= R) return q_sum(ls[u],ls[v],l,mid,L,R);if (mid < L) return q_sum(rs[u],rs[v],mid + 1,r,L,R);return q_sum(ls[u],ls[v],l,mid,L,R) + q_sum(rs[u],rs[v],mid + 1,r,L,R);
}
inline LL S(int l,int r){return 1ll * (l + r) * (r - l + 1) / 2;
}
inline LL q_pre(int u,int v,int L,int R,int k){int ll = L,rr = R,mid; LL a;while (ll < rr){mid = ll + rr >> 1;a = q_num(u,v,1,N,L,mid);if ((mid - L + 1) - a >= k) rr = mid;else ll = mid + 1;}a = q_sum(u,v,1,N,L,ll);return S(L,ll) - a;
}
inline LL q_post(int u,int v,int L,int R,int k){int ll = L,rr = R,mid,a;while (ll < rr){mid = ll + rr + 1 >> 1;a = q_num(u,v,1,N,mid,R);if ((R - mid + 1) - a >= k) ll = mid;else rr = mid - 1;}a = q_sum(u,v,1,N,mid,R);return S(ll,R) - a;
}
void work(){int l,r,L,R,a,s; LL ans,b;while (m--){l = read(); r = read(); L = read(); R = L + r - l; ans = 0;if (L > 1){a = q_num(rt[r],rt[l - 1],1,N,1,L - 1);if (a){s = q_sum(rt[r],rt[l - 1],1,N,1,L - 1);b = q_pre(rt[r],rt[l - 1],L,R,a);ans += b - s;}}a = q_num(rt[r],rt[l - 1],1,N,R + 1,N);if (a){s = q_sum(rt[r],rt[l - 1],1,N,R + 1,N);b = q_post(rt[r],rt[l - 1],L,R,a);ans += s - b;}printf("%lld\n",ans);}
}
int main(){n = read(); m = read(); N = 1000000 + n + 1; int x;REP(i,n){x = read(),modify(rt[i],rt[i - 1],1,N,x);}work();return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/9191209.html

洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】相关推荐

  1. 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)

    题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...

  2. 【洛谷P3701】 「伪模板」主席树【网络流】

    题目大意: 题目链接:https://www.luogu.org/problemnew/show/P3701 byx和手气君都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家 ...

  3. P4559 [JSOI2018]列队 主席树

    传送门 文章目录 题意: 思路: 题意: 给你nnn个学生以及其位置,mmm个询问,每次询问[l,r][l,r][l,r]的学生跑到[k,k+r−l][k,k+r-l][k,k+r−l]的位置的最小总 ...

  4. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  5. 洛谷P1182 数列分段Section II 二分答案

    洛谷P1182 数列分段Section II 二分答案 题意:将 n 个 数 分为 m段 求一种方案,使这m段中最大的和 最小 额..可能有点拗口,其实就是说每一种方案,都有对应的 每段和的最大值, ...

  6. 洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树

    题目传送门: 洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树 题目描述 伐木工人 Mirko 需要砍 M 米长的木材.对 Mirko 来说这是很简单的工作,因为他有一个漂亮 ...

  7. 洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树(二分法)

    题目链接 : 洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 文章目录 前言 一.题目 题目描述 输入格式 输出格式 输入输出样例 说明/提示 二.代码 前言 第一次写博客, ...

  8. 信息学奥赛一本通 1107:校门外的树 | 1931:【05NOIP普及组】校门外的树 | OpenJudge NOI 1.6 06 | 洛谷 P1047 [NOIP2005 普及组] 校门外的树

    [题目链接] ybt 1107:校门外的树 ybt 1931:[05NOIP普及组]校门外的树 OpenJudge NOI 1.6 06:校门外的树 洛谷 P1047 [NOIP2005 普及组] 校 ...

  9. 洛谷P4799 世界冰球锦标赛 搜索+二分

    前言 本来是在做搜索剪枝题单的倒数第二题,发现不会做,看了看题解里大佬说这一题更容易,于是打算先从简单入手. 自己YY了个做法,推了推复杂度,好像能过,码了码交上去WA一片,仔细观察了一下发现是二分之 ...

最新文章

  1. Hessian RPC示例和基于Http请求的Hessian序列化对象传输
  2. Go语言MD5加密用法实例
  3. boost::timer::cpu_timer相关的测试程序
  4. .html追加的触发js事件,JavaScript
  5. 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程
  6. oracle学习笔记一:用户管理(2)创建删除用户
  7. (转)Oracle 临时表用法
  8. .NET6之MiniAPI(九):基于角色的身份验证和授权
  9. LeetCode MySQL 1549. The Most Recent Orders for Each Product
  10. JQMObile 优势
  11. Gym101237C The Palindrome Extraction Manacher、SAM、倍增
  12. 数据和判定(二)------运算符
  13. 医院耗材管理系统开发_7
  14. 计算机基础知识精品课程,计算机应用基础精品课程课件第1课计算机基础知识第课计算机基础.PDF...
  15. 一款好用的国产软件源代码缺陷分析平台 — CodeSense
  16. Elsevier LaTeX 模板中参考文献没有序号,且文章引用不是序号引用
  17. 《阴阳师·3黑川主》原作:梦枕貘
  18. 你一定要掌握的三条IT运维面试技巧
  19. [总结]CSS/CSS3常用样式与web移动端资源
  20. 2018年8月win10教育版education最新激活密钥

热门文章

  1. CRecordset类
  2. 集成算法——Adaboost代码
  3. 一、uniapp项目(封装异步请求、moment.js时间处理、封装手势滑动组件、下载图片到本地)
  4. 王道考研学习笔记IP数据报格式IP数据报分片(超详细)
  5. LeetCode 2011. 执行操作后的变量值
  6. ZooKeeper 保证数据一致性
  7. linux xp镜像文件,让Windows XP镜像文件小一点儿(转)
  8. android c 11 编译,Android NDK r9b和编译C 11
  9. 小案例:搭建简易版王者荣耀英雄购买商城网页版
  10. python输出50-150之间不能被5整除的整数代码解读