[ZJOI 2013]K大数查询
发布时间:2020-12-14 02:03:19 所属栏目:大数据 来源:网络整理
导读:注意是K大不是K小!! 样例死活调不出来?? 话说第K大怎么反着求啊?? #include iostream#include cstdio#include cstring#include algorithm#define maxn 100010using namespace std;namespace BIT{int a[maxn],visa[maxn],tim,n;int t1[maxn],vis1[maxn]
|
注意是K大不是K小!! 样例死活调不出来?? 话说第K大怎么反着求啊?? #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 100010
using namespace std;
namespace BIT{
int a[maxn],visa[maxn],tim,n;
int t1[maxn],vis1[maxn];
#define lowbit(i) i & (~ i) + 1
void update(int *t,int *vis,int pos,int val){
pos ++;
for(int i = pos; i <= n; i += lowbit(i)){
if(vis[i] != tim){
vis[i] = tim;
t[i] = 0;
}
t[i] += val;
}
}
int ask(int *t,int pos){
pos ++;
int ans = 0;
for(int i = pos; i; i -= lowbit(i))
if(vis[i] == tim)
ans += t[i];
return ans;
}
void update(int l,int r,int val){
update(a,visa,l,val);
update(a,r + 1,-val);
update(t1,vis1,val * l);
update(t1,-val * (r + 1));
}
int ask(int x){return (x + 1) * ask(a,x) - ask(t1,x);}
}
int mn = 0x7fffffff,mx = -0x7fffffff;
int ID;
int ans[maxn];
struct opt{
int tp,a,b,c,id;
void read(){
scanf("%d%d%d%d",&tp,&a,&b,&c);
if(tp == 1){
mn = min(mn,c);
mx = max(mx,c);
}
else id = ++ ID;
}
}q[maxn],q1[maxn],q2[maxn];
int n,m,tmp[maxn];
void solve(int head,int tail,int l,int r){
if(tail < head)return;
if(l == r){
for(int i = head; i <= tail; i ++)
if(q[i].tp == 2)
ans[q[i].id] = l;
return;
}
int mid = (long long)l + r >> 1;
BIT::tim ++;
for(int i = head; i <= tail; i ++){
if(q[i].tp == 2)
tmp[i] = BIT::ask(q[i].b) - BIT::ask(q[i].a - 1);
else{
if(q[i].c <= mid)continue;
BIT::update(q[i].a,q[i].b,1);
}
}
int l1 = 0,l2 = 0;
for(int i = head; i <= tail; i ++){
if(q[i].tp == 2){
if(q[i].c <= tmp[i])q2[++ l2] = q[i];
else{
q[i].c -= tmp[i];
q1[++ l1] = q[i];
}
}
else{
if(q[i].c <= mid)q1[++ l1] = q[i];
else q2[++ l2] = q[i];
}
}
int cnt = head;
for(int i = 1; i <= l1; i ++)
q[cnt ++] = q1[i];
for(int i = 1; i <= l2; i ++)
q[cnt ++] = q2[i];
solve(head,head + l1 - 1,mid);
solve(head + l1,tail,mid + 1,r);
}
int main(){
freopen("zjoi13_sequence.in","r",stdin);
freopen("zjoi13_sequence.out","w",stdout);
scanf("%d%d",&n,&m);
BIT::n = n;
for(int i = 1; i <= m; i ++)
q[i].read();
solve(1,mn,mx);
for(int i = 1; i <= ID; i ++)
printf("%dn",ans[i]);
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
