题目大意
PTY进行IQ测试,测试的项目是判断一个序列是否是另外一个序列删除若干个数字之后得到的,PTY 深知自己的IQ 低于sqrt(-1),所以他请来了智商超高的你来替他解决问题。
解题思路
此题有线性离线做法,用指针维护。考虑线段树上二分下一个点即可n log n在线。
code
using namespace std;
int const mn=1e5+9,mp=40*1e6+9,inf=1e9;
int n,m,l,pon=1e6,size[mp],son[mp][2];
void oper(int now,int l,int r,int v){
int mid=(l+r)>>1;
size[now]++;
if(l==r)return;
if(v<=mid){
son[now][0]=(son[now][0])?son[now][0]:++pon;
oper(son[now][0],l,mid,v);
}else{
son[now][1]=(son[now][1])?son[now][1]:++pon;
oper(son[now][1],mid+1,r,v);
}
}
int qury(int now,int l,int r,int v){
int mid=(l+r)>>1;
if(l==r)return (size[now]==v)?l:-1;
if(size[son[now][0]]>=v)return qury(son[now][0],l,mid,v);
else return qury(son[now][1],mid+1,r,v-size[son[now][0]]);
}
int qury2(int now,int l,int r,int v){
int mid=(l+r)>>1;
if(l==r)return size[now];
if(v<=mid)return qury2(son[now][0],l,mid,v);
else return size[son[now][0]]+qury2(son[now][1],mid+1,r,v);
}
int read(){
int v=0;char ch=getchar();
while((ch<'0')||(ch>'9'))ch=getchar();
while((ch>='0')&&(ch<='9'))v=v*10+ch-'0',ch=getchar();
return v;
}
int main(){
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
n=read();int x;
fo(i,1,n){
x=read();
oper(x,1,n,i);
}
m=read();int now,tmp;
fo(cas,1,m){
l=read();x=read();
now=qury(x,1,n,1);
if(now==-1){
fo(i,2,l)x=read();
printf("NIE\n");continue;
}
fo(i,2,l){
x=read();
tmp=qury2(x,1,n,now);
now=qury(x,1,n,tmp+1);
if(now==-1){
fo(j,i+1,l)x=read();
break;
}
}
if(now==-1){printf("NIE\n");continue;}
printf("TAK\n");
}
return 0;
}