NEFU CF 练习赛 45

来源:互联网 发布:济南美食 知乎 编辑:程序博客网 时间:2024/05/01 12:39

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22283#overview

A题CF69A、B题CF69B没什么好说了,水题了。

C题CF69C

恶心的模拟.....每次某个玩家买了件装备的时候查看是否满足合成装备的条件,如果满足就更新一下背包,耐心一点就能调试出来。

#include <iostream>#include <cstdio>#include <cstring>#include <map>#include <algorithm>using namespace std;struct node{int ar[101];}bag[101];int k,n,m,q;int art[101][51];int acnt[101];struct lnode{char na[105];int nu;}tt[101];char data[101][105];bool cmp(lnode a,lnode b){    return strcmp(a.na,b.na)<=0;}int main(){    char name[105];    char num[5];    int id;    while(cin>>k>>n>>m>>q)    {        int cnt=0;        map<string,int>my;        memset(acnt,0,sizeof(acnt));        memset(bag,0,sizeof(bag));        for(int i=1;i<=n;i++)        {            cin>>name;            my[name]=++cnt;            strcpy(data[cnt],name);        }        for(int i=0;i<m;i++)        {            cin>>name;            int l=strlen(name);            name[l-1]='\0';            my[name]=++cnt;            strcpy(data[cnt],name);            do            {            cin>>name;            cin>>num;            l=strlen(num);            int t=num[0]-'0';            for(int j=1;j<l&&num[j]!=',';++j)                t=t*10+num[j]-'0';            art[cnt][my[name]]=t;            }while(num[l-1]==',');        }        for(int i=0;i<q;i++)        {            cin>>id>>name;            bag[id].ar[my[name]]++;            for(int j=n+1;j<=cnt;j++)            {                bool sign=0;                for(int l=1;l<=n;l++)                {                    if(bag[id].ar[l]<art[j][l])                    {                        sign=1;                        break;                    }                }                if(!sign)                {                    bag[id].ar[j]++;                    for(int l=1;l<=n;l++)                    bag[id].ar[l]-=art[j][l];                }            }        }        for(int i=1;i<=k;i++)        {            int t=0;            for(int j=1;j<=cnt;j++)            {                if(bag[i].ar[j])                {                    tt[t].nu=bag[i].ar[j];                    strcpy(tt[t].na,data[j]);                    t++;                }            }            sort(tt,tt+t,cmp);            cout<<t<<endl;            for(int j=0;j<t;j++)            {                cout<<tt[j].na<<" "<<tt[j].nu<<endl;            }        }    }    return 0;}
E题69E

可以用map和线段树,这里就用线段树来写,思路是一样的

有n个数字,用线段树的话需要离散化。i从1开始读到n,每次将num[i]插入线段树中,当i>=k时,开始查询最大的只出现过一次的数字,查完后删除线段树中的一个num[i-k+1]。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAX 100005#define lson (rt<<1)#define rson (rt<<1|1)struct node{    int l,r,sum;} tree[MAX<<2];struct data{    int num,id;} iput[MAX];bool cmp(data a,data b){    return a.num<b.num;}int num[MAX];int fnum[MAX];void build(int rt,int l,int r){    tree[rt].l=l,tree[rt].r=r;    tree[rt].sum=MAX;    if(l==r) return;    int mid=(l+r)>>1;    build(lson,l,mid);    build(rson,mid+1,r);}void insert(int rt,int pos,int val){    if(tree[rt].l==tree[rt].r)    {        if(tree[rt].sum>=MAX)            tree[rt].sum=1;        else tree[rt].sum+=val;        if(tree[rt].sum<1) tree[rt].sum=MAX;        return;    }    int mid=(tree[rt].l+tree[rt].r)>>1;    if(pos<=mid) insert(lson,pos,val);    else insert(rson,pos,val);    tree[rt].sum=min(tree[lson].sum,tree[rson].sum);}int query(int rt){    if(tree[rt].sum!=1) return -1;    if(tree[rt].l==tree[rt].r)        return  tree[rt].l;    if(tree[rson].sum==1) return query(rson);    else if(tree[lson].sum==1) return query(lson);    return -1;}int main(){    int n,k;    while(~scanf("%d%d",&n,&k))    {        for(int i=1; i<=n; i++)        {            scanf("%d",&iput[i].num);            iput[i].id=i;        }        int cnt=0;        sort(iput+1,iput+1+n,cmp);        for(int i=1; i<=n; i++)            if(i>1&&iput[i].num==iput[i-1].num) num[iput[i].id]=cnt;            else            {                num[iput[i].id]=++cnt;                fnum[cnt]=iput[i].num;            }        build(1,1,cnt);        for(int i=1; i<=n; i++)        {            insert(1,num[i],1);            if(i>=k)            {                int ans=query(1);                if(ans==-1) puts("Nothing");                else printf("%d\n",fnum[ans]);                insert(1,num[i-k+1],-1);            }        }    }    return 0;}



原创粉丝点击