填坑 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 警告:发生了重入! 解释:在主循环里调用了一个函数,而在中断服务中又一次调用了同样的函数.当主循环运行到该函数中 ...
随机推荐
- Extra:Variable Types
文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本系列原更新于作者的github博客,这里给出链接. 在我们使用Cg或者HLSL进行shader编写的过程中,常常涉及到一些变量 ...
- cmd命令和linux命令的区别
cmd命令和linux命令看起来很相似,都是在一个控制台输入一些特定的指令去完成一些特定的操作.可是用过的朋友就会发现这些指令是有很多不同的,可是到底有什么不同,要说又说不上来,所以要了解一下. cm ...
- thread stack size not set; configure via D:\Program Files\elasticsearch-5.0.0\config\jvm.options or ES_JAVA_OPTS
抄自:http://blog.csdn.net/leo063/article/details/52994786 thread stack size not set; configure via D:\ ...
- DSAPI CMD命令行进程代理
DSAPI.文件.CMD命令行进程代理,是用来和CMD.exe或指定exe进行输出重定向的简化使用工具,可隐藏或显式地启动一个cmd.exe,并将输出流.输入流和错误流重定向至代理,通过事件触发方式与 ...
- C#中字符串的操作大全
一.C#中字符串的建立过程 例如定义变量 strT="Welcome to "; strT+="www.cuit.edu.cn"; 程序首先创建一个System ...
- Asp.net MVC企业级开发(01)---Autofac
1.1 控制反转 在面向对象设计的软件系统中,它的底层都是由N个对象构成的,各个对象之间通过相互合作,最终实现系统的业务逻辑.同时,对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础.但是 ...
- Vue – 基础学习(4):事件修饰符
Vue – 基础学习(3):事件修饰符
- Java 之 JDK 1.8 新增日期时间类型
一.原来的日期时间 Java1.0中包含了一个Date类,但是它的大多数方法已经在Java 1.1引入Calendar类之后被弃用了.而Calendar并不比Date好多少.它们面临的问题是: ① 可 ...
- 同步fifo与异步fifo
参考以下帖子: https://blog.csdn.net/hengzo/article/details/49683707 https://blog.csdn.net/Times_poem/artic ...
- 安恒Red Team 内部红蓝对抗框架
0x00 准备钓鱼攻击(从公开资源) 1.常见的红队攻击向量和技术 2.常见的蓝队侦查和预防控制 0x02 发送钓鱼邮件(到目标组织员工邮箱地址) 1.常见的红队攻击向量和技术 2.常见的蓝 ...