题目链接

题意

对序列进行三种操作:

1、区间求和。

2、将区间小于等于$x$的数不改变相对顺序的前提下放到$x$左边,用同样规则将比$x$大的放到右边。

3、将区间大于$x$的数不改变相对顺序的前提下放到$x$左边,用同样规则将小于等于$x$的放到右边。

思路

将小于等于和大于$x$的数字分成两类,发现同类之间的相对顺序不改变,可以通过线段树维护区间内同类数字的数量和位置来获得区间真实值,使用前缀和维护两类数字序列的任意子段和。

代码

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <cassert>
#include <cstring>
#include <iostream>
#include <algorithm> #define IOS ios::sync_with_stdio(0),cin.tie(0);
#define DBG(x) cerr << #x << " = " << x << endl; using namespace std; typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL; const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const double eps = 1e-8;
const double pi = acos(-1.0); void file(){
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
} namespace BakuretsuMahou{ const int maxn = 2e5+5; int n,q,x;
LL a[maxn];
LL p1[maxn],p0[maxn],top1,top0; struct node{
int l,r;
LL val,laz;
}tree[maxn<<2]; void pushup(int u){
tree[u].val=tree[u<<1].val+tree[u<<1|1].val;
} void pushdown(int i,int len){
if(tree[i].laz){
tree[i<<1].laz=tree[i].laz;
tree[i<<1|1].laz=tree[i].laz;
tree[i<<1].val=(len-(len>>1))*(tree[i].laz-1);
tree[i<<1|1].val=(len>>1)*(tree[i].laz-1);
tree[i].laz=0;
}
} void build(int i,int l,int r){
tree[i].l=l;
tree[i].r=r;
tree[i].laz=0;
if(l == r){
tree[i].val=a[r];
return;
}
int mid=(l+r)>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
pushup(i);
} void update(int i,int l,int r,int L,int R,int c){
if(L <= l && r <= R){
tree[i].val=(r-l+1)*c;
tree[i].laz=c+1;
return;
}
pushdown(i,r-l+1);
int mid=(l+r)>>1;
if(L <= mid)update(i<<1,l,mid,L,R,c);
if(R > mid)update(i<<1|1,mid+1,r,L,R,c);
pushup(i);
} LL query(int i,int l,int r,int L,int R){
LL res=0;
if(L <= l && r <= R){
res=tree[i].val;
return res;
}
pushdown(i,r-l+1);
int mid=(l+r)>>1;
if(L <= mid)res+=query(i<<1,l,mid,L,R);
if(R > mid)res+=query(i<<1|1,mid+1,r,L,R);
return res;
} void Explosion(){
scanf("%d%d%d",&n,&q,&x);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i] > x)p1[++top1]=a[i],a[i]=1;
else p0[++top0]=a[i],a[i]=0;
}
for(int i=2;i<=top1;i++)p1[i]+=p1[i-1];
for(int i=2;i<=top0;i++)p0[i]+=p0[i-1];
build(1,1,n);
while(q--){
int op,l,r;
scanf("%d%d%d",&op,&l,&r);
if(op == 1){
int num1=query(1,1,n,l,r),num0=r-l+1-num1;
int pre1=0,pre0=0;
if(l > 1){
pre1=query(1,1,n,1,l-1);
pre0=l-1-pre1;
}
printf("%lld\n",p1[pre1+num1]-p1[pre1]+p0[pre0+num0]-p0[pre0]);
}
if(op == 2){
int num1=query(1,1,n,l,r),num0=r-l+1-num1;
update(1,1,n,l,l+num0-1,0);
update(1,1,n,l+num0,r,1);
}
if(op == 3){
int num1=query(1,1,n,l,r);
update(1,1,n,l,l+num1-1,1);
update(1,1,n,l+num1,r,0);
}
}
}
} int main(){
//IOS
//file();
BakuretsuMahou::Explosion();
return 0;
}

在$camp$补的第一个题,懒惰啊。

