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;
}