Description

有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c
如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。

Input

第一行N,M
接下来M行,每行形如1 a b c或2 a b c

Output

输出每个询问的结果

Sample Input

2 5
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3

Sample Output

1
2
1

HINT

【样例说明】

第一个操作 后位置 1 的数只有 1 , 位置 2 的数也只有 1 。 第二个操作 后位置 1

的数有 1 、 2 ,位置 2 的数也有 1 、 2 。 第三次询问 位置 1 到位置 1 第 2 大的数 是

1 。 第四次询问 位置 1 到位置 1 第 1 大的数是 2 。 第五次询问 位置 1 到位置 2 第 3

大的数是 1 。‍

N,M<=50000,N,M<=50000

a<=b<=N

1操作中abs(c)<=N

2操作中c<=Maxlongint

树套树……一直纠结要不要可持久化……直接动态开点居然过了……
两层线段树,外层权值,内层区间,即权值在[l,r]间的点在位置[a,b]间有多少个。
挺好理解吧

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;const int MAXN=50000;
int n,m=0,k,root[MAXN<<2],tp,l,r,c,num=0,p,ch;
struct tree{int l,r,s,ta;
} t[20000005];
inline int read(){p=0;ch=getchar();while (ch<'0'||ch>'9') ch=getchar();while (ch>='0'&&ch<='9') p=p*10+ch-48, ch=getchar();return p;
}
inline int an(int x,int l,int r,int a,int b){if (l==a&&r==b) return t[x].s;int mid=l+r>>1;if (b<=mid) return an(t[x].l,l,mid,a,b)+(b-a+1)*t[x].ta;elseif (a>mid) return an(t[x].r,mid+1,r,a,b)+(b-a+1)*t[x].ta;elsereturn an(t[x].l,l,mid,a,mid)+an(t[x].r,mid+1,r,mid+1,b)+(b-a+1)*t[x].ta;
}
inline int ask(int a,int b,int c){int l=1,r=n,mid,k=1,t;while(l<r){mid=l+r>>1;k<<=1;k|=1;t=an(root[k],1,n,a,b);if (t<c) r=mid,k^=1,c-=t;else l=mid+1;}return l;
}
inline void ins(int &k,int l,int r,int a,int b){if (!k) k=++num;t[k].s+=b-a+1;if (l==a&&r==b){t[k].ta++;return;}int mid=l+r>>1;if (b<=mid) ins(t[k].l,l,mid,a,b);elseif (a>mid) ins(t[k].r,mid+1,r,a,b);else ins(t[k].l,l,mid,a,mid),ins(t[k].r,mid+1,r,mid+1,b);
}
inline void in(int a,int b,int c){int l=1,r=n,k=1,mid;while(l<r){mid=l+r>>1;ins(root[k],1,n,a,b);k<<=1;if (c<=mid) r=mid;else k|=1,l=mid+1;}ins(root[k],1,n,a,b);
}
int main(){n=read();m=read();while(m--){tp=read();l=read();r=read();c=read();if (tp==1) in(l,r,c);else printf("%d\n",ask(l,r,c));}
}

View Code

Add at 2016.4.1

以上是数据修改前的做法

修改后用树套树就得离散化了……

分治好写些

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;int read_p,read_ca,read_f;
inline int read(){read_p=0;read_ca=getchar();read_f=1;while(read_ca<'0'||read_ca>'9') {if (read_ca=='-') read_f=-1;read_ca=getchar();}while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();return read_p*read_f;
}
struct na{int l,r,t,o;ll c;
}b[50001],x1[50001],x2[50001];
struct tree{int l,r;ll w,k;
}t[250000];
int n,m,num=0,root=0;
ll ans[50001];
bool bo;
const ll INF=3e9;
inline void in(int &p,int l,int r,ll a,ll b){if (p==0) p=++num,t[p].l=t[p].r=t[p].w=t[p].k=0;if (l==a&&r==b){t[p].w++;return;}t[p].k+=b-a+1;int mid=(l+r)>>1;if (b<=mid) in(t[p].l,l,mid,a,b);elseif (a>mid) in(t[p].r,mid+1,r,a,b);elsein(t[p].l,l,mid,a,mid),in(t[p].r,mid+1,r,mid+1,b);
}
int pr_num,pr_ch[1000];
inline void pr(ll k){pr_num=0;while(k>0) pr_ch[++pr_num]=k%10,k/=10;while(pr_num) putchar(pr_ch[pr_num--]+48);putchar('\n');
}
inline ll ask(int p,int l,int r,ll a,ll b){if (!p) return 0;if (l==a&&r==b) return t[p].k+t[p].w*(b-a+1);int mid=(l+r)>>1;if (b<=mid) return ask(t[p].l,l,mid,a,b)+t[p].w*(b-a+1);elseif (a>mid) return ask(t[p].r,mid+1,r,a,b)+t[p].w*(b-a+1);elsereturn ask(t[p].l,l,mid,a,mid)+ask(t[p].r,mid+1,r,mid+1,b)+t[p].w*(b-a+1);
}
inline void work(int f,int t,ll l,ll r){register int i;if (l==r){for (i=f;i<=t;i++)if (b[i].o) ans[b[i].t]=l;return;}bo=1;for (i=f;i<=t;i++)if (b[i].o) bo=0;if (bo) return;ll mid=(l+r)>>1,a;int ta1=0,ta2=0;num=root=0;bo=1;for (i=f;i<=t;i++)if (!b[i].o) if (b[i].c<=mid) in(root,1,n,b[i].l,b[i].r),x1[ta1++]=b[i];else x2[ta2++]=b[i];else{a=ask(root,1,n,b[i].l,b[i].r);if (a>=b[i].c) x1[ta1++]=b[i];else b[i].c-=a,x2[ta2++]=b[i];}for (i=0;i<ta1;i++) b[i+f]=x1[i];for (i=0;i<ta2;i++) b[i+f+ta1]=x2[i];if (ta1) work(f,f+ta1-1,l,mid);if (ta2) work(f+ta1,t,mid+1,r);
}
int main(){register int i;n=read();m=read();for (i=1;i<=m;i++) b[i].t=i,b[i].o=read()-1,b[i].l=read(),b[i].r=read(),b[i].c=read(),b[i].c=b[i].o?b[i].c:-b[i].c,ans[i]=(!b[i].o)?-INF:0;work(1,m,-INF,INF);for (i=1;i<=m;i++) if (ans[i]!=-INF) pr(-ans[i]);
}

