标签:
1546: 数牌-1
//线段树的节点存储 N张的数组即可 每个节点的数组对应的牌保存他左右儿子的此牌的数量和
#include<bits/stdc++.h> using namespace std; const int maxn=100111; const int inf=999999999; #define lson (rt<<1),L,M #define rson (rt<<1|1),M+1,R #define M ((L+R)>>1) #define For(i,n) for(int i=0;i<(n);i++) template<class T>inline T read(T&x) { char c; while((c=getchar())<=32); bool ok=false; if(c=='-')ok=true,c=getchar(); for(x=0; c>32; c=getchar()) x=x*10+c-'0'; if(ok)x=-x; return x; } template<class T> inline void read_(T&x,T&y) { read(x); read(y); } template<class T> inline void write(T x) { if(x<0)putchar('-'),x=-x; if(x<10)putchar(x+'0'); else write(x/10),putchar(x%10+'0'); } template<class T>inline void writeln(T x) { write(x); putchar('\n'); } // -------IO template------ struct node { int kind[54]; node(){memset(kind,0,sizeof(kind));} }p[maxn<<2]; int a[maxn]; int getid() { int x=0; char tmp[2]; scanf("%s",tmp); x=(tmp[0]-'a')*10; if(tmp[1]>='0'&&tmp[1]<='9') x+=tmp[1]-'0'; else x+=tmp[1]-'J'+11; return x; } void update(int rt,int L,int R,int i,int ax,int v) { if(L==R) { p[rt].kind[ax]+=v; // printf("%d %d %d %d %d %d\n",rt,L,R,i,ax,p[rt].kind[ax]); return ; } if(i<=M) update(lson,i,ax,v); else update(rson,i,ax,v); p[rt].kind[ax]=p[rt<<1].kind[ax]+p[rt<<1|1].kind[ax]; } int query(int rt,int L,int R,int x,int y) { if(L==R) { return R; } if(p[rt<<1].kind[y]<x) return query(rson,x-p[rt<<1].kind[y],y); else return query(lson,x,y); } int main() { //freopen("in.txt","r",stdin); int n,m,i,j,k,t; while(~scanf("%d",&n)) { for(i=1;i<=n;i++) { a[i]=getid(); update(1,1,n,i,a[i],1); //writeln(a[i]); } // for(i=1;i<=1;i++) // { // for(j=0;j<54;j++) // if(p[i].kind[j])printf("**%d",p[i].kind[j]); // printf(")\n"); // } read(m); while(m--) { int op; int x; read_(op,x); if(op==1) { int y; read(y); if(x==y)continue; // cout<<"====="<<endl; update(1,1,n,x,a[x],-1); update(1,1,n,y,a[x],1); update(1,1,n,x,a[y],1); update(1,1,n,y,a[y],-1); swap(a[x],a[y]); } else { int y=getid(); // writeln(y); // printf("---%d\n",p[1].kind[y]); if(p[1].kind[y]<x) { writeln(-1); } else { writeln(query(1,1,n,x,y)); } } } } return 0; }
标签:
原文地址:http://blog.csdn.net/u013167299/article/details/44830625