基准时间限制:3.5 秒 空间限制:524288 KB 分值: 80 难度:5级算法题
收藏
关注
驴蛋蛋在愉快地与STL玩耍
突然间小A跳了出来对驴蛋蛋说,看你与STL玩的很开心啊,那我给你一个大小为N的vector,这个vector上每个位置上是一个set<int>,
每次我会在闭区间 [L,R] 中的每个set<int>里插入一个数c,或者询问 [L,R] 区间所有set里所有数拿下来排序之后的严格第 K 小,现在你还开心吗,红红火火恍恍惚惚韩寒会画红槐花!!!!
小A走了,留下驴蛋蛋一个人外加一个长度为 N 的vector<set<int> >在风中凌乱,你能帮驴蛋蛋解除凌乱吗?
根据小A的 C++2.33 标准vector可以被视作一个数组,下标从 1 开始,大小不得超过 65536
set<int>是一个集合,其中的数不得超过 10000 并且会被自动去重
小A最多会进行 Q 次(不超过 65536 )完全符合 C++2.33 标准的操作,但如果出现询问时 [L,R] 区间里不足 K 个数的情况,你只需要对小A回答 −1 就好了
Input
第一行两个数字N,Q 接下来Q行每行行行首一个整数op 若op为1,则接下来有3个数L,R,C表示在区间[L,R]中的每个set<int>中插入一个数C(0 <= C <= 10000) 若op为2,则接下来有3个数L,R,K表示查询区间[L,R]所有set<int>中所有数的严格第K小值(去重之后)
Output
输出分一至多行,每行一个整数表示对对应询问的回答
Input示例
5 5 2 4 5 7 1 1 2 8 2 4 5 8 2 4 5 1 2 1 3 1
Output示例
-1 -1 -1 8
这个题真的好坑啊,卡时间,卡内存,卡技巧,然后就没有然后了,学习了这位大神的代码,真的强!!!!
链接: 太强辣
代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<bitset>
#define lson (i<<1)
#define rson (i<<1|1)
using namespace std;
const int N =1e4+5;
struct node
{
bitset<N> lz;
bitset<N> a;
}tr[65540*2];
bitset<N> ans[65540];
bitset<N> pre[N];
bitset<N> tmp;
int n,q,op;
int L,R;
int cnt;
int c;
void init()
{
pre[0][0]=1;
for(int i=1;i<N;i++){
pre[i]=pre[i-1];
pre[i][i]=1;
}
/*
for(int i=0;i<=10;i++){
for(int j=0;j<=10;j++){
cout<<pre[i][j];
}
cout<<endl;
}
*/
}
void update(int i,int l,int r)
{
tr[i].a[c]=1;
if(L<=l&&R>=r){
tr[i].lz[c]=1;
return ;
}
int mid=(l+r)>>1;
if(L<=mid) update(lson,l,mid);
if(R>mid) update(rson,mid+1,r);
}
void query(int i,int l,int r)
{
if(L<=l&&R>=r){
ans[cnt]|=tr[i].a;
return ;
}
ans[cnt]|=tr[i].lz;
int mid=(l+r)>>1;
if(L<=mid) query(lson,l,mid);
if(R>mid) query(rson,mid+1,r);
}
int jud(int mid)
{
tmp=ans[cnt]&pre[mid];
if(tmp.count()>=c) return 1;
return 0;
}
void solve()
{
if(!c){
puts("-1");
return ;
}
++cnt;
query(1,1,n);
if(ans[cnt].count()<c){
puts("-1");
return ;
}
int l,r,ans,mid;
l=0; r=N-2;
while(l<=r){
mid=(l+r)>>1;
if(jud(mid)){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
printf("%d\n",ans);
return ;
}
int main()
{
init();
scanf("%d %d",&n,&q);
for(int i=1;i<=q;i++){
scanf("%d %d %d %d",&op,&L,&R,&c);
if(op==1){
update(1,1,n);
}
else{
solve();
}
}
return 0;
}