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 ...
随机推荐
- Windows下安装redis,并与PHP使用
一.在windows下安装redis: redis的官方网站下载地址:http://redis.io/download 进入以上网址之后,请见以下的图片操作下载redis: 第一步: 第二步:在对应的 ...
- 【easyui】--combobox--赋值和获取选中的值
//初始化下拉选框 $('#communityIdDiv').combobox({ url:basepath+"pushController/queryCommonityName" ...
- 把Java对象转为xml格式
主要使用到的Java类有:javax.xml.bind.JAXBContext,javax.xml.bind.Marshaller(编排) 代码主要展示如下: public class Student ...
- 4.0 流量控制preference
从Android4.0以后,系统设置应用程序允许用户查看他们的应用在前台和后台使用了多少网络数据.用户可以禁用每 个应用在后台使用网络数据.为了避免用户禁用你的应用在后台访问网络,你应该更效率的使用网 ...
- MYSQL数据库表中字段追加字符串内容
$sql="update parts set p_notes=concat(p_notes,'{$p_notes}') where p_id={$p_id}"; parts为表名 ...
- 使用WIF实现单点登录Part III —— 正式实战
我们接下来的demo将包括以下的工程: SiteA —— 基于.net framework 4.5的MVC 4程序,使用WIF 4.5的SDK,第一个RP SiteB —— 基于.net framew ...
- openstack命令
整理了Openstack命令: openstack aggregate add host openstack aggregate createopenstack aggregate deleteope ...
- makefile复习时发现的编写makefile规则注意事项
博客中关于makefile的博文数不胜数,比较经典的都很相似,下面这一片,很全面,只是很长,可以作为参考资料:http://blog.csdn.net/liang13664759/article/de ...
- 网站网页生成.shtml访问无法显示
网站换了服务器后发现shtml网页无法访问,原因是没有注册.shtml扩展名,解决方法如下 IIS6.0解析shtm,shtml文件由于IIS6.0的安全性较以前有特别大的改进,所以在很多功能默认情况 ...
- Http协议[Get和Post]详解
(2012-11-27 11:23:26) 标签: android http get post mars 分类: Android系列 访问url,需要连接网络.所以,首先应该添加Manifest权限: ...