1546: 数牌 线段树

1546: 数牌

Time Limit: 1 Sec Memory Limit: 128 MB

Submit: 31 Solved: 6

[Submit][Status][Web Board]

Description

从西安到杭州的火车实在是太漫长了,为了打发时间,zjc买了n张扑克牌 (一张一张卖的你们没见过吧ˉ▽ˉ)牌的位置为1,2,3,…,n ,牌面大小为 3....,9,10,J,Q,K,A,2,牌的花色有a,b,c,d 分别表示红桃、黑桃、方块、梅花。如a9 表示红桃9,d2表示梅花2 。现在有m个操作:

1 x y 表示交换位置为x和位置为y的牌

2 k pq 表示询问第k张花色为p,牌面为q的位置(pq为一个字符串,如a9,d2等)

Input

输入多组数据

第一行输入一个n (1<=n<=100000)表示zjc买了n张牌

第二行输入n张牌, 扑克牌用pq表示,p为牌的花色,q为牌的牌面,p为a,b,c,d,q为3....,9,10,J,Q,K,A,2。第i 张牌的位置为i (1<=i<=n)。

第三行输入一个数m(1<=m<=100000) 表示有m次询问

接下来m行每行输入一个整数op(1或者2)

op=1,输入 x ,y ,(1<=x,y<=n),交换位置为x的牌和位置为y的牌

op=2, 输入k, pq,(1<=k<=n)询问第k张花色为p,牌面大小为q的牌的位置,对于每个询问,输出对应位置,如果牌不存在,则输出-1

Output

对于每个询问,输出牌对应的位置,如果牌不存在,则输出-1

Sample Input

5

a3 b9 b9 cJ d2

5

1 1 3

2 1 b9

1 2 5

2 2 b9

2 2 a3

Sample Output

1

5

-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;
}
时间: 2024-10-11 00:15:09

1546: 数牌 线段树的相关文章

bzoj 2120: 数颜色 线段树套平衡树

/************************************************************** Problem: 2120 User: wangyucheng Language: C++ Result: Time_Limit_Exceed ****************************************************************/ #include<iostream> #include<cstdio> #incl

清华集训 2014--奇数国(线段树&amp;欧拉函数&amp;乘法逆元&amp;状态压缩)

昨天想了一晚...早上AC了... 这么长时间没打线段树,这回居然一次过了... 感觉数论方面应该已经没有太大问题了... 之后要开始搞动态规划之类的东西了... 题意 在一片美丽的大陆上有100000个国家,记为1到100000.这里经济发达,有数不尽的账房,并且每个国家有一个银行.某大公司的领袖在这100000个银行开户时都存了3大洋,他惜财如命,因此会不时地派小弟GFS清点一些银行的存款或者让GFS改变某个银行的存款.该村子在财产上的求和运算等同于我们的乘法运算,也就是说领袖开户时的存款总

CF 558E(A Simple Task-计数排序+线段树)

E. A Simple Task time limit per test 5 seconds memory limit per test 512 megabytes input standard input output standard output This task is very simple. Given a string S of length n and q queries each query is on the format i j k which means sort the

Luogu5324 BJOI2019删数(线段树)

考虑无修改怎么做.对于1~n的每个数,若其存在,将最后一个放在其值的位置,剩余在其前面依次排列,答案即为值域1~n上没有数的位置个数.带修改显然记一下偏移量线段树改一改就好了. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #

查询区间内有多少个不同的数(线段树/树状数组)

入门级数据结构算法.复习一下,分别手写一个. 线段树版本(过了CF上的https://codeforces.com/contest/1291/problem/D): 1 #include<bits/stdc++.h> 2 #define f(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 struct qujian{ 5 int l,r,index; 6 friend bool operator < (const quji

acmoj - 数蘑菇线段树区间更新

数蘑菇 题目描述 某土豪有许多种蘑菇的房子(编号从1到n,n<=10000),每个房子开始时有个蘑菇,大小在2到1000之间,每当洒脱的土豪给他们浇水时,这些蘑菇就会变成原来的平方倍大,比如一个大小为2的蘑菇在土豪浇过水之后就会变成4这么大,但是因为土豪住在帝都,每个房子只有1000平方米这么大,所以每个蘑菇在长到1000之后就不会再长大了(比如对于一个大小为50的蘑菇浇水,它也只能长大到1000),土豪每天喜欢骑着自行车(乡下人羡慕城里人开车溜达,城里的土豪却骑着自行车,你们城里人真会玩)给一

hdu 5172 GTY&#39;s gay friends 线段树

GTY's gay friends 问题描述 GTY有n个基友,出于某种恶趣味,GTY每天早上会让他的基友们排成一行,每个基友有一个特征值,表示基友有多雄壮或娘炮,你,作为GTY的助手,必须回答GTY的每个询问,GTY每次会问一个区间[l,r][l,r]是否为一个11到r-l+1r−l+1的排列. 输入描述 多组数据(约3组),每组数据的第一行有两个数n,m(1 \leq n,m \leq 100000)n,m(1≤n,m≤100000) 表示初始基友数量和询问个数,第二行包含nn个数a_i (

【线段树题解】借教室

2.借教室 (classroom.cpp/c/pas) [问题描述] 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样.  面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj, sj, tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每

uva 11525 - Permutation(线段树)

题目链接:uva 11525 - Permutation 题目大意:给定n和k,n给定的方式为k个si,根据公式计算出n,求一个由1~k组成的长度为k的序列的第n个排序 解题思路:根据公式的性质,等于对于每个位置找当前状态下第si小的数.线段树子节点均为1,维护和,查询时传入参数查找即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int ma