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;}
- NEFU CF 练习赛 45
- 0712CF练习赛
- 130722练习赛CF
- CF练习赛130719 - from lanshui_Yang
- codeforces 练习 ---- CF 24
- CF 4 练习
- CF 5 练习
- NEFU 2013省赛训练三
- cugb 13-07-13 练习(cf)
- CF BeautifulPaintings HPU 第13周练习
- NEFU 697 2013内蒙古自治区赛--热身赛 E题
- nefu《2015综合训练9组队赛》解题报告
- NEFU 2016省赛演练一 F题 (高精度加法)
- NEFU 2016省赛演练一 I题 (模拟题)
- nefu 406
- nefu 115
- nefu 116
- nefu 84
- win8应用商店程序 添加背景图片
- 第八周项目一
- 第八周上机任务(友元函数运算符的重载)
- java java.util.ConcurrentModificationException 原因
- const
- NEFU CF 练习赛 45
- 笔记本发烫很卡很慢 占CPU100%
- alter system|session set events
- 题目1030:毕业bg
- 第八周任务-项目一(任务一成员函数的运算符重载)
- html5 canvas使用
- 探讨父子线程、进程终止顺序不同产生的结果
- 第八周C++上机报告(项目一实现复数类中的运算符重载)
- 第八周项目1