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

题目链接

洛谷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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021十大科技趋势来了!阿里巴巴达摩院全新发布

来源&#xff1a; 阿里技术阿里巴巴达摩院发布2021十大科技趋势&#xff0c;这是达摩院成立三年以来第三次发布年度科技趋势。2020年是不平凡的一年&#xff0c;经历疫情的洗礼&#xff0c;许多行业重启向上而生的螺旋&#xff0c;但疫情并未阻挡科技前进的脚步&#xff0c;量子…

Leetcode--342. 4的幂

给定一个整数 (32 位有符号整数)&#xff0c;请编写一个函数来判断它是否是 4 的幂次方。 示例 1: 输入: 16 输出: true 示例 2: 输入: 5 输出: false 进阶&#xff1a; 你能不使用循环或者递归来完成本题吗&#xff1f; 方法一&#xff1a; class Solution { public …

bzoj 1731: [Usaco2005 dec]Layout 排队布局【差分约束】

差分约束裸题&#xff0c;用了比较蠢的方法&#xff0c;先dfs_spfa判负环&#xff0c;再bfs_spfa跑最短路 注意到“奶牛排在队伍中的顺序和它们的编号是相同的”&#xff0c;所以\( d_i-d_{i-1}>0 \),连(i,i-1,0)&#xff1b;然后对于\( d_i-d_j<L \)&#xff0c;连(j,i,…

从GPT-3到DETR,一起来盘点2020有哪些突破?

来源&#xff1a;深度学习技术前沿2020年是巨大飞跃的一年。从OpenAI的GPT-3&#xff0c;再到AlphaFold&#xff0c;都是令人振奋的成就。与此同时&#xff0c;数据科学在机器学习、自然语言处理&#xff08;NLP&#xff09;、计算机视觉等领域中蓬勃发展。一起来逐一盘点2020的…

java script 技巧_java script 技巧

事件源对象event.srcElement.tagNameevent.srcElement.type捕获释放event.srcElement.setCapture();event.srcElement.releaseCapture();事件按键event.keyCodeevent.shiftKeyevent.altKeyevent.ctrlKey事件返回值event.returnValue鼠标位置event.xevent.y窗体活动元素document…

个人作业5——软工个人总结

一、请回望开学时的第一次作业&#xff0c;你对于软件工程课程的想象 对比开篇博客你对课程目标和期待&#xff0c;“希望通过实践锻炼&#xff0c;增强计算机专业的能力和就业竞争力”&#xff0c;对比目前的所学所练所得&#xff0c;在哪些方面达到了你的期待和目标&#xff…

我国5G基站达71.8万个,助力人工智能发展!

来源&#xff1a;新华社2020中国人工智能高峰论坛暨中国人工智能大赛成果发布会23日在厦门举办。论坛上&#xff0c;中国工业和信息化部副部长刘烈宏介绍&#xff0c;截至今年11月&#xff0c;我国累计建成5G基站71.8万个&#xff0c;为人工智能海量数据的成长和传输提供了坚实…

java如何对list进行排序_java中如何对list进行排序

java类中用Collections的sort方法对一个list进行排序&#xff0c;比较简单先建一个User对象public class User {public String name;public Integer age;public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;}public String getName() {retu…

LR中url和html两种录制模式

http://www.cnblogs.com/fnng/archive/2013/02/28/2937805.html转载于:https://www.cnblogs.com/zzzao/p/9196044.html

《自然》预测2021年值得关注的科学事件

来源&#xff1a;世界科技研究与发展作者&#xff1a;黄小容2020年12月22日&#xff0c;Nature官网发布了对2021年最值得关注科学事件的预测。1 气候变化问题卷土重来

Leetcode--3. 无重复字符的最长子串

给定一个字符串&#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符…

java语言_java语言学习

现在最流行的编程语言就是java了&#xff0c;学习java要怎样学习&#xff0c;有要注意哪些呢&#xff1f;首先要确定学习将来要干嘛&#xff0c;确定好之后就一直朝着这个方向努力&#xff0c;不放弃就行了。首先&#xff0c;需要明确的是Java已经不是一门简单的语言&#xff0…

重磅!基金委发布科研不端行为调查处理办法

编辑 ∑Gemini来源&#xff1a;国家自然科学基金委关于印发《国家自然科学基金项目科研不端行为调查处理办法》的通知国科金发诚〔2020〕96号各局&#xff08;室&#xff09;、科学部&#xff0c;机关党委&#xff0c;各直属单位&#xff1a;《国家自然科学基金项目科研不端行为…

Leetcode--16. 最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数&#xff0c;使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如&#xff0c;给定数组 nums [-1&#xff0c;2&#xff0c;1&#xff0c;-4], 和 target 1…

洛谷 P1377 [TJOI2011]树的序 解题报告

P1377 [TJOI2011]树的序 题目描述 众所周知&#xff0c;二叉查找树的形态和键值的插入顺序密切相关。准确的讲&#xff1a;1、空树中加入一个键值\(k\)&#xff0c;则变为只有一个结点的二叉查找树&#xff0c;此结点的键值即为\(k\)&#xff1b;2、在非空树中插入一个键值\(k\…

不能编程、烧钱、没用?潘建伟直播回应“九章”量子计算争议

来源&#xff1a;腾讯科技在200秒时间内&#xff0c;76个光子穿过中国科学技术大学潘建伟团队精心构筑的光学网络&#xff0c;完成了5000万个样本的高斯玻色采样。而同样一道数学题交给世界上最顶尖 的超级计算机“富岳”&#xff0c;需要6亿年&#xff0c;差距超过了百万亿&a…

Leetcode--209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组&#xff0c;返回 0。 示例: 输入: s 7, nums [2,3,1,2,4,3] 输出: 2 解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组…

java 继承类_java类的继承

继承就是在一个现有类型的基础上&#xff0c;通过增加新的方法或者重定义已有方法(重写)的方式&#xff0c;产生一个新的类型。继承是面向对 象的三个基本特征——封装、继承、多态的其中之一&#xff0c;我们在使用java时编写的每一个类都是在继承&#xff0c;因为在java语言 …

Leetcode--287. 寻找重复数

给定一个包含 n 1 个整数的数组 nums&#xff0c;其数字都在 1 到 n 之间&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。假设只有一个重复的整数&#xff0c;找出这个重复的数。 示例 1: 输入: [1,3,4,2,2] 输出: 2 示例 2: 输入: [3,1,3,4…

2021年,神经科学AI有这几大趋势

来源&#xff1a;The Next Web作者&#xff1a;Tristan Greene编译&#xff1a;科技行者新的一年正向我们招手。延续优良的革命传统&#xff0c;又到了发布最新一期AI专家预测报告的时候。各位受访专家将结合自己的所感所知、实验室发现以及企业动态为我们预测新一年中人工智能…