首页 > 其他分享 >[HEOI2016/TJOI2016]排序

[HEOI2016/TJOI2016]排序

时间:2022-12-14 20:45:09浏览次数:44  
标签:lazy return int tree mid TJOI2016 HEOI2016 排序 data

https://www.luogu.com.cn/problem/P2824 题解:仔细思考可以发现这道题与https://arc101.contest.atcoder.jp/tasks/arc101_b?lang=en 是等价的。二分之后原问题就转化为了$0,1$序列,可以直接用线段树维护。 ``` #include using namespace std; struct node { int l,r,data,lazy; }; struct reads { int op,l,r; }; node tree[1000001]; reads q[1000001]; int a[1000001],p[1000001],n,m,Q; void build(int k,int l,int r) { tree[k].l=l; tree[k].r=r; tree[k].lazy=-1; int mid=(l+r)/2; if (l==r) { tree[k].data=p[l]; return; } build(k*2,l,mid); build(k*2+1,mid+1,r); tree[k].data=tree[k*2].data+tree[k*2+1].data; return; } void spread(int k) { if (tree[k].lazy==0) { tree[k].lazy=-1; tree[k*2].lazy=tree[k*2+1].lazy=tree[k*2].data=tree[k*2+1].data=0; return; } if (tree[k].lazy==1) { tree[k].lazy=-1; tree[k*2].data=tree[k*2].r-tree[k*2].l+1; tree[k*2+1].data=tree[k*2+1].r-tree[k*2+1].l+1; tree[k*2].lazy=tree[k*2+1].lazy=1; return; } return; } void add(int k,int l,int r,int d) { if (l>r) return; if (tree[k].l==l&&tree[k].r==r) { tree[k].data=d*(tree[k].r-tree[k].l+1); tree[k].lazy=d; return; } spread(k); int mid=(tree[k].l+tree[k].r)/2; if (l<=mid&&r<=mid) { add(k*2,l,r,d); tree[k].data=tree[k*2].data+tree[k*2+1].data; return; } if (l>=mid+1&&r>=mid+1) { add(k*2+1,l,r,d); tree[k].data=tree[k*2].data+tree[k*2+1].data; return; } add(k*2,l,mid,d); add(k*2+1,mid+1,r,d); tree[k].data=tree[k*2].data+tree[k*2+1].data; return; } int sum(int k,int l,int r) { if (tree[k].l==l&&tree[k].r==r) return tree[k].data; spread(k); int mid=(tree[k].l+tree[k].r)/2; if (l<=mid&&r<=mid) return sum(k*2,l,r); if (l>=mid+1&&r>=mid+1) return sum(k*2+1,l,r); return sum(k*2,l,mid)+sum(k*2+1,mid+1,r); } bool msort(int S) { int res; for (int i=1;i<=n;++i) p[i]=(a[i]>=S); build(1,1,n); for (int i=1;i<=m;++i) { res=sum(1,q[i].l,q[i].r); if (q[i].op==0) { add(1,q[i].l,q[i].r-res,0); add(1,q[i].r-res+1,q[i].r,1); } else { add(1,q[i].l,q[i].l+res-1,1); add(1,q[i].l+res,q[i].r,0); } } return sum(1,Q,Q); } int main() { cin>>n>>m; for (int i=1;i<=n;++i) cin>>a[i]; for (int i=1;i<=m;++i) cin>>q[i].op>>q[i].l>>q[i].r; cin>>Q; int first=1,last=n,mid,ans=1; while (first<=last) { mid=(first+last)/2; if (msort(mid)) { ans=max(ans,mid); first=mid+1; } else last=mid-1; } cout<

标签:lazy,return,int,tree,mid,TJOI2016,HEOI2016,排序,data
From: https://www.cnblogs.com/zhouhuanyi/p/16983467.html

相关文章

  • Python实现从一个列表数据里随机抽取数据,并且按原有顺序排序
    背景:工作中需要实现从多个条件中随机抽取几个条件,进行组合查询的功能。而查询的结果需要按原顺序进行判断是否符合查询条件。分析:这些条件可以放在列表里,这就需要实现一个......
  • 8 多路召回的融合排序
    融合排序:将多种召回排序的列表进行融合为一个列表......
  • 第一百一十三篇: JS数组Array(二)数组方法 栈、队列、排序
    好家伙,  在上一篇中,我们知道了,JS的数组中每个槽位可以存储任意类型的数据那么,我们能通过数组去模仿某些数据结构吗?答案是肯定的 1.栈方法ECMAScript给数组......
  • vue el-upload 上传拖拽排序
    <template><!--省略其他配置--><el-uploadref="upload":file-list.sync="fileList"></el-upload></template><script>importSortablefrom'sortablejs......
  • 基本排序算法总结(转)
    基本排序算法总结原文:https://blog.csdn.net/qq_21187515/article/details/127212565一直想总结一下最常用的排序算法,自己写一下代码并运行一下记忆更深刻1、插入排序......
  • 接口设计 多字段表格 排序 查询Token
    www.tapd.cn   每个字段都支持排序https://www.tapd.cn/api/basic/token/generate_token_from_array{  "workspace_id":"33345311",  "data":{ ......
  • LeetCode80. 删除排序数组中的重复项 II
    给定一个排序数组,你需要在​​原地​​删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在​​原地​​修改输入数组并在......
  • sort命令,排序命令
    1.参数说明-f忽略大小写-b忽略前面空格符-M以月份的名字排序-n以纯数字来排序-r反向排序-uuniq,相同的数据仅出现一行-t分隔符-k在那个区间进行排序2.示例......
  • 排序算法
    10.1内部排序与外部排序内部排序:待排序的所有记录全部存放在计算机内存中,整个排序过程不需要访问外存外部排序:等待排序的记录数量很大,以至于整个序列的排序过程不可能在......
  • Swift使用Core Data查询排序的方法
    主要是使用fetchRequest.sortDescriptors=[NSSortDescriptor.init(key:"key",ascending:true)]来进行排序效果如下letapp=UIApplication.shared.del......