填坑 bzoj3337
算是个板子题吧,就是不知道啥时候能写出来。
#include<cstring>
#include<iostream>
#include<cctype>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#define writ(x,c) write(x),putchar(c);
typedef long long ll;
const int N=,MAX=<<;
using namespace std;
inline int read()
{
char c;int x=;bool f=;
for(;!isdigit(c);c=getchar()) if(c=='-') f=;
for(;isdigit(c);c=getchar()) x=(x<<)+(x<<)+(c^);
return (f ? -x : x);
}
template <class _T>
void write(_T x)
{
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}
int n,m,size;
struct node
{
int d[],s[],rev,add,same,size,next;
ll sum;
}a[N];
queue<int> q;
void Init()
{
}
int new_node()
{
int temp=q.front();q.pop();
return temp;
}
void clear(int x){a[x].rev=a[x].add=a[x].same=a[x].size=a[x].rev=;}
void erase(int x){q.push(x);clear(x);}
void find(int &pos,int &now)
{
for(now=;a[now].next!=-&&pos>a[now].size;now=a[now].next)
pos-=a[now].size;
}
void down(int now)
{
int tot=a[now].size;
if(a[now].rev)
{
a[now].rev=false;
int tt=(tot>>);
for(int u=;u<=tt;u++) swap(a[now].d[u],a[now].d[tot-u+]);
}
if(a[now].same!=)
{
for(int u=;u<=tot;u++)
a[now].d[u]=a[now].same;
a[now].sum=a[now].same*tot,a[now].same=;
}
if(a[now].add!=)
{
for(int u=;u<=tot;u++)
a[now].d[u]+=a[now].add;
a[now].sum=a[now].sum+a[now].add*tot,a[now].add=;
}
}
void update(int x)
{
a[x].sum=;
for(int u=;u<=a[x].size;u++)
a[x].sum+=a[x].d[u],a[x].s[u]=a[x].d[u];
sort(a[x].s+,a[x].s+a[x].size+);
}
void spilt(int now,int pos)
{
down(now);
int t=new_node();
for(int u=pos;u<=a[now].size;u++)
a[t].d[++a[t].size]=a[now].d[u];
a[t].next=a[now].next,a[now].next=t,a[now].size=max(pos-,);
update(t);update(now);
}
void Merge(int now)
{
int k=a[now].next;
down(now);down(k);
for(int u=;u<=a[k].size;u++)
a[now].d[++a[now].size]=a[k].d[u];
a[now].next=a[k].next;erase(k);
update(now);
}
void maintain(int now)
{
for(;now!=-;now=a[now].next)
if(a[now].next!=-&&a[now].size+a[a[now].next].size<=size)
Merge(now);
}
void ins(int pos,int x)
{
int now;pos++;
find(pos,now);spilt(now,pos);
a[now].d[++a[now].size]=x,a[now].sum+=x;
int lalal;
for(lalal=;lalal<a[now].size;lalal++)
if(a[now].s[lalal]>x) break;
for(int u=a[now].size;u>lalal;u--)
a[now].s[u]=a[now].s[u-];
a[now].s[lalal]=x;
maintain(now);
}
void del(int pos)
{
int now;
find(pos,now);down(now);
for(int u=pos+;u<=a[now].size;u++)
a[now].d[u-]=a[now].d[u];
a[now].size--;
update(now);maintain(now);
}
void solve(int l,int r,int &lp,int &rp)
{
int pos=l;
find(pos,lp);spilt(lp,pos);
pos=r+;
find(pos,rp);spilt(rp,pos);
pos=r;
find(pos,rp);
}
int st[N];
void rverse(int l,int r)
{
int lp,rp;
solve(l,r,lp,rp);
int now=lp,top=;
for(int u=a[lp].next;u!=a[rp].next;u=a[u].next)
st[++top]=u,a[u].rev^=;
a[st[]].next=a[rp].next;
for(int u=top;u>;u--)
a[st[u]].next=st[u-];
a[lp].next=rp;
maintain(lp);
}
void slip(int l,int r,int k)
{
int lp,mp,rp,np;
solve(l,r-k,lp,mp),solve(r-k+,r,mp,rp);
np=a[lp].next,a[lp].next=a[mp].next,a[mp].next=a[rp].next,a[rp].next=np;
maintain(lp);
}
void add(int l,int r,int val)
{
int lp,rp;
solve(l,r,lp,rp);
for(int now=a[lp].next;now!=a[rp].next;now=a[now].next)
a[now].add+=val,a[now].sum=a[now].sum+a[now].size*val;
maintain(lp);
}
void same(int l,int r,int val)
{
int lp,rp;
solve(l,r,lp,rp);
for(int now=a[lp].next;now!=a[rp].next;now=a[now].next)
a[now].add=,a[now].same=val,a[now].sum=a[now].size*val;
maintain(lp);
}
ll getsum(int l,int r)
{
int lp,rp;
solve(l,r,lp,rp);
ll ans=;
for(int now=a[lp].next;now!=a[rp].next;now=a[now].next)
ans=ans+a[now].sum;
maintain(lp);
return ans;
}
int getcha(int l,int r)
{
int lp,rp;
solve(l,r,lp,rp);
int maxx=-MAX,minn=MAX;
for(int now=a[lp].next;now!=a[rp].next;now=a[now].next)
if(a[now].size!=)
if(a[now].same!=)
minn=min(minn,a[now].same+a[now].add),
maxx=max(maxx,a[now].same+a[now].add);
else
minn=min(minn,a[now].s[]+a[now].add),
maxx=max(maxx,a[now].s[a[now].size]+a[now].add);
maintain(lp);
return maxx-minn;
}
int near(int l,int r,int val)
{
int lp,rp;
solve(l,r,lp,rp);
int ans=MAX;
for(int now=a[lp].next;now!=a[rp].next;now=a[now].next)
{
if(a[now].same)
ans=min(ans,abs(val-a[now].same-a[now].add));
else
{
int id=lower_bound(a[now].s+,a[now].s+a[now].size+,val-a[now].add)-a[now].s;
if(id!=a[now].size+)
ans=min(ans,a[now].s[id]+a[now].add-val);
if(id!=)
id--,ans=min(ans,val-a[now].s[id]-a[now].add);
}
}
maintain(lp);
return ans;
}
int rank(int l,int r,int k)
{
int lp,rp;
solve(l,r,lp,rp);
int ll=,rr=MAX;
while(ll<rr)
{
int mid=(ll+rr)/+,sum=;
for(int now=a[lp].next;now!=a[rp].next;now=a[now].next)
{
if(a[now].same!=)
{
if(a[now].same+a[now].add<mid)
sum=sum+a[now].size;
}
else
{
int id=upper_bound(a[now].s+,a[now].s+a[now].size+,mid-a[now].add-)-a[now].s;
sum=sum+max(,id-);
}
}
if(k>=sum) ll=mid;
else rr=mid-;
}
maintain(lp);
return ll;
}
int sec(int l,int r,int val)
{
int lp,rp;
solve(l,r,lp,rp);
int ans=;
for(int now=a[lp].next;now!=a[rp].next;now=a[now].next)
{
if(a[now].same!=)
{
if(a[now].same+a[now].add<val)
ans=ans+a[now].size;
}
else
{
int it=upper_bound(a[now].s+,a[now].s+a[now].size+,val-a[now].add-)-a[now].s;
ans=ans+it-;
}
}
maintain(lp);
return ans;
}
int main()
{
n=read(),size=sqrt(n);
for(int i=;i<N;i++) q.push(i);a[].next=-;a[].size=;
for(int u=;u<=n;u++)
{
int x=read();ins(u-,x);
}
m=read();
while(m--)
{
register int op,x,y,z;op=read();
switch(op)
{
case :x=read();y=read();ins(x,y);break;
case :x=read();del(x);break;
case :x=read();y=read();rverse(x,y);break;
case :x=read();y=read();z=read();slip(x,y,z);break;
case :x=read();y=read();z=read();add(x,y,z);break;
case :x=read();y=read();z=read();same(x,y,z);break;
case :x=read();y=read();writ(getsum(x,y),'\n');break;
case :x=read();y=read();writ(getcha(x,y),'\n');break;
case :x=read();y=read();z=read();writ(near(x,y,z),'\n');break;
case :x=read();y=read();z=read();writ(rank(x,y,z),'\n');break;
case :x=read();y=read();z=read();writ(sec(x,y,z),'\n');break;
}
}
return ;
}
填坑 bzoj3337的更多相关文章
- Android—基于微信开放平台v3SDK,开发微信支付填坑。
接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...
- css 填坑常用代码分享
以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. 因为提交比较麻烦,后来转置github:https://github.com/jsfront/src/blob/mast ...
- 填坑系列:通过ESXi来配置IPMI
近日西安的天气很不错,可是看到从其他地方迁移来的主机在新环境下无法远程调试怪郁闷的,这就需要填坑,要不就会给后来者挖更大的坑. 今天遇到的坑是在IPMI的网络设置里面启用了VLAN标签之后,在新环境下 ...
- Node学习笔记(四):gulp+express+io.socket部署angularJs2(填坑篇)
这篇就先暂停下上篇博客--你画我猜的进度,因为在做这个游戏的时候,想采用最新的ng2技术,奈何坑是一片又一片,这边就先介绍下环境部署和填坑史 既然要用ng2,首先要拿到资源,我这边用的是angular ...
- 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程
Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的 ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
- windows下jenkins常见问题填坑
没有什么高深的东西,1 2天的时间大多数人都能自己摸索出来,这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节点 2. Nuget自动包还原 3. powershell部署 4 ...
- bootstrap-table填坑之旅<一>认识bootstrap-table
应公司需求,改版公司ERP的数据显示样式.由于前期开发的样式是bootstrap,所以选bootstrap-table理所当然(也是因为看了bootstrap-table官网的example功能强大, ...
- 填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT
填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT 警告:发生了重入! 解释:在主循环里调用了一个函数,而在中断服务中又一次调用了同样的函数.当主循环运行到该函数中 ...
随机推荐
- hbase 待看代码
flush split mvcc rpc get put mutation netty reactor模型 page cache 缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操 ...
- Nginx-Tomcat 等运维常用服务的日志分割-logrotate
目录 一 .Nginx-Tomcat 等常用服务日志分析 Nginx 日志 Tomcat日志 MongoDB 日志 Redis 日志 二 .日志切割服务 logrotate 三.日志切割示例 Ngin ...
- node、npm、gulp安装
1.先安装node.js ,官网下载地址:https://nodejs.org/en/ 2.安装完node之后,npm自动就安装了.可以直接在visual studio code 通过命令查看 nod ...
- axios模块封装
1.新建文件夹 network 在文件新建 request.js request.js: import axios from 'axios' export function request (conf ...
- c#专业的UVC摄像头深控类库-SharpCamera介绍
SharpCamera是专业的UVC摄像头深控类库.允许您在C#代码内修改摄像头的高级参数,比如亮度.对比度.清晰度.色调.饱和度.伽玛值.白平衡.逆光对比.增益.缩放.焦点.曝光.光圈.全景.倾斜. ...
- ListView 根据 文件路径 或 扩展名 显示系统文件图标
private void 获取文件button1_Click(object sender, EventArgs e) { folderBrowserDialog1 ...
- javascript(六)运算符
运算符概述 JavaScript中的运算符用于算术表达式. 比较表达式. 逻辑表达式. 赋值表达式等.需要注意的是, 大多数运算符都是由标点符号表示的, 比如 "+" 和" ...
- 如何提升Web前端性能?
什么是WEB前端呢?就是用户电脑的浏览器所做的一切事情.我们来看看用户访问网站,浏览器都做了哪些事情:输入网址 –> 解析域名 -> 请求页面 -> 解析页面并发送页面中的资源请求 ...
- javascript 函数表达和闭包
函数表达式和闭包 针对JS高级程序设计这本书,主要是理解概念,大部分要点源自书内.写这个主要是当个笔记加总结 存在的问题请大家多多指正! 定义函数的两种方法 函数声明: function functi ...
- 78.3D立体轮播图(完整兼容手机端和pc端)
效果呈现来源于http://www.jq22.com/demo/jR3DCarousel-master20160315/ 在此基础上改成需要的3个分类的3D图 由于原有的不支持粘贴复制显示3个分类 我 ...