2015 ACM/ICPC Asia Regional Changchun Online
1001 Alisha’s Party
比赛的时候学长stl吃T。手写堆过。
赛后我贴了那两份代码都过。相差.2s。
于是用stl写水果。
# include <iostream>
# include <cstdio>
# include <algorithm>
# include <queue>
using namespace std;
# define maxk
int ans[maxk]; struct node
{
char name[];
int id,val;
friend bool operator < (node x,node y)
{
if(x.val!=y.val) return x.val<y.val;
return x.id>y.id;
}
} p[maxk];
priority_queue<node> pq; struct open
{
int t,p;
} T[maxk]; bool cmp(open x,open y)
{
return x.t<y.t;
} int main(void)
{
int kase; cin>>kase;
while(kase--)
{
int k,m,q,pos=,cnt=,Q;
scanf("%d%d%d",&k,&m,&q);
for(int i=;i<=k;i++)
{
scanf("%s%d",p[i].name,&p[i].val);
p[i].id=i;
}
for(int i=;i<m;i++) scanf("%d%d",&T[i].t,&T[i].p);
sort(T,T+m,cmp);
while(!pq.empty()) pq.pop();
for(int i=;i<m;i++)
{
while(pos<=k&&pos<=T[i].t) pq.push(p[pos++]);
while(!pq.empty()&&T[i].p--)
{
ans[++cnt]=pq.top().id;
pq.pop();
}
}
while(pos<=k) pq.push(p[pos++]);
while(!pq.empty())
{
ans[++cnt]=pq.top().id;
pq.pop();
}
for(int i=;i<q;i++)
{
scanf("%d",&Q);
printf("%s ",p[ans[Q]].name);
}
scanf("%d",&Q);
printf("%s\n",p[ans[Q]].name);
}
return ;
}
Aguin
1002 Ponds
赛时题意错理解成对所有奇数联通子集权值求和……
先dfs或kahn删点。
再遍历一遍所有奇数联通即可。
# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
typedef long long LL;
const int maxp=,maxm=;
int cnt,headlist[maxp],v[maxp],deg[maxp];
bool vis[maxp];
LL tmp; struct node
{
int to,pre;
} edge[*maxm]; void add(int from,int to)
{
cnt++;
edge[cnt].pre=headlist[from];
edge[cnt].to=to;
headlist[from]=cnt;
return;
} void dfs1(int pos)
{
deg[pos]=; vis[pos]=;
for(int i=headlist[pos];i;i=edge[i].pre)
{
int to=edge[i].to;
if(deg[to]) deg[to]--;
if(deg[to]==) dfs1(to);
}
return;
} int dfs2(int pos)
{
int ret=;
vis[pos]=;
tmp+=v[pos];
for(int i=headlist[pos];i;i=edge[i].pre)
{
int to=edge[i].to;
if(vis[to]) continue;
ret+=dfs2(to);
}
return ret;
} int main(void)
{
int T; cin>>T;
while(T--)
{
cnt=;
memset(headlist,,sizeof(headlist));
memset(deg,,sizeof(deg));
memset(vis,,sizeof(vis));
int p,m; scanf("%d%d",&p,&m);
for(int i=;i<=p;i++) scanf("%d",v+i);
for(int i=;i<m;i++)
{
int a,b; scanf("%d%d",&a,&b);
add(a,b); add(b,a);
deg[a]++; deg[b]++;
}
for(int i=;i<=p;i++) if(deg[i]==) dfs1(i);
LL ans=;
for(int i=;i<=p;i++) if(!vis[i]&°[i])
{
tmp=;
if(dfs2(i)%) ans+=tmp;
}
printf("%I64d\n",ans);
}
return ;
}
Aguin
1003 Aggregated Counting
1004 Clock Adjusting
1005 Travel
赛场题意理解错。哭。
询问排序。并查集按秩合并。对答案的贡献是2*r[u]*r[v]。
# include <iostream>
# include <cstdio>
# include <algorithm>
using namespace std;
int Ans[],pa[],r[]; int Find(int x)
{
return pa[x]==x?x:pa[x]=Find(pa[x]);
} void Union(int x,int y)
{
x=Find(x),y=Find(y);
if(y<x) swap(x,y);
pa[y]=x; r[x]+=r[y];
return;
} struct node
{
int from,to,val;
friend bool operator < (node x,node y)
{
return x.val<y.val;
}
} edge[]; struct Query
{
int no,x;
friend bool operator < (Query a,Query b)
{
return a.x<b.x;
}
}query[]; int main(void)
{
int T; cin>>T;
while(T--)
{
int n,m,q; scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n;i++){pa[i]=i;r[i]=;}
for(int i=;i<m;i++)
scanf("%d%d%d",&edge[i].from,&edge[i].to,&edge[i].val);
sort(edge,edge+m);
for(int i=;i<q;i++)
{
query[i].no=i;
scanf("%d",&query[i].x);
}
sort(query,query+q);
int pos=,ans=;
for(int i=;i<q;i++)
{
while(pos<m&&edge[pos].val<=query[i].x)
{
int u=Find(edge[pos].from),v=Find(edge[pos].to);
pos++;
if(u==v) continue;
ans+=*r[v]*r[u];
Union(u,v);
}
Ans[query[i].no]=ans;
}
for(int i=;i<q;i++) printf("%d\n",Ans[i]);
}
return ;
}
Aguin
1006 Favorite Donut
讨论这个题目经历了几个阶段。
比赛时只知道用最大表示法。
然而由于最大表示法在有多解时返回index最小的。逆时针的处理方法没想好。场上T了。
赛后想到逆时针多解时必成循环。可以用KMP求循环节。两者都是O(n)。
后来经过学长提醒。最大表示法如果处理循环串是k增到m后跳出。
于是可以直接在最大表示法里处理掉循环节。时间上常数优化(并无)。
# include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
# include <cmath>
using namespace std;
char s[];
int m; int getMax(int p)
{
int i=,j=,k=;
while(i<m&&j<m&&k<m)
{
int t=s[(i+k)%m]-s[(j+k)%m];
if(!t) k++;
else
{
if(t<) i=max(i+k+,j+);
else j=max(j+k+,i+);
k=;
}
}
if(p&&k==m) return m--(m--min(i,j))%abs(i-j);
return min(i,j);
} int main(void)
{
int T; cin>>T;
while(T--)
{
scanf("%d%s",&m,s);
int op=,a=getMax(),b;
reverse(s,s+m);
b=getMax();
for(int i=;i<m;i++)
{
if(s[(*m--a-i)%m]>s[(b+i)%m]) {op=; break;}
if(s[(*m--a-i)%m]<s[(b+i)%m]) {op=; break;}
}
if(op==) printf("%d 0\n",a+);
else if(op==) printf("%d 1\n",m-b);
else if(a+<=m-b) printf("%d 0\n",a+);
else printf("%d 1\n",m-b);
}
return ;
}
Aguin
1007 The Water Problem
水题。ST/线段树/暴力。
# include <iostream>
# include <cstdio>
# include <cmath>
# include <algorithm>
using namespace std;
# define maxn +
int num[maxn],MAX[maxn][]; int main(void)
{
int T; cin>>T;
while(T--)
{
int N,Q; scanf("%d",&N);
for(int i=;i<=N;i++)
{
scanf("%d",num+i);
MAX[i][]=num[i];
}
for(int j=;j<;j++)
for(int i=;i<=N;i++)
if(i+(<<j)-<=N)
MAX[i][j]=max(MAX[i][j-],MAX[i+(<<j-)][j-]);
scanf("%d",&Q);
for(int i=;i<Q;i++)
{
int m,n; scanf("%d%d",&m,&n);
int k=(log(double(n-m+))/log());
int ans=max(MAX[m][k],MAX[n-(<<k)+][k]);
printf("%d\n",ans);
}
}
return ;
}
Aguin
1008 Elven Postman
1009 Food Problem
1010 Unknown Treasure
1011 Good Numbers
1012 Marisa’s Cake
1013 Robot Dog
2015 ACM/ICPC Asia Regional Changchun Online的更多相关文章
- hdu 5444 Elven Postman(二叉树)——2015 ACM/ICPC Asia Regional Changchun Online
Problem Description Elves are very peculiar creatures. As we all know, they can live for a very long ...
- (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )
http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others) Memo ...
- (二叉树)Elven Postman -- HDU -- 54444(2015 ACM/ICPC Asia Regional Changchun Online)
http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Time Limit: 1500/1000 MS (Java/Others) ...
- 2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- (线段树 区间查询)The Water Problem -- hdu -- 5443 (2015 ACM/ICPC Asia Regional Changchun Online)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=5443 The Water Problem Time Limit: 1500/1000 MS (Java/ ...
- 2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给你n,m,k,代表n个城市,m条边,k次查询,每次查询输入一个x,然后让你一个城市对(u,v ...
- hdu 5444 Elven Postman(根据先序遍历和中序遍历求后序遍历)2015 ACM/ICPC Asia Regional Changchun Online
很坑的一道题,读了半天才读懂题,手忙脚乱的写完(套上模板+修改模板),然后RE到死…… 题意: 题面上告诉了我们这是一棵二叉树,然后告诉了我们它的先序遍历,然后,没了……没了! 反复读题,终于在偶然间 ...
- HDU 5437 Alisha’s Party (优先队列)——2015 ACM/ICPC Asia Regional Changchun Online
Problem Description Princess Alisha invites her friends to come to her birthday party. Each of her f ...
- HDU 5444 Elven Postman (2015 ACM/ICPC Asia Regional Changchun Online)
Elven Postman Elves are very peculiar creatures. As we all know, they can live for a very long time ...
随机推荐
- 在VMware上安装CentOS -7步骤详解
在VMware上安装CentOS -7 一.下载好VMware虚拟机 二.准备好CentOS的镜像文件 在这里安装之前博主都已准备好了. 废话就少啰嗦啦!现在开始安装步骤了 1.首先打开VMware创 ...
- 【3】JavaScript编程全解笔记(三)
减少重复劳动,抓住核心. 第 4 部分 HTML5 1. HTML 技术分类 与 API 2. ApplicationCache 缓存 第 15 章 与桌面应用的协作 第 17 章 WebSocket ...
- JavaScript忍者秘籍——闭包
概要:本篇博客主要介绍了JavaScript的闭包 1.闭包的工作原理 简单地说,闭包就是一个函数在创建时允许该自身函数访问并操作该自身函数之外的变量时所创建的作用域. 例如: var outerVa ...
- 用yum源安装Nginx
1.在/etc/yum.repos.d/目录下创建一个源配置文件nginx.repo: cd /etc/yum.repos.d/ vi nginx.repo 填写如下内容: [nginx] name= ...
- 在GNU/Linux下设置与定时更换桌面壁纸
1 简介 在电脑桌面设置一组可以定时更换的壁纸已经不是什么新奇的功能了.比如,Windows 7.KDE桌面环境都可以实现这样的效果.可是,自己目前使用的Debian系统并未安装KDE.GNOME这样 ...
- chrome console 命令简记
1.快速迭代元素 $$('tr.dispute-num td strong a').map(function (el) { return el.innerHTML; }) 2.复选框选中/取消选中 c ...
- Visual Studio下使用jQuery的10个技巧
广泛流行的jQuery是一个开源的,跨浏览器和兼容CSS 3的JavaScript库,你可以用它简化你的JavaScript编码任务和操作(添加,编辑和删除)HTML内容中的DOM元素,本文介绍10个 ...
- Linux 查公网出口IP
wget http://members.3322.org/dyndns/getipcat getip
- python报错Could not open PYTHONSTARTUP
root@liqian-python:/pythonShare/monitor/m_server/core# pythonPython 2.7.10 (default, Oct 14 2015, 16 ...
- @@identity的用法
问题描述:两张表,比如说A表和B表.A表中的id为自增的,B表中的id为外键,插入时不能为空. 解决办法: 用select @@identity得到上一次插入记录时自动产生的ID,将@@identit ...