CCPC-Wannafly Winter Camp Day5 (Div2, onsite) Sorting(线段树)
题意
对序列进行三种操作:
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(线段树)的更多相关文章
- CCPC-Wannafly Winter Camp Day5 (Div2, onsite)
Replay: Dup4: 时间复杂度算不对? 一点点思路不经过验证就激动的要死? 浪费自己一个小时还浪费别人一个小时? 对1e3不敏感? 1e3 * 1e3是多少? 模拟建边跑dp不写非要写个大模拟 ...
- 2019 CCPC-Wannafly Winter Camp Day5(Div2, onsite)
solve 5/11 补题:7/11 A Cactus Draw Code:zz Thinking :zz 题意:要在n*n的网格内画上一棵节点数为n树,使得没有边相交. 很好想的构造题,因为网格有n ...
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- CCPC-Wannafly Winter Camp Day3 (Div2, onsite)
Replay Dup4: 没想清楚就动手写? 写了两百行发现没用?想的还是不够仔细啊. 要有莽一莽的精神 X: 感觉今天没啥输出啊, 就推了个公式?抄了个板子, 然后就一直自闭A. 语文差,题目没理解 ...
- 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)
solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...
- 2019 CCPC-Wannafly Winter Camp Day7(Div2, onsite)
solve 6/11 补题: A.迷宫 Code:zz Thinking:zz kk 把每个节点的深度都处理出来,同一深度的点的冲突度为 (x-1),x为同层次点数减一. 然后冲突度不断下传(冲突度为 ...
- Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门 Portal 原题目描述在最下面. 简单的 ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- CCPC-Wannafly Winter Camp Day8 (Div2, onsite)
咕咕咕. camp补题. 传送门:https://www.zhixincode.com/contest/29/problems A.Aqours 题意:有一棵有根树,根节点为1,给出每个结点的父 ...
随机推荐
- Unknown column 'user_uid' in 'field list' sql错误解决过程
在idea中运行一直有错,找了好多个地方都找不到,以为是我的字段名字写错了,然而都是对的. 把错误的这个字段删了再打一遍就好了,
- 理解mysql执行多表联合查询
阅读目录 一:inner join(内连接) 二:left join(左连接) 三:right join(右连接) 四:cross join(交叉连接) 五:union操作 六:node+mysql ...
- Facebook第三方网页登录(JavaScript SDK)
文档网址:https://developers.facebook.com/docs/facebook-login/web#logindialog 一.应用配置 https://www.faceboo ...
- C#自定义应用程序上下文对象+IOC自己实现依赖注入
以前的好多代码都丢失了,加上最近时间空一些,于是想起整理一下以前的个人半拉子项目,试试让它们重生.自从养成了架构师视觉 搭建框架之后,越来 越看不上以前搭的框架了.先撸个上下文对象加上实现依赖注入.由 ...
- 【ubuntu】Ubuntu 修改 Apache2 运行用户/用户组及修改方法
我们在安装apache后,有时在上传文件的时候,提示没有权限或者是不可写,我们都会去查文件夹的权限.通过ls -l /var/www/html/website可以很直观的看出我们文件和文件夹的权限,d ...
- JAVA并发包学习
1)CyclicBarrier一个同步辅助类,允许一组线程相互等待,直到这组线程都到达某个公共屏障点.该barrier在释放等待线程后可以重用,因此称为循环的barrier 2)CountDownLa ...
- MySQL系列:数据库基本操作(1)
1. 登录数据库 mysql -h localhost -u root -p 2. 数据库基本操作 2.1 查看数据库 mysql> SHOW DATABASES; +------------- ...
- 修改host,上github
操作如下: 1.http://ping.chinaz.com/ 搜索github.com 海外ip,其实能找到的就两个;然后再搜gist.github.com 海外ip,也是两个. 192.30.25 ...
- Bugku 分析 中国菜刀
解压之后得到了一个流量包,只有不到10KB,美滋滋 先抓重点,过滤出http,只有6条数据记录,3条post,3条response,3条post都是一样的 随便打开一条pos 是一个assert断言, ...
- dl,dt,dd标签的使用
dl就是定义一个列表 dt说明白了就是这个列表的标题dd就是内容,能缩进和UL,OL性质差不多 <dl> <dt>标题标题</dt> <dd>内容内容& ...