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

#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. CountdownLatch例子

    CountdownLatch 一个线程或者多个线程等待其他线程完成了再接着往下执行 public class CountDownLatchTest { ); private static Random ...

  2. JVM 的GC算法和垃圾收集器

    1.标记清除算法 黑色部分代表可回收对象,灰色部分代表存活对象,绿色部分代表未使用的.最基础的收集算法就是标记清除算法如同他名字一样,算法分为"标记"和"清除" ...

  3. Java中转换为十六进制的几种实现

    public class HexUtil { private static final String[] DIGITS_UPPER = {"0", "1", & ...

  4. 【JVM】【linux】linux上执行jmap命令查看JVM内存使用情况,报错:sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "gHotSpotVMTypes" in any of the known library name

    运行命令: jmap -heap 报错如下: Attaching to process ID , please wait... sun.jvm.hotspot.debugger.NoSuchSymbo ...

  5. WPF 精修篇 移动TranslateTransform

    原文:WPF 精修篇 移动TranslateTransform 移动 TranslateTransform X 移动X轴 Y 移动Y轴 <StackPanel Orientation=" ...

  6. VB.net 通过句柄操作其他窗口

    Imports System.TextImports System.Runtime.InteropServices Public Class Form1    ' 相关API函数声明,注释掉的这里没用 ...

  7. vue-Element-axios搭建调用api进行数据展示

    1全局安装vue-cli 输入命令:npm install vue-cli -g 2创建项目框架 输入命令:vue init webpack vueapi 3依次按照提示输入,项目名.项目描述.项目作 ...

  8. SpringBoot项目解决全局响应返回中文乱码问题

    一.问题 新建的基于SpringBoot的MVC项目,在请响应体中,如果有中文,会显示为乱码. 二.解决方案 1.在application.properties中设置: spring.http.enc ...

  9. Python学习笔记之json.dump和json.load

    10-11 喜欢的数字:编写一个程序,提示用户输入他喜欢的数字,并使用json.dump()将这个数字存储到文件中.再编写一个程序,从文件中读取这个值,并打印消息“I know your favori ...

  10. Flex,Flash,AS3,AIR的关系和区别

    转自:http://www.admin10000.com/document/156.html 本文详细介绍了 Flash.Flex.AS3.AIR 的关系和区别.希望对初学者有帮助. AS3 Acti ...