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 ...
随机推荐
- 在PyQt中直接使用ui文件并加载qrc资源文件
1. 用Qt设计师创建一个包含qrc资源文件的ui文件 2.打开cmd使用以下命令把qrc资源文件转换成十六进制的py文件 pyrcc4 -o C:\res.py C:\res.qrc pyrcc4 ...
- php手册学习
整型:int 转换为整型:intval(str) 32位最大值64位最大值 不存在整除语法:应用round();四舍五入.integer去除小数. $a = 1234; //十进制数 $a = ...
- 13)Java static
1.static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是: ...
- 【设计模式】策略模式 (Strategy Pattern)
策略模式是一种很简单的基础模式,用于封装一系列算法,使客户端的访问独立于算法的实现.我们可以”井中取水”来形象的描述策略模式.“取水”是一个动作,完成这个动作的方式有很多中,可以直接用手提.可以用水车 ...
- DataGridView的DataGridViewCheckBox问题
datagridview有一列DataGridViewCheckBox,但连续点击的话(1秒点击N次),会导致出错,数据处理不正确,感觉 private void dgv_CellContentCli ...
- wpf的datepicker处理
如果有2个datepicker,控制时间起和止的话,可以把第二个datepicker加一个属性,DisplayDateStart = "{Binding SelectedDate,Eleme ...
- C 几种异常机制简单讲述
引言 这是关于C中如何使用异常机制的讨论.顺带讲一讲C中魔法函数的setjmp内部机制.通过它实现高级的异常try...catch. 允许我先扯一段面试题. 对于计算机面试题. 算法题等.觉得还是有意 ...
- C 的 一些写法格式 交流
好久以前刚开始学习前辈们的代码的时候,发现好多代码感到好奇怪. 1)代码看不懂 2)代码格式看不懂 网上也没见同学们分享.当自己代码写多了,也渐渐的理解为什么要这样写了. 说主题之前 还是 说一些 题 ...
- PHP 文件操作函数大全
<?php 读取文件夹: $handler = opendir("c:\");//打开文件夹 while($dir = readdir($handler)){//遍历文件夹 ...
- hdu 5327 Olympiad
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5327 Olympiad Description You are one of the competit ...