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 ...
随机推荐
- 登录成功返回登录前页面js代码
/*------ setCookie(name,value) -----------*/ function setCookie(name,value) { var Days = 30; //此 coo ...
- Delphi的"Invalid pointer operation"异常的解决办法
今天用Delphi编写了个dll,用到了TStringList来传递多参数,如下: [delphi] view plaincopy 01.function DBM_SetParam(procName: ...
- instanceof、==号、Objetc类
1)instanceof: 判断某个对象是否为某个类的实例,注意多态的运用,一个父类引用指向子类的对象,根据继承,子类就是父类,所以子类也可以看做是父类的一个实例. 形式:引用 instanceof ...
- 学习XML总结
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分. 元素可包含其他元素.文本或者两者的混合物.元素也可以拥有属性. xml包含如下: 元素 文本 属性 元素 命名: 名称可以含字母. ...
- iOS 关于webView的使用方法
关于webView的使用方法还是比较简单的.直接上代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
- squid基础配置
1 2 3 4 5 6 7 8 9 10 vim /etc/squid/squid.conf http_port 192.168.1.12:3128 (可写多个) cache_mem 64MB ...
- wordpress 为文章内容添加自动过滤,例如为出站链接添加nofollow,也可以将淘宝客链接转换。。
做seo的都明白,反向链接对与网站的优化有着很重要的作用,是搜索引擎给网站排名的一个重要因素.为了添加反向链接,SEO作弊者会在论坛和博客等大量发布带无关链接的 内容.这些垃圾链接的存在给搜索引擎对网 ...
- [转]IP_ADD_MEMBERSHIP : 组播错误 的解决方法:
[转]IP_ADD_MEMBERSHIP : 组播错误 的解决方法: http://www.cnitblog.com/dvb-dvb/archive/2012/10/15/aa.html by def ...
- 理解JavaScript中的事件路由冒泡过程及委托代理机制
当我用纯CSS实现这个以后.我开始用JavaScript和样式类来完善功能. 然后,我有一些想法,我想使用Delegated Events (事件委托)但是我不想有任何依赖,插入任何库,包括jQuer ...
- Unity3D定制新建C#文件的头描述
1. 修改模板内容如下: MAC:Unity.app/Contents/Resources/ScriptTemplates/81-C# Script-NewBehaviourScript.cs.txt ...