洛谷3863,时间与原始序列的转化
来源:互联网 发布:淘宝联盟结算金额不对 编辑:程序博客网 时间:2024/06/06 17:17
传送门
题解就不说了。
感觉官方题解3很妙,由此可以归纳出一个通用方法,以解决支持区间修改,单点查询历史中满足某个条件的个数这一类问题。
据说有黑魔法的
#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const int N=1000010,M=3000;typedef long long ll;int n,q,a[N],i,l,r,x,p,y,o,xb,ans[N];struct query{ int o,i,t,x; bool operator<(const query&x)const{ return i==x.i?o<x.o:i<x.i; }}b[N];struct block{ int sz,be[M],en[M],i,x,y,z,num[N],bs,j,k,ans; pair<ll,int> a[N],b[N],c[N]; ll tag[M]; inline void init(){ sz=sqrt(q); for(i=1;i<=q;++i)num[i]=(i-1)/sz+1,a[i]=make_pair(0,i); bs=num[q]; be[1]=1; en[1]=sz; for(i=2;i<bs;++i)be[i]=be[i-1]+sz,en[i]=en[i-1]+sz; be[bs]=en[bs-1]+1; en[bs]=q; } inline void add(int p,ll v){ x=num[p]; for(i=x+1;i<=bs;++i)tag[i]+=v; for(i=be[x],y=z=0;i<=en[x];++i) if(a[i].second>=p)b[++y]=make_pair(a[i].first+v,a[i].second); else c[++z]=a[i]; for(i=j=1,k=be[x];i<=y && j<=z;)a[k++]=b[i]<c[j]?b[i++]:c[j++]; for(;i<=y;)a[k++]=b[i++]; for(;j<=z;)a[k++]=c[j++]; } inline int query(int p,int v){ if(!p)return 0; x=num[p]; for(i=1,ans=0;i<x;++i) ans+=sz+1-(lower_bound(a+be[i],a+en[i]+1,make_pair(1ll*v-tag[i],0))-a-be[i]+1); for(i=be[x];i<=en[x];++i)ans+=a[i].second<=p && 1ll*a[i].first+tag[x]>=v; return ans; }}B;int main(){ scanf("%d%d",&n,&q); for(i=1;i<=n;++i)scanf("%d",a+i); for(i=1;i<=q;++i){ scanf("%d",&o); if(o&1){ scanf("%d%d%d",&l,&r,&x); b[++xb]=(query){o,l,i,x}; b[++xb]=(query){o,r+1,i,-x}; }else{ scanf("%d%d",&p,&y); b[++xb]=(query){o,p,i,y}; } } sort(b+1,b+xb+1); B.init(); for(i=1;i<=q;++i)ans[i]=-1; for(i=1;i<=xb;++i) if(b[i].o&1)B.add(b[i].t,b[i].x); else ans[b[i].t]=B.query(b[i].t-1,1ll*b[i].x-a[b[i].i])+(a[b[i].i]>=b[i].x); for(i=1;i<=q;++i)if(ans[i]>=0)printf("%d\n",ans[i]); return 0;}
阅读全文
0 0
- 洛谷3863,时间与原始序列的转化
- 世界时间与本地时间的转化
- Convert 与转化时间有关的实例
- PHP 时间与字符串的相互转化
- 字符串与时间戳的转化
- PHP 时间与字符串的相互转化
- JAVA的数组 && 原始类型和引用类型以及String与int long相互转化 && String与byte[]相互转化
- 在tomcat中,原始的JSP与转化后的java文件的对应关系
- 时间戳与时间的转化+第二天的表示
- 时间校验 与时间转化
- LDAP的NT时间戳与java时间戳转化
- php笔记之时间与时间戳的转化
- 时间戳与标准时间的相互转化
- iOS_时间戳与时间间的互相转化
- 标准时间格式与时间戳的转化
- iOS 开发 时间与时间戳的相互转化
- 时间戳与时间之间的转化--JavaScript
- js时间戳与时间的相互转化
- 结构体做函数
- CheckBox字符串的拼接
- HttpClient源码解析系列:第四篇:Connection是怎么生成和管理的
- 宽搜入门代码模板详解 HDOJ1253
- 静态链接库与动态链接库的优缺点
- 洛谷3863,时间与原始序列的转化
- java基础9
- next_permutation函数 排序
- flume框架案例之抽取文件
- 1191: 数星星(结构体专题)
- 软件测试黑马工程师--数据库01
- android studio 查看gradlew dependence
- 【POJ 2533】Longest Ordered Subsequence(dp求最长增序列的长度)
- 一个极简的Marching Cubes算法实现