2014 ACM/ICPC Asia Regional Guangzhou Online
Wang Xifeng's Little Plot http://acm.hdu.edu.cn/showproblem.php?pid=5024
预处理出每个点八个方向能走的最远距离,然后枚举起点,枚举方向,每走一步都要枚举左转和右转的情况,因为预处理好了,所以可以直接算出来。
#include<cstdio>
#include<algorithm>
using namespace std;
const int M=;
char a[M][M];
int n,dp[M][M][];
int dx[]={-,-,,,,,,-};
int dy[]={,,,,,-,-,-};
bool inside(const int &x,const int &y){
if(x>=&&x<n&&y>=&&y<n) return true;return false;
}
int getfar(int x,int y,int dir){
int res=;
while(true){
x+=dx[dir];
y+=dy[dir];
if(!inside(x,y)||a[x][y]=='#') break;
res++;
}
return res;
}
int turnleft(int dir){
return (dir+)%;
}
int turnright(int dir){
return (dir+)%;
}
int solve(int x,int y,int dir){
int res=,step=,left=turnleft(dir),right=turnright(dir);
while(true){
x+=dx[dir];
y+=dy[dir];
if(!inside(x,y)||a[x][y]=='#') break;
step++;
res=max(res,step+dp[x][y][left]);
res=max(res,step+dp[x][y][right]);
}
return res;
}
int main(){
while(~scanf("%d",&n),n){
for(int i=;i<n;i++){
scanf("%s",a[i]);
}
for(int i=;i<n;i++){
for(int j=;j<n;j++){
for(int k=;k<;k++){
if(a[i][j]=='#'){
dp[i][j][k]=-;
}
else{
dp[i][j][k]=getfar(i,j,k);
}
}
}
}
int ans=;
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(a[i][j]=='.'){
for(int k=;k<;k++){
int now=solve(i,j,k);
ans=max(ans,now);
}
}
}
}
printf("%d\n",ans);
}
return ;
}
A Corrupt Mayor's Performance Art http://acm.hdu.edu.cn/showproblem.php?pid=5023
成段更新。
#include<cstdio>
#include<cstring>
#define mt(a,b) memset(a,b,sizeof(a))
#define lrrt int L,int R,int rt
#define iall 1,n,1
#define imid int mid=(L+R)>>1
#define lson L,mid,rt<<1
#define rson mid+1,R,rt<<1|1
const int M=;
struct T{
int cover,lazy;
}tree[M<<];
void build(lrrt){
tree[rt].cover=;
tree[rt].lazy=;
if(L==R) return ;
imid;
build(lson);
build(rson);
}
void pushdown(int rt){
if(tree[rt].lazy){
tree[rt<<].lazy=tree[rt<<|].lazy=tree[rt<<].cover=tree[rt<<|].cover=tree[rt].lazy;
tree[rt].lazy=;
}
}
void pushup(int rt){
tree[rt].cover=tree[rt<<].cover==tree[rt<<|].cover?tree[rt<<].cover:;
}
void update(int x,int y,int z,lrrt){
if(x<=L&&R<=y){
tree[rt].cover=tree[rt].lazy=z;
return;
}
imid;
pushdown(rt);
if(mid>=x) update(x,y,z,lson);
if(mid<y) update(x,y,z,rson);
pushup(rt);
}
bool vis[];
void query(int x,int y,lrrt){
if(L==R){
vis[tree[rt].cover]=true;
return ;
}
imid;
if(x<=L&&R<=y){
if(tree[rt].cover){
vis[tree[rt].cover]=true;
return ;
}
pushdown(rt);
query(x,y,lson);
query(x,y,rson);
return ;
}
pushdown(rt);
if(mid>=x) query(x,y,lson);
if(mid<y) query(x,y,rson);
}
int main(){
int n,m,x,y,z;
char op[];
while(~scanf("%d%d",&n,&m),n|m){
build(iall);
while(m--){
scanf("%s%d%d",op,&x,&y);
if(op[]=='P'){
scanf("%d",&z);
update(x,y,z,iall);
}
else{
mt(vis,);
query(x,y,iall);
bool flag=false;
for(int i=;i<=;i++){
if(vis[i]){
if(flag) printf(" ");
printf("%d",i);
flag=true;
}
}
puts("");
}
}
}
return ;
}
Saving Tang Monk http://acm.hdu.edu.cn/showproblem.php?pid=5025
集齐m把钥匙,就可以拯救唐僧,没集齐也可以从他身上踩过去,拿钥匙必须从小到大拿,蛇只要杀一次,所以要记录钥匙的状态和蛇是否被杀的状态。bfs。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<queue>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
const int M=;
char a[M][M];
int n,m;
struct Snake{
int x,y;
}ts[];
struct Q{
int step,sta,x,y,snake;
friend bool operator <(const Q &a,const Q &b){
return a.step>b.step;
}
}now,pre;
priority_queue<Q> q;
bool vis[M][M][<<];
int dx[]={,,,-};
int dy[]={,-,,};
int getkey(const int &psta,const int &x,const int &y){
int ressta=psta;
if(isdigit(a[x][y])){
int his=a[x][y]-'';
his=<<(his-);
if(his-==psta){
ressta|=his;
}
}
return ressta;
}
int bfs(){
int ls=;
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(a[i][j]=='K'){
now.x=i;
now.y=j;
}
if(a[i][j]=='S'){
ts[ls].x=i;
ts[ls].y=j;
ls++;
}
}
}
now.snake=;
now.sta=;
now.step=;
mt(vis,);
vis[now.x][now.y][now.sta]=true;
int End=(<<m)-;
while(!q.empty()) q.pop();
q.push(now);
while(!q.empty()){
pre=q.top();
q.pop();
if(a[pre.x][pre.y]=='T'&&pre.sta==End) return pre.step;
for(int i=;i<;i++){
int tx=pre.x+dx[i];
int ty=pre.y+dy[i];
if(tx>=&&tx<n&&ty>=&&ty<n&&a[tx][ty]!='#'){
now.sta=getkey(pre.sta,tx,ty);
if(!vis[tx][ty][now.sta]){
vis[tx][ty][now.sta]=true;
now.x=tx;
now.y=ty;
now.snake=pre.snake;
if(a[tx][ty]=='S'){
int id=;
for(int j=;j<ls;j++){
if(ts[j].x==tx&&ts[j].y==ty){
id=j;
break;
}
}
if((now.snake>>id)&){
now.step=pre.step+;
}
else{
now.snake|=(<<id);
now.step=pre.step+;
}
}
else{
now.step=pre.step+;
}
q.push(now);
}
}
}
}
return -;
}
int main(){
while(~scanf("%d%d",&n,&m),n|m){
for(int i=;i<n;i++){
scanf("%s",a[i]);
}
int ans=bfs();
if(ans==-) puts("impossible");
else printf("%d\n",ans);
}
return ;
}
end
2014 ACM/ICPC Asia Regional Guangzhou Online的更多相关文章
- HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...
- hdu 5016 点分治(2014 ACM/ICPC Asia Regional Xi'an Online)
Mart Master II Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- HDU 5000 2014 ACM/ICPC Asia Regional Anshan Online DP
Clone Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/65536K (Java/Other) Total Submiss ...
- 2014 ACM/ICPC Asia Regional Shanghai Online
Tree http://acm.hdu.edu.cn/showproblem.php?pid=5044 树链剖分,区间更新的时候要用on的左++右--的标记方法,要手动扩栈,用c++交,综合以上的条件 ...
- 2014 ACM/ICPC Asia Regional Anshan Online
默默的签到 Osu! http://acm.hdu.edu.cn/showproblem.php?pid=5003 #include<cstdio> #include<algorit ...
- 2014 ACM/ICPC Asia Regional 北京 Online
G - Grade Ted is a employee of Always Cook Mushroom (ACM). His boss Matt gives him a pack of mushroo ...
- 2014 ACM/ICPC Asia Regional Xi'an Online
03 hdu5009 状态转移方程很好想,dp[i] = min(dp[j]+o[j~i]^2,dp[i]) ,o[j~i]表示从j到i颜色的种数. 普通的O(n*n)是会超时的,可以想到o[]最大为 ...
- HDU 5010 Get the Nut(2014 ACM/ICPC Asia Regional Xi'an Online)
思路:广搜, 因为空格加上动物最多只有32个那么对这32个进行编号,就能可以用一个数字来表示状态了,因为只有 ‘P’ 'S' 'M' '.' 那么就可以用4进制刚好可以用64位表示. 接下去每次就 ...
- HDU 5002 Tree(动态树LCT)(2014 ACM/ICPC Asia Regional Anshan Online)
Problem Description You are given a tree with N nodes which are numbered by integers 1..N. Each node ...
随机推荐
- CentOS6.4安装VNC
http://jingyan.baidu.com/article/ca2d939dd1dabbeb6c31ce24.html 一.安装 VNC 默认情况下,CentOS 6.4 是没有安装的. 检查是 ...
- 多分类问题multicalss classification
多分类问题:有N个类别C1,C2,...,Cn,多分类学习的基本思路是"拆解法",即将多分类任务拆分为若干个而分类任务求解,最经典的拆分策略是:"一对一",&q ...
- uC/OS-II之系统函数20160526
任务管理 1 OSTaskCreate() 建立一个新任务.任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立.中断处理程序中不能 建立任务.一个任务可以为无限循环的结构. 函数原型:I ...
- jquery.unobtrusive-ajax.js的扩展,做到片段式加载
//ajax支持库 /*! ** Unobtrusive Ajax support library for jQuery ** Copyright (C) Microsoft Corporation. ...
- linux动态库编译和使用详细剖析
引言 重点讲述linux上使用gcc编译动态库的一些操作.并且对其深入的案例分析.最后介绍一下动态库插件技术, 让代码向后兼容.关于linux上使用gcc基础编译, 预编译,编译,生成机械码最后链接输 ...
- hdu 5166 Missing number
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5166 Missing number Description There is a permutatio ...
- core java 5~6(OOP & 高级语言特征)
MODULE 5 OOP 面向对象程序设计--------------------------------------------------------Object Oriented Program ...
- Objective-C 编码规范
Objective-C 编码规范,内容来自苹果.谷歌的文档翻译,自己的编码经验和对其它资料的总结. 概要 Objective-C 是一门面向对象的动态编程语言,主要用于编写 iOS 和 Mac 应用程 ...
- Visio编辑数据库模型列
Visio编辑数据库模型列:邮件group->Open实体,进入实体属性编辑界面,按回车可以添加.
- IIS 8.5配置.net网站[花了半个多小时]
1.默认安装了IIS部分功能.参考http://www.cnblogs.com/xuanhun/p/4201645.html 2.运用程序连接池, 使用集成 模式 3.运用程序连接池,设置启用32位应 ...