浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html

题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=3110

BZOJ1901,不过是把单点修改区间询问改成区间修改区间询问罢了。

我怕会\(TLE\),就用了区间修改区间询问的树状数组。如果还不会这个的,可以去看看这篇博客

时间复杂度:\(O(mlog^2n)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
using namespace std;
typedef long long ll;
#define low(i) ((i)&(-(i))) const int maxn=5e4+5; bool bo[maxn];
int ans[maxn];
int n,m,ans_cnt; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct Oper {
int opt,l,r,k,id;
}p[maxn],tmp[maxn]; struct tree_array {
ll c[maxn]; void add(int pos,int v) {
if(!pos)return;
for(int i=pos;i<=n;i+=low(i))
c[i]+=v;
} ll query(int pos) {
ll res=0;
for(int i=pos;i;i-=low(i))
res+=c[i];
return res;
}
}T1,T2; ll ask(int pos) {
return 1ll*(pos+1)*T1.query(pos)-T2.query(pos);
} void solve(int l,int r,int st,int ed) {
if(ed<st)return;
if(l==r) {
for(int i=st;i<=ed;i++)
if(p[i].id)ans[p[i].id]=l;
return;
}
int mid=(l+r)>>1,cnt=0;
for(int i=st;i<=ed;i++)
if(p[i].opt==1) {
if(p[i].k>mid) {
bo[i]=0;
T1.add(p[i].l,1),T1.add(p[i].r+1,-1);
T2.add(p[i].l,p[i].l),T2.add(p[i].r+1,-1-p[i].r);
}
else bo[i]=1,cnt++;
}
else {
ll res=ask(p[i].r)-ask(p[i].l-1);
if(res>=p[i].k)bo[i]=0;
else bo[i]=1,p[i].k-=res,cnt++;
}
for(int i=st;i<=ed;i++)
if(p[i].opt==1&&p[i].k>mid) {
T1.add(p[i].l,-1),T1.add(p[i].r+1,1);
T2.add(p[i].l,-p[i].l),T2.add(p[i].r+1,p[i].r+1);
}
int ED=st,ST=st+cnt;
for(int i=st;i<=ed;i++)
if(bo[i])tmp[ED++]=p[i];
else tmp[ST++]=p[i];
for(int i=st;i<=ed;i++)
p[i]=tmp[i];
solve(l,mid,st,ED-1),solve(mid+1,r,ED,ed);
} int main() {
n=read(),m=read();
for(int i=1;i<=m;i++) {
p[i].opt=read(),p[i].l=read(),p[i].r=read(),p[i].k=read();
if(p[i].opt==2)p[i].id=++ans_cnt;
}
solve(1,n,1,m);
for(int i=1;i<=ans_cnt;i++)
printf("%d\n",ans[i]);
return 0;
}

最新文章

  1. [css]实现垂直居中水平居中的几种方式
  2. HTML form 表单
  3. Oracle安装介质及补丁集下载地址
  4. C#方法中三个重要的参数:out、ref、params
  5. Android异步加载访问网络图片-解析json
  6. 关于Redis中的Replication
  7. ms sqlserver 系列之如何查看数据链接数
  8. html-----011--子窗体iframe
  9. UESTC_秋实大哥与妹纸 2015 UESTC Training for Data Structures&lt;Problem F&gt;
  10. Mybatis第一天(其他)
  11. 在textarea的内容后面增加内容
  12. UVa 10400 - Game Show Math
  13. Struts2之Validator
  14. Linux命令学习——strings
  15. Django-rest-framework 接口实现 版本控制 versioning
  16. 12.15 Daily Scrum
  17. 自学Aruba7.3-Aruba安全认证-802.1x认证(web页面配置)
  18. mybatis-spring集成:配置多数据库源中遇到的问题
  19. sqlserver 2008 r2 下载地址和序列号,可用迅雷下载
  20. WebAPI Token 验证

热门文章

  1. HTTP协议—常见的HTTP响应状态码解析
  2. 20145230java实验报告1
  3. 关于在windows命令提示符cmd下运行Java程序的问题
  4. nginx 安装配置+清缓存模块安装
  5. 1.linux源码安装nginx
  6. Spring Cloud Stream消息总线
  7. 【codevs1069】关押罪犯[noip2010](并查集)
  8. SQl查询基础
  9. kafka安装使用
  10. poj 2478 Farey Sequence 欧拉函数前缀和