算是个板子题吧,就是不知道啥时候能写出来。

#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的更多相关文章

  1. Android—基于微信开放平台v3SDK,开发微信支付填坑。

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...

  2. css 填坑常用代码分享

    以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. 因为提交比较麻烦,后来转置github:https://github.com/jsfront/src/blob/mast ...

  3. 填坑系列:通过ESXi来配置IPMI

    近日西安的天气很不错,可是看到从其他地方迁移来的主机在新环境下无法远程调试怪郁闷的,这就需要填坑,要不就会给后来者挖更大的坑. 今天遇到的坑是在IPMI的网络设置里面启用了VLAN标签之后,在新环境下 ...

  4. Node学习笔记(四):gulp+express+io.socket部署angularJs2(填坑篇)

    这篇就先暂停下上篇博客--你画我猜的进度,因为在做这个游戏的时候,想采用最新的ng2技术,奈何坑是一片又一片,这边就先介绍下环境部署和填坑史 既然要用ng2,首先要拿到资源,我这边用的是angular ...

  5. 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程

    Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的 ...

  6. 【填坑向】spoj COT/bzoj2588 Count on a tree

    这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...

  7. windows下jenkins常见问题填坑

    没有什么高深的东西,1 2天的时间大多数人都能自己摸索出来,这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节点 2. Nuget自动包还原 3. powershell部署 4 ...

  8. bootstrap-table填坑之旅<一>认识bootstrap-table

    应公司需求,改版公司ERP的数据显示样式.由于前期开发的样式是bootstrap,所以选bootstrap-table理所当然(也是因为看了bootstrap-table官网的example功能强大, ...

  9. 填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT

    填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT 警告:发生了重入! 解释:在主循环里调用了一个函数,而在中断服务中又一次调用了同样的函数.当主循环运行到该函数中 ...

随机推荐

  1. vins_fusion学习笔记

    Vins-Fusion源码:https://github.com/HKUST-Aerial-Robotics/VINS-Fusion 摘要 应项目需要,侧重学习stereo+gps融合 转载几篇写的比 ...

  2. 明解C语言 入门篇 第六章答案

    练习6-1 /* 求两个整数中的最小值 */ #include <stdio.h> /*--- 返回三个整数中的最小值 ---*/ int min2(int a, int b) { int ...

  3. lombok的介绍、使用、简单分析和插件

    学习下Lombok. 关于POJO Java面向对象编程中的特性中有封闭性和安全性.封闭性即对类中的域变量进行封闭操作,即用private来修饰他们.如此一来,其他类就不能对该变量访问了.这样,我们就 ...

  4. 彩虹表(rainbow table)

    前记 MD5的全称是Message-Digest Algorithm 5(信息-摘要算法): 特点是不可逆的,一般解密不了:那有没有想过,为什么各种工具网站都可以进行MD5解密呢?https://ww ...

  5. 目标检测算法之R-CNN和SPPNet原理

    一.R-CNN的原理 R-CNN的全称是Region-CNN,它可以说是第一个将深度学习应用到目标检测上的算法.后面将要学习的Fast R-CNN.Faster R-CNN全部都是建立在R-CNN基础 ...

  6. 阿里OSS前端直传

    第一次写博客,如有错误请多多指教. 先上代码吧: ossUpload = function (file, fun, funParameter) { //第一此请求后台服务器获取认证请求 $.ajax( ...

  7. css+js实现自动伸缩导航栏

    用css+js实现自动伸缩导航栏 需要达到的效果: 默认首页选中样式 设置鼠标滑过效果:颜色变化(#f60),宽度变化,字体变化 所涉及的知识点: 布局:float css: 元素状态切换(displ ...

  8. webuploader-异步切片上传(暂不支持断点续传)及 下载方法!C#/.NET

    十年河东,十年河西,莫欺少年穷 学无止境,精益求精 进入正题: 关于webuploader,参考网址:https://fex.baidu.com/webuploader/: 本篇博客范例下载地址:ht ...

  9. QML MultiPointTouchArea

    MultiPointTouchArea为qml中的多点触摸提供了最基本.最重要的支持,它与TouchPoint及相关域结合,可以说是qml中多点触摸的基石. MultiPointTouchArea是不 ...

  10. 服务刚启动就 Old GC,要闹哪样?

    1.背景 最近有个同学说他的服务刚启动就收到两次 Full GC 告警, 按道理来说刚启动,对象应该不会太多,为啥会触发 Full GC 呢? 带着疑问,我们还是先看看日志吧,毕竟日志的信息更多. 2 ...