View Code

转载于:https://www.cnblogs.com/Enceladus/p/5181310.html

bzoj:3110: [Zjoi2013]K大数查询相关推荐

  1. bzoj 3110: [Zjoi2013]K大数查询(树套树)

    树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...

  2. [bzoj 3110] [ZJOI2013] K大数查询

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3110 题目: 有N个位置,M个操作.操作有两种,每次操作如果是: 1 a b c:表示 ...

  3. 3110: [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...

  4. bzoj3110 [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 10703  Solved: 3209 [Submit][ ...

  5. [BZOJ3110] [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 9208  Solved: 2737 [Submit][S ...

  6. 洛谷 P3332 [ZJOI2013]K大数查询 解题报告

    P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...

  7. BZOJ3110: [Zjoi2013]K大数查询

    BZOJ3110: [Zjoi2013]K大数查询 Description 有N个位置,M个操作. 操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如 ...

  8. P3332 [ZJOI2013]K大数查询(整体二分做法)

    P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 [模板]可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改 ...

  9. bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】

    //========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/  转载要声明! //=============== ...

最新文章

  1. MySQL 创建用户与修改密码
  2. python完全背包最优_python 完全背包问题_遗传算法Python实战 009.背包问题
  3. 蜂鸟智游大数据:“人在囧途”的春运,航空公司们可操碎了心
  4. 怎么判断一个字符串的最长回文子串是否在头尾_【Leetcode每日打卡】最长回文串...
  5. Python3 实现单例设计模式
  6. 组合数学 —— 卡特兰数列(Catalan)
  7. mysql查询临时表是否存在_[转]SQL判断临时表是否存在
  8. 为何 Emoji 能给产品设计(营销)带来如此大的数据增长?
  9. Arduino学习笔记6
  10. 网站smtp服务器,SMTP服务器
  11. 电脑硬盘怎么测试软件,HD Tune pro硬盘检测工具怎么用
  12. 腾讯程序员的职业晋升答辩之【完全解析】
  13. cdrom是多媒体微型计算机,2011年计算机一级考试理论试题:多媒体
  14. 猫和计算机连接网络,宽带猫和路由器怎样连接 宽带猫和路由器连接方法【教程】...
  15. Win10禁用管理员帐户后无法进入的两种解决方法
  16. 图解LeetCode——854. 相似度为 K 的字符串(难度:困难)
  17. 计算机网络实践的体会,计算机网络实训心得体会
  18. python-网页请求返回状态码429
  19. 唐宇迪之tensorflow学习笔记项目实战(LSTM情感分析)
  20. java 字符流读取方法_JAVA字符流方式读取文件 问题!

热门文章

  1. LSB最低有效位和MSB最高有效位
  2. hdu1058(dp||优先队列)
  3. 【译】A gentle introduction to self-sovereign identity
  4. Autoencoder 详解
  5. Android中Intent连接不同组件的原理
  6. 【问链-EOS公开课】第七课 EOS 宪法草案与 BP 协议
  7. axios发送登录请求_使用axios实现登录功能(前后端联调)
  8. 两个软件相互交换数据_六轴算法机软件使用说明
  9. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
  10. mysql php页面流量统计_PHP学习笔记:php网络流量统计系统