题目大意:
  日历上博弈,从给定的日期,按照下述规则跳转日期:
    1.跳到第二天;
    2.调到下个月相同的日期(如果没有就不能跳转)。
  刚刚好跳到2001年11月4日的人胜,跳转时不能跳到2001年11月4日以后。
  现在A和B轮流跳,问A是否有必胜策略。

思路:
  如果不考虑边界情况,每一个对应的日期都有两个直接相连的后继状态,也同时是两个日期直接相连的后继状态。
  这样,所有的状态构成一个DAG,我们可以在DAG上进行DP。
  一个状态是必败状态当且仅当它的两个前驱状态都是必胜状态。
  一个状态是必胜状态当且仅当它的其中一个前驱状态是必败状态。
  我们可以先预处理出所有日期所对应的状态,然后回答即可。
  另外本题也有找规律的做法,设月份为m,日期为d。
  则当m+d为偶数时必胜,当m+d为奇数时必败。
  特别地,当m=9或11且d=30时,也为必胜状态。

 #include<map>
#include<cstdio>
#include<cctype>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
struct Date {
int y,m,d;
bool operator < (const Date &another) const {
if(y<another.y) {
return true;
} else if(y==another.y){
if(m<another.m) {
return true;
} else if(m==another.m) {
if(d<another.d) return true;
}
}
return false;
}
bool operator <= (const Date &another) const {
if(y<another.y) {
return true;
} else if(y==another.y){
if(m<another.m) {
return true;
} else if(m==another.m) {
if(d<=another.d) return true;
}
}
return false;
}
bool isleap() const {
return (!(y%)&&(y%))||!(y%);
}
int day() const {
if(m==||m==||m==||m==||m==||m==||m==) return ;
if(m==||m==||m==||m==) return ;
return isleap()?:;
}
Date decday() const {
Date ret=*this;
ret.d--;
if(!ret.d) {
ret.m--;
if(!ret.m) {
ret.y--;
ret.m=;
}
ret.d=ret.day();
}
return ret;
}
Date decmonth() const {
Date ret=*this;
ret.m--;
if(!ret.m) {
ret.y--;
ret.m=;
}
if(ret.d>ret.day()) return (Date){,,};
return ret;
}
Date incday() const {
Date ret=*this;
ret.d++;
if(ret.d>ret.day()) {
ret.m++;
if(ret.m==) {
ret.y++;
ret.m=;
}
ret.d=;
}
return ret;
}
Date incmonth() const {
Date ret=*this;
ret.m++;
if(ret.m==) {
ret.y++;
ret.m=;
}
if(ret.d>ret.day()) return (Date){,,};
return ret;
}
};
const Date begin=(Date){,,},end=(Date){,,};
std::map<Date,bool> m;
inline void dp() {
for(Date d=end;begin<=d;d=d.decday()) {
if(d.incday()<=end) {
m[d]|=!m[d.incday()];
}
if(d.incmonth()<=end) {
m[d]|=!m[d.incmonth()];
}
}
}
inline bool query(const int &y,const int &mm,const int &d) {
return m[(Date){y,mm,d}];
}
int main() {
dp();
for(register int n=getint();n;n--) {
const int &y=getint(),&m=getint(),&d=getint();
puts(query(y,m,d)?"YES":"NO");
}
return ;
}

[POJ1082]Calendar Game的更多相关文章

  1. poj1082 Calendar Game (博弈)

    题意是:Adam和Eve两人做游戏,开始给出一个日期,截止日期是2011.11.4,游戏规则如下: 每个人只能将天数增加一天或者将月份增加一天.如果下个月没有这一天,那么只能增加天数. 游戏胜利定义为 ...

  2. 【POJ1082】Calendar Game (博弈)

    [题目] Description Adam and Eve enter this year's ACM International Collegiate Programming Contest. La ...

  3. Java 时间类-Calendar、Date、LocalDate/LocalTime

    1.Date 类 java.util.Date是一个"万能接口",它包含日期.时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪 ...

  4. Js: Extensible Calendar Examples

    http://ext.ensible.comhttps://github.com/bmoeskau/Extensiblehttps://github.com/TeamupCom/extensibleh ...

  5. Calendar类

    Calendar类 注意:根据日历规则,如果想要这个月减去5天,那么则为: add(Calendar.Day,-5) 成员方法: public int get(int field):返回给定日历段的值 ...

  6. This month Calendar

    package fourth;import java.text.DateFormatSymbols;import java.util.*;public class CalendarTest { pub ...

  7. calendar的一些操作

    一.通过分析日期函数,根据日期进行一系列操作,例如:我们需要知道2个时间段中所有的日期等等. 由于Calendar 类是一个抽象类,因此我们不能通过new来获取该对象的实例.我们可以通过其类方法 ge ...

  8. java-String Date Calendar之间的转换

    1.Calendar 转化 String Calendar calendat = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDa ...

  9. jQuery Ion.Calendar 日期/日历

    在线实例 实例演示 默认 实例演示 每周第一天 实例演示 输入框插件 实例演示 HTML data 属性 实例演示 回调函数1 实例演示 回调函数2 使用方法 <div id="cal ...

随机推荐

  1. FPGA设计方法检查表

    -----------------------摘自<FPGA软件测试与评价技术> 中国电子信息产业发展研究院 | 编著------------------------------- 文本格 ...

  2. 79.ZYNQ内部私有定时器中断

    上篇文章实现了了PS接受来自PL的中断,本片文章将在ZYNQ的纯PS里实现私有定时器中断.每个一秒中断一次,在中断函数里计数加1,通过串口打印输出. *本文所使用的开发板是Miz702(兼容zedbo ...

  3. vm tools安装包为空

    新装了linux mint虚拟机之后突然发现安装vm tools时为空 1.关闭虚拟机2.打开设置 3.把CD/DVD(SATA)从安装系统时挂载的镜像改为自动检测 4.重启安装vm tools发现没 ...

  4. replication-manager 搭建

    replication-manager 搭建 介绍 replication-manager 主要用于mysql主从结构的监控和主从切换. 安装 vi /etc/yum.repos.d/signal18 ...

  5. Oracle和MySQL的高可用方案对比【转】

    关于Oracle和MySQL的高可用方案,其实一直想要总结了,就会分为几个系列来简单说说.通过这样的对比,会对两种数据库架构设计上的细节差异有一个基本的认识.Oracle有一套很成熟的解决方案.用我在 ...

  6. git本地分支和远程分支改名

    #1 将本地分支进行改名 git branch -m old_branch new_branch #2 将远程分支的老分支删除 git push origin :old_branch #3 将改名后的 ...

  7. Python的set集合详解

    Python 还包含了一个数据类型 -- set (集合).集合是一个无序不重复元素的集.基本功能包括关系测试和消除重复元素.集合对象还支持 union(联合),intersection(交),dif ...

  8. php内存管理机制与垃圾回收机制

    PHP内存管理机制 1 var_dump(memory_get_usage()); //获取内存 2 $a = "laruence"; //定义一个变量 3 var_dump(me ...

  9. SNMP相关命令

    SNMP的相关命令使用方法: snmpdelta 一直监视SNMP变量中的变化 linux:~ # snmpdelta -c public -v 1 -Cs -CT localhost IF-MIB: ...

  10. (四)Jsoup 获取 DOM 元素属性值

    第一节: Jsoup 获取 DOM 元素属性值 Jsoup获取DOM元素属性值 比如我们要获取博客的href属性值: 我们这时候就要用到Jsoup来获取属性的值 : 我们给下示例代码: package ...