CCPC-Wannafly Winter Camp Day5 (Div2, onsite) Sorting(线段树)的更多相关文章

  1. CCPC-Wannafly Winter Camp Day5 (Div2, onsite)

    Replay: Dup4: 时间复杂度算不对? 一点点思路不经过验证就激动的要死? 浪费自己一个小时还浪费别人一个小时? 对1e3不敏感? 1e3 * 1e3是多少? 模拟建边跑dp不写非要写个大模拟 ...

  2. 2019 CCPC-Wannafly Winter Camp Day5(Div2, onsite)

    solve 5/11 补题:7/11 A Cactus Draw Code:zz Thinking :zz 题意:要在n*n的网格内画上一棵节点数为n树,使得没有边相交. 很好想的构造题,因为网格有n ...

  3. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  4. CCPC-Wannafly Winter Camp Day3 (Div2, onsite)

    Replay Dup4: 没想清楚就动手写? 写了两百行发现没用?想的还是不够仔细啊. 要有莽一莽的精神 X: 感觉今天没啥输出啊, 就推了个公式?抄了个板子, 然后就一直自闭A. 语文差,题目没理解 ...

  5. 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)

    solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...

  6. 2019 CCPC-Wannafly Winter Camp Day7(Div2, onsite)

    solve 6/11 补题: A.迷宫 Code:zz Thinking:zz kk 把每个节点的深度都处理出来,同一深度的点的冲突度为 (x-1),x为同层次点数减一. 然后冲突度不断下传(冲突度为 ...

  7. Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门  Portal  原题目描述在最下面.  简单的 ...

  8. CCPC Wannafly Winter Camp Div2 部分题解

    Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...

  9. CCPC-Wannafly Winter Camp Day8 (Div2, onsite)

    咕咕咕.    camp补题. 传送门:https://www.zhixincode.com/contest/29/problems A.Aqours 题意:有一棵有根树,根节点为1,给出每个结点的父 ...

随机推荐

  1. django--use

    https://docs.djangoproject.com/zh-hans/2.0/intro/

  2. 浅析String类

    这是对于String类的一些总结,我将会从几个方面并且结合着字符串池等相关知识进行总结 进程如下:                1.对于String类基本知识的一些总结 2.简要介绍字符串池 3.分 ...

  3. C# GDI+绘制一维条码打印模糊的解决办法

    最近遇到使用zxing生成的一维条码打印出来的条码图形很模糊根本识别不了.其实原因只有一句话: bitmap没有直接使用PrintDocument的Graphics画布进行绘制,而是中间处理了一下外部 ...

  4. centos6.8 配置mysql赋予mysql远程连接权限

    1.关掉防火墙 2.检查3306端口是否开放 3.修改用户用户权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '您的数据库密码' ...

  5. C#while死循环时候cpu占用比例大

    C#while死循环时候cpu占用比例大 原因:线程等不到释放,windows运行模式是抢占资源 解决方法:休眠一毫秒让垃圾回收可以进来回收资源 while (true) { Thread.Sleep ...

  6. linux下安装PHP扩展memcache

    公司的服务器 CentOS 7.5,PHP 5.6 下面都是最新的版本(支持到PHP5.6) 如需php7  下支持memcache扩展,请移步   https://www.cnblogs.com/h ...

  7. php函数 array_column

    <?php $arr = [ [ 'id'=>1, 'name'=>'wang', 'age'=>10 ], [ 'id'=>2, 'name'=>'yong', ...

  8. Linux(Ubuntu 16) 下Java开发环境的配置(一)------JDK的配置

    前言: 本文介绍的是通用的安装方法,一般linux系统均可使用该方法安装.本文以Java8环境为例进行配置.   1.JDK的下载 进入java下载页(http://www.oracle.com/te ...

  9. ASP.NET MVC系列:web.config中ConnectionString aspnet_iis加密与AppSettings独立文件

    1. web.config中ConnectionString aspnet_iis加密 web.config路径:E:\Projects\Libing.Web\web.config <conne ...

  10. Datatable get请求传参应用

    以关注页面为例: html: <div class="row"> <div class="col-md-12 col-sm-12 col-xs-12&q ...