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

#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. 利用SQL计算两个地理坐标(经纬度)之间的地表距离

    两个地理坐标(经纬度)地表距离计算公式: 公式解释如下: Long1,Lat1表示A点经纬度,Long2,Lat2表示B点经纬度: a=Lat1–Lat2 为两点纬度之差,b=Long1-Long2为 ...

  2. Python程序调试工具Py-Spy

    序言 如果你是从Java语言开发转Python开发,可能在庆幸自己的开发效率提高了很多,但是也有痛苦的时候,比如你会怀念jstack,jmap, 等各种工具在生产环境做perfomance tunin ...

  3. Scala 系列(五)—— 集合类型综述

    一.集合简介 Scala中拥有多种集合类型,主要分为可变的和不可变的集合两大类: 可变集合: 可以被修改.即可以更改,添加,删除集合中的元素: 不可变集合类:不能被修改.对集合执行更改,添加或删除操作 ...

  4. 制作一个SSRS的ORACLE数据库报表,使用了时间类型的参数。

    需求:我们这个报表是以月为单位,呈现的数据为查询为当前月的第一天到最后一天.条件类似于:time_day > 20140601 and  time_day < 20140630 因为是让用 ...

  5. idea更改之前保存的git账号和密码

    1.打开控制面板 2.用户账户 3.管理windows凭据 4.点击里面的git就可以修改了

  6. 解决Hangfire 导致服务器内存飙涨

    最近因为项目需要调度作业服务,之前看张队推荐过一篇https://www.cnblogs.com/yudongdong/p/10942028.html 故直接拿过来实操,发现很好用,简单.方便  执行 ...

  7. 数据库——可视化工具Navicat、pymysql模块、sql注入问题

    数据库--可视化工具Navicat.pymysql模块.sql注入问题 Navicat可视化工具 Navicat是数据库的一个可视化工具,可直接在百度搜索下载安装,它可以通过鼠标"点点点&q ...

  8. nginx配置不当容易产生的安全问题

    nginx一般用于做外网代理,配置也比较方便,但是配置不当的时候会产生一些安全问题.其中包括各个大厂也都出现过. intra server ->  proxy -> nginx 一般正常的 ...

  9. mysql单个表拆分成多个表

    一.横向拆分 create table 新表的名称 select * from 被拆分的表 order by id limit int1,int2 int1为其实位置,int2为几条 注意:这样拆分后 ...

  10. 解决securecrt连接慢(而xshell秒连)的问题

    打开securecrt的跟踪选项,观察输出信息来诊断 解决方法: 1)首先,将全局设置中,GSSAPI属性由自动改为GSSAPI   2)其次,将不支持的多余的密钥交换去掉   3)最后,可以将服务端 ...