ural 1251. Cemetery Manager
1251. Cemetery Manager
Memory limit: 64 MB
Input
Output
Sample
| input | output |
|---|---|
2 2 |
3 |
Notes
- Each tomb has 2 to 8 neighbors.
- If a client was buried on day T then the tomb may be dug over on day T+1001 and may not be dug over on day T+1000.
- If a tomb was visited on day T then its neighbors may be dug over on day T+101 and may not be dug over on day T+100.
- A tomb is dug over as soon as there is an opportunity (see items 2 and 3).
- During a funeral relatives notice nothing including the neighbors.
- The clients are numbered in the the order that they arrive (including those who was sent to crematorium).
- If there is already no tomb or the client has been sent to the crematorium immediately or there is no client with the required number then a visit affects nothing.
- The next in turn client may be always burried in an empty tomb inspite of the neighbor tombs visits (the neighbors' relatives wouldn't be surprised having found out that the adjacent empty tomb is already occupied).
Problem Source: Open collegiate programming contest for student teams, Ural State University, March 15, 2003
/**
Create By yzx - stupidboy
*/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <ctime>
#include <iomanip>
using namespace std;
typedef long long LL;
typedef double DB;
#define MIT (2147483647)
#define INF (1000000001)
#define MLL (1000000000000000001LL)
#define sz(x) ((int) (x).size())
#define clr(x, y) memset(x, y, sizeof(x))
#define puf push_front
#define pub push_back
#define pof pop_front
#define pob pop_back
#define mk make_pair inline int Getint()
{
int Ret = ;
char Ch = ' ';
bool Flag = ;
while(!(Ch >= '' && Ch <= ''))
{
if(Ch == '-') Flag ^= ;
Ch = getchar();
}
while(Ch >= '' && Ch <= '')
{
Ret = Ret * + Ch - '';
Ch = getchar();
}
return Flag ? -Ret : Ret;
} const int N = , MAXINDEX = , LEN = , ILEN = ;
class Node
{
private :
int x, y; public :
Node() {}
Node(int tx, int ty)
{
x = tx, y = ty;
} inline bool operator <(const Node &t) const
{
if(x != t.x) return x > t.x;
return y > t.y;
} inline int GetRow()
{
return x;
} inline int GetCol()
{
return y;
} inline int GetTime()
{
return x;
} inline int GetIndex()
{
return y;
}
} ;
class Heap
{
private :
priority_queue<Node> Store; public :
inline void Push(int x, int y)
{
Store.push(Node(x, y));
} inline void Push(const Node &x)
{
Store.push(x);
} inline void Pop()
{
Store.pop();
} inline Node GetTop()
{
return Store.top();
} inline bool Empty()
{
return Store.empty();
}
} deadtime, emptylist;
int n, m, cnttombs;
int endtime[MAXINDEX], graph[N][N];
Node where[MAXINDEX];
bool have[MAXINDEX];
int ans; inline void Input()
{
scanf("%d%d", &n, &m);
} inline void Dug(int now)
{
while(!deadtime.Empty())
{
Node t = deadtime.GetTop();
int idx = t.GetIndex(), deadline = t.GetTime();
if(!have[idx] || endtime[idx] != deadline)
deadtime.Pop();
else if(deadline >= now) break;
else
{
emptylist.Push(where[idx]);
graph[where[idx].GetRow()][where[idx].GetCol()] = -;
where[idx] = Node(-, -);
endtime[idx] = -, have[idx] = ;
deadtime.Pop();
}
}
} inline bool AddTomb(int now)
{
bool ret = ;
cnttombs++;
while(!ret && !emptylist.Empty())
{
Node t = emptylist.GetTop();
int x = t.GetRow(), y = t.GetCol();
graph[x][y] = cnttombs, where[cnttombs] = t;
have[cnttombs] = , endtime[cnttombs] = now + LEN;
deadtime.Push(endtime[cnttombs], cnttombs);
emptylist.Pop();
ret = ;
}
return ret;
} inline bool Check(int x, int y)
{
if(x < || x >= n || y < || y >= m) return ;
if(!graph[x][y] || !have[graph[x][y]]) return ;
return ;
} inline void Visit(int now, int idx)
{
const int DX[] = {-, , , , -, -, , },
DY[] = {, -, , , -, , -, };
if(!have[idx]) return;
int x = where[idx].GetRow(), y = where[idx].GetCol();
endtime[idx] = max(endtime[idx], now + LEN);
deadtime.Push(endtime[idx], idx);
for(int t = ; t < ; ++ t)
{
int dx = x + DX[t], dy = y + DY[t];
if(!Check(dx, dy)) continue;
endtime[graph[dx][dy]] = max(endtime[graph[dx][dy]], now + ILEN);
deadtime.Push(endtime[graph[dx][dy]], graph[dx][dy]);
}
} inline void Solve()
{
for(int i = ; i < n; i++)
for(int j = ; j < m; j++)
emptylist.Push(i, j); char type;
int t, idx;
while(scanf("%d", &t) == )
{
for(type = ' '; type != 'v' && type != 'd'; type = getchar());
Dug(t);
if(type == 'd')
{
bool ret = AddTomb(t);
ans += !ret;
}
else
{
scanf("%d", &idx);
Visit(t, idx);
}
} printf("%d\n", ans);
} int main()
{
freopen("a.in", "r", stdin);
Input();
Solve();
return ;
}
ural 1251. Cemetery Manager的更多相关文章
- ural 1255. Graveyard of the Cosa Nostra
1255. Graveyard of the Cosa Nostra Time limit: 1.0 secondMemory limit: 64 MB There is a custom among ...
- ural 1252. Sorting the Tombstones
1252. Sorting the Tombstones Time limit: 1.0 secondMemory limit: 64 MB There is time to throw stones ...
- ural 1249. Ancient Necropolis
1249. Ancient Necropolis Time limit: 5.0 secondMemory limit: 4 MB Aerophotography data provide a bit ...
- URAL 1252 ——Sorting the Tombstones——————【gcd的应用】
Sorting the Tombstones Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I ...
- URAL ——1249——————【想法题】
Ancient Necropolis Time Limit:5000MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u ...
- Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager
Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...
- 如何重新注册VMware Update Manager(VUM)至vCenter Server中
在VMware的vSphere化境中,VUM的角色相当于Windows 环境中的WSUS(Windows 更新服务器),可以批量,自动化的完成所管辖ESXi主机的大版本迁移,小版本升级的任务,深受管理 ...
- 使用tomcat manager 管理和部署项目
在部署tomcat项目的时候,除了把war文件直接拷贝到tomcat的webapp目录下,还有一种方法可以浏览器中管理和部署项目,那就是使用tomcat manager. 默认情况下,tomcat m ...
- Ubuntu管理开机启动服务项 -- 图形界面的Boot-up Manager
有时学习时安装的服务太多,比如mysql.mongodb.redis.apache.nginx等等,它们都是默认开机启动的,如果不想让它们开机启动,用到时再自己手工启动怎么办呢? 使用sysv-rc- ...
随机推荐
- SQL Server之存储过程基础知
什么是存储过程呢?存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句. 那为什么要用存储过程呢?1.存储过程只在创造时进行编译, ...
- Oracle读写分离架构
读写分离是架构分布式系统的一个重要思想.不少系统整体处理能力并不能同业务的增长保持同步,因此势必会带来瓶颈,单纯的升级硬件并不能一劳永逸.针对业务类型特点,需要从架构模式上进行一系列的调整,比如业务模 ...
- 修改searchbar 取消 字体 颜色
UIButton *cancelButton; UIView *topView = self.searchDisplayController.searchBar.subviews[]; for (UI ...
- Ionic环境搭建
stepts npm install -g ionic@beta Make sure you have NodeJS installed. Download the installer here or ...
- .net学习之Attribute特性和EF关键知识点
一.Attribute特性/标签1.Attribute用来对类.属性.方法等标注额外的信息,贴一个标签简单的说,定制特性Attribute,本质上就是一个类,它为目标元素提供关联附加信息,并在运行时以 ...
- Delphi字符串的基本操作与常用函数
参考:http://www.cnblogs.com/pchmonster/archive/2011/12/16/2290034.html 结合这个博客一起学习:http://www.cnblogs.c ...
- Pyqt 时时CPU使用情况
借鉴代码来自:https://github.com/hgoldfish/quickpanel 实现代码: # -*- coding:utf-8 -*- from __future__ import p ...
- Oracle【IT实验室】数据库备份与恢复之四:RMAN(备份与恢复管理器)
RMAN是ORACLE提供的一个备份与恢复的工具,可以用来备份和还原数据库文件. 归档日志和控制文件.它也可以用来执行完全或不完全的数据库恢复. RMAN可以由命令行接口或者 OEM的 Backup ...
- hdu 4738 2013杭州赛区网络赛 桥+重边+连通判断 ***
题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥,使得这n座岛不连通,求最少要派多少人去. 处理重边 边在遍历的时候,第一个返回的一定是之前去的边,所以 ...
- 第一次尝试用 Live Writer 写博客
之前在官网上下载了最新版的Windows Live Writer,可是安装不了,就在其他网站下了一个试试,可以安装,不过却是2009年的版本,很不喜欢,我希望能体验最新版的,回头还得重新下个最新版的安 ...