[POI2015]CZA
p很小,讨论
p=0。。。
p=1。。。
p=2:n-1放左或者放右两种情况,剩下怎么放是固定的,模拟然后判断即可
p=3:
正着做要状压,类似放书和排座位那些题,考虑以某个顺序加入元素,不断扩充出整个环
不妨从n开始往下加,其实只用考虑i,i-1,i-2和要放的i-3的关系。i-3只能放在这三个的两个的中间,
所以这中间不能再有之前的i+1,i+2这种了。
而且区分左右还要记录顺逆
f[i][0/1][2^3]前i个,顺逆,相邻能不能放(是否紧相邻)
然后枚举放哪里转移,之后i会固定,看会不会和i-1,i-2,i-3冲突
转移时候大力分类讨论
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
const int mod=1e9+;
int n,k,p;
int no[N][];//0:-3; 1:-2 ; 2:-1 ; 3:0 ; 4:1 ; 5:2 ; 6:3
int add(int x,int y){
return x+y>=mod?x+y-mod:x+y;
}
void sol0(){
if(n==) puts("");
else puts("");
}
void sol1(){
if(n==||(n==&&k==)) puts("");
else puts("");
}
int a[N];
void sol2(){
if(n<=){
if(n==||(n==&&k==)) puts("");
else puts("");
return;
}
int ans=;
a[]=n;
for(reg x=n-,i=;x>;++i,x-=) a[i]=x;
for(reg x=n-,i=n;x>;--i,x-=) a[i]=x;
bool fl=true;
for(reg i=;i<n;++i){
if(no[a[i]][a[i+]-a[i]+]) fl=false;
}
if(no[a[n]][a[]-a[n]+]) fl=false;
if(fl) ++ans; a[]=n;
for(reg x=n-,i=;x>;++i,x-=) a[i]=x;
for(reg x=n-,i=n;x>;--i,x-=) a[i]=x;
fl=true;
for(reg i=;i<n;++i){
if(no[a[i]][a[i+]-a[i]+]) fl=false;
}
if(no[a[n]][a[]-a[n]+]) fl=false;
if(fl) ++ans;
printf("%d",ans);
}
int f[N][][];
int dis(int x,int y){
return y-x+;
}
int mk(int s1,int s2,int s3){
return s3*+s2*+s1;
}
void calc(int i,int j,int s){//add i-1
int now=f[i][j][s];
int s1=s&,s2=(s>>)&,s3=(s>>)&;
if(i!=){
if(j==){//shun
if(s1){
if(s3){
if(no[i][dis(i,i+)]==&&no[i+][dis(i+,i-)]==) f[i-][j][mk(s2,,)]=add(f[i-][j][mk(s2,,)],now);
}
else{
if(no[i+][dis(i+,i-)]==) f[i-][j][mk(s2,,)]=add(f[i-][j][mk(s2,,)],now);
}
}
if(s2){
if((s1==||no[i+][dis(i+,i+)]==)&&(s3==||no[i][dis(i,i+)]==)) f[i-][j^][mk(,,)]=add(f[i-][j^][mk(,,)],now);
}
if(s3){
if((s1==||no[i+][dis(i+,i+)]==)&&(no[i-][dis(i-,i+)]==)) f[i-][j][mk(s2,,)]=add(f[i-][j][mk(s2,,)],now);
}
}
else{//j==1
if(s1){
if(s3){
if(no[i+][dis(i+,i)]==&&no[i-][dis(i-,i+)]==) f[i-][j][mk(s2,,)]=add(f[i-][j][mk(s2,,)],now);
}
else{
if(no[i-][dis(i-,i+)]==) f[i-][j][mk(s2,,)]=add(f[i-][j][mk(s2,,)],now);
}
}
if(s2){
if((s1==||no[i+][dis(i+,i+)]==)&&(s3==||no[i+][dis(i+,i)]==)) f[i-][j^][mk(,,)]=add(f[i-][j^][mk(,,)],now);
}
if(s3){
if((s1==||no[i+][dis(i+,i+)]==)&&(no[i+][dis(i+,i-)]==)) f[i-][j][mk(s2,,)]=add(f[i-][j][mk(s2,,)],now);
}
}
}else{//las
if(j==){
if(s1){
if((s3==||no[i][dis(i,i+)]==)&&(no[i+][dis(i+,i-)]==)&&(no[i-][dis(i-,i+)]==)&&(s2==||no[i+][dis(i+,i)]==)){
f[i-][j][mk(,,)]=add(f[i-][j][mk(,,)],now);
}
}
if(s2){
if((s3==||no[i][dis(i,i+)]==)&&(s1==||no[i+][dis(i+,i+)]==)&&(no[i+][dis(i+,i-)]==&&no[i-][dis(i-,i)]==)){
f[i-][j^][mk(,,)]=add(f[i-][j^][mk(,,)],now);
}
}
if(s3){
if((s1==||no[i+][dis(i+,i+)]==)&&(s2==||no[i+][dis(i+,i)]==)&&(no[i][dis(i,i-)]==&&no[i-][dis(i-,i+)]==)){
f[i-][j][mk(,,)]=add(f[i-][j][mk(,,)],now);
}
}
}
else{
if(s1){
if((s3==||no[i+][dis(i+,i)]==)&&(no[i-][dis(i-,i+)]==)&&(no[i+][dis(i+,i-)]==)&&(s2==||no[i][dis(i,i+)]==)){
f[i-][j][mk(,,)]=add(f[i-][j][mk(,,)],now);
}
}
if(s2){
if((s3==||no[i+][dis(i+,i)]==)&&(s1==||no[i+][dis(i+,i+)]==)&&(no[i-][dis(i-,i+)]==&&no[i][dis(i,i-)]==)){
f[i-][j^][mk(,,)]=add(f[i-][j^][mk(,,)],now);
}
}
if(s3){
if((s1==||no[i+][dis(i+,i+)]==)&&(s2==||no[i][dis(i,i+)]==)&&(no[i-][dis(i-,i)]==&&no[i+][dis(i+,i-)]==)){
f[i-][j][mk(,,)]=add(f[i-][j][mk(,,)],now);
}
}
}
}
}
void sol3(){
if(n<=){
if(n==||(n==&&k==)) puts("");
else puts("");
return;
}
if(n==){
int ans=;
if(no[n][dis(n,n-)]==&&no[n-][dis(n-,n-)]==&&no[n-][dis(n-,n)]==) ++ans;
if(no[n][dis(n,n-)]==&&no[n-][dis(n-,n-)]==&&no[n-][dis(n-,n)]==) ++ans;
printf("%d",ans);
return ;
}
f[n-][][]=;f[n-][][]=;
for(reg i=n-;i>=;--i){
for(reg s=;s<;++s){
if(f[i][][s]) calc(i,,s);
if(f[i][][s]) calc(i,,s);
}
}
int ans=;
for(reg s=;s<;++s){
ans=add(ans,add(f[][][s],f[][][s]));
}
printf("%d",ans);
}
int main(){
rd(n);rd(k);rd(p);
int x,y;
for(reg i=;i<=k;++i){
rd(x);rd(y);
if(abs(x-y)<=p){
no[x][y-x+]=;
}
}
if(p==) sol0();
else if(p==) sol1();
else if(p==) sol2();
else sol3();
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/3/3 10:02:45
*/
[POI2015]CZA的更多相关文章
- BZOJ 4385: [POI2015]Wilcze doły
4385: [POI2015]Wilcze doły Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 648 Solved: 263[Submit][ ...
- BZOJ 4384: [POI2015]Trzy wieże
4384: [POI2015]Trzy wieże Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 217 Solved: 61[Submit][St ...
- Bzoj 3747: [POI2015]Kinoman 线段树
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 553 Solved: 222[Submit][Stat ...
- BZOJ 3747 POI2015 Kinoman 段树
标题效果:有m点,每个点都有一个权值.现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大 想了很久,甚至神标题,奔说是水的问题--我醉了 枚举左点 对于每个请求留点右键 ...
- [Poi2015]
[POI2015]Łasuchy 一看以为是sb题 简单来说就是每个人获得热量要尽量多 不能找别人 首先这道题好像我自己找不到NIE的情况 很容易想到一个优化 如果一个数/2>另一个数 那么一定 ...
- BZOJ_4378_[POI2015]Logistyka_树状数组
BZOJ_4378_[POI2015]Logistyka_树状数组 Description 维护一个长度为n的序列,一开始都是0,支持以下两种操作: 1.U k a 将序列中第k个数修改为a. 2.Z ...
- BZOJ_3747_[POI2015]Kinoman_线段树
BZOJ_3747_[POI2015]Kinoman_线段树 Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放 ...
- POI2015 解题报告
由于博主没有BZOJ权限号, 是在洛咕做的题~ 完成了13题(虽然有一半难题都是看题解的QAQ)剩下的题咕咕咕~~ Luogu3585 [POI2015]PIE Solution 模拟, 按顺序搜索, ...
- P3594 [POI2015]WIL-Wilcze doły
P3594 [POI2015]WIL-Wilcze doły 题目描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得 ...
随机推荐
- confluence上传文件附件预览乱码问题(linux服务器安装字体操作)
在confluence上传excel文件,预览时发现乱码问题主要是因为再上传文件的时候一般是Windows下的文件上传,而预览的时候,是linux下的环境,由于linux下没有微软字体,所以预览的时候 ...
- python基础学习笔记(十一)
迭代器 本节进行迭代器的讨论.只讨论一个特殊方法---- __iter__ ,这个方法是迭代器规则的基础. 迭代器规则 迭代的意思是重复做一些事很多次---就像在循环中做的那样.__iter__ 方 ...
- Codeforces Round #503 (by SIS, Div. 2)-C. Elections
枚举每个获胜的可能的票数+按照花费排序 #include<iostream> #include<stdio.h> #include<string.h> #inclu ...
- python 中的列表(list)
一.生成一个列表 直接生成 L1 = [1, 2, 3, 4, 5] 列表解析式 >>> L2 = [x for x in range(1, 10, 2)] #从1到10的迭代,步长 ...
- weex 开发踩坑日记--环境配置、安卓运行、adb、开发
环境配置方面 1.需要安装java和android环境,java的话一定要下载jdk而不是jre. 在"系统变量"新建一个变量名为JAVA_HOME的变量,变量值为你本地java的 ...
- 关于<T> T[] toArray(T[] a) 方法
http://mopishv0.blog.163.com/blog/static/5445593220101016102129741/ private List<String> uploa ...
- JavaScript 模拟 HashMap例子
function map(){ var map = {}; // Map map = new HashMap(); var key = "key"; va ...
- Oracle18c Exadata 版本安装介质安装失败。
下载下来的介质安装失败 白费一早上的功夫.. 一会儿问问云和恩墨的人呢.. INFO: [-- ::] Skipping line: 复制数据库文件 INFO: [-- ::] Skipping li ...
- Linux中gcc与g++编译器的区别
一.对于C文件 对于C文件gcc和g++所做的事情确实是一样的,g++在编译C文件时调用了gcc. 二.对于C++文件 1.预处理 预处理gcc与g++做了相同的事. 2.编译 gcc无法自动和c++ ...
- Chrome disable cache & clear memory cache
Chrome disable cache & clear memory cache disable cache