P3581 [POI2015] CZA(状压)

解析

不能在一条思路上死磕!

首先这题真正考的其实就是 p=3p=3p=3
乍一看题意:给出一张特殊图,求哈密顿回路方案数。
然后发现这个图性质不咋地。
然后就不会了。

正解根本和哈密顿回路毛关系也没有!
考虑从1-n依次插入。
注意到,插入i的时候,我们其实只关注i-3,i-2,i-1(不妨称其为“关键元素”)互相之间是否相邻。
实现上,由于有环,所以可能还要记录最左和最右的关键元素是否靠边。
把这个状态状压下来,直接转移即可。
口胡一时爽,实现火葬场。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
using namespace std;const int N=1e6+100;
const int inf=1e9;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}inline ll ksm(ll x,ll k){ll res=1;while(k){if(k&1) res=res*x%mod;x=x*x%mod;k>>=1;}return res;
}#define add(x,y) (x+=y,x>=mod?x-=mod:0)int n,m,P;
bool ban[N][10];
int o=5;
struct bruteforce{int ans,a[5];int vis[5];void dfs(int k){if(k>n){bool flag=1;for(int i=1;i<=n;i++){if(abs(a[i]-a[i%n+1])>P||ban[a[i]][a[i]-a[i%n+1]+o]) flag=0;}ans+=flag;return;}for(int i=2;i<=n;i++){if(vis[i]) continue;a[k]=i;vis[i]=1;dfs(k+1);vis[i]=0;}return;}void work(){ans=0;a[1]=1;dfs(2);printf("%d\n",ans);return;}
}bf;
int aa[N];
inline bool check(){for(int i=1;i<=n;i++){if(abs(aa[i+1]-aa[i])>P) return false;if(ban[aa[i]][aa[i]-aa[i+1]+o]) return false;}return true;
}
void work2(){  aa[1]=aa[n+1]=1;int p,num=1;for(p=2;;p+=2){aa[++num]=p;if(p==n){p--;break;}else if(p==n-1){p++;break;}}while(p>1){aa[++num]=p;p-=2;}int res=0;res+=check();reverse(aa+2,aa+1+n);res+=check();printf("%d\n",res);
}
const int bas=4;
inline int Hash(int *x){int res=0;for(int i=1;i<=3;i++) res=res*bas+x[i];return res;
}
int a[5],tmp[10];
int tot,p[N][4],op1[N][3],op2[N][3],tr[N][5],vis[5];
//op1: xiang lin
//op2: kao bian
int id[1050][4][4];
void get(int x,int y){++tot;for(int i=1;i<=3;i++) p[tot][i]=a[i];op1[tot][0]=(x>>1)&1;op1[tot][1]=x&1;op2[tot][0]=(y>>1)&1;op2[tot][1]=y&1;id[Hash(a)][x][y]=tot;//print(tot);
}
void dfs(int k,int x,int y){if(k>3){get(x,y);return;}for(int i=1;i<=3;i++){if(vis[i]) continue;vis[i]=1;a[k]=i;dfs(k+1,x,y);vis[i]=0;}return;
}
inline int ins(int x,int pos){  int num=0;int cur[4],cnt=0;for(int i=0;i<=3;i++){   if(i){tmp[++num]=a[i]-1;}if(i==pos){tmp[++num]=3;}    if(i==0&&!op2[x][0]) tmp[++num]=0;if(i==1&&!op1[x][0]) tmp[++num]=0;if(i==2&&!op1[x][1]) tmp[++num]=0;if(i==3&&!op2[x][1]) tmp[++num]=0; }for(int i=1;i<=num;i++){if(tmp[i]) cur[++cnt]=i;}int f1(0),f2(0);if(cur[1]+1==cur[2]) f1|=2;if(cur[2]+1==cur[3]) f1|=1;if(cur[1]==1) f2|=2;if(cur[3]==num) f2|=1;num=0;for(int i=0;i<=3;i++){if(i){if(a[i]>1)tmp[++num]=a[i]-1;}if(i==pos){tmp[++num]=3;}}return id[Hash(tmp)][f1][f2];
}
void solve(int x){memcpy(a,p[x],sizeof(p[x]));if(op2[x][0]&&op2[x][1]){tr[x][0]=ins(x,0);tr[x][3]=ins(x,3);}if(op1[x][0]) tr[x][1]=ins(x,1);    if(op1[x][1]) tr[x][2]=ins(x,2);
}
int f[2][150],now,pre;
void init(int k){if(k>3){f[now][id[Hash(a)][3][3]]=1;return;}for(int i=1;i<=3;i++){if(vis[i]) continue;vis[i]=1;a[k]=i;init(k+1);vis[i]=0;}return;
}
inline bool prelink(int x,int pl){if(pl==1) return op2[x][0]&&op2[x][1];else return op1[x][pl-2];
}
inline bool suflink(int x,int pl){if(pl==3) return op2[x][0]&&op2[x][1];else return op1[x][pl-1];
}  
void work3(){for(int i=0;i<=3;i++){for(int j=0;j<=3;j++){dfs(1,i,j);}}//debug("tot=%d\n",tot);for(int i=1;i<=tot;i++) solve(i);now=1;pre=0;init(1);for(int i=4;i<=n;i++){swap(now,pre);memset(f[now],0,sizeof(f[now]));for(int j=1;j<=tot;j++){if(!f[pre][j]) continue;a[1]=p[j][1];a[2]=p[j][2];a[3]=p[j][3];int pl=a[1]==1?1:(a[2]==1?2:3);for(int k=0;k<=3;k++){if(!tr[j][k]) continue;int frt= k==pl-1?4:a[(pl+1)%3+1],suf=k==pl?4:a[pl%3+1];if(k==0&&pl==3) suf=4;if(k==3&&pl==1) frt=4;	if(prelink(j,pl)&&ban[i-3+frt-1][frt-1+o]) continue;if(suflink(j,pl)&&ban[i-3][1-suf+o]) continue;add(f[now][tr[j][k]],f[pre][j]);}}}ll ans=0;for(int i=1;i<=tot;i++){    bool flag=1;memcpy(a,p[i],sizeof(p[i]));for(int j=1;j<=3&&flag;j++){int pre=(j+1)%3+1,suf=j%3+1;if(prelink(i,j)&&ban[n-3+a[pre]][a[pre]-a[j]+o]){flag=0;}else if(suflink(i,j)&&ban[n-3+a[j]][a[j]-a[suf]+o]){flag=0;}}if(flag) add(ans,f[now][i]);}ans=ans*ksm(n,mod-2)%mod;printf("%lld\n",ans);return;
}
signed main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();m=read();P=read();for(int i=1;i<=m;i++){int x=read(),y=read();if(abs(x-y)<=P) ban[x][x-y+o]=1;}if(n<=3){bf.work();return 0;}if(P<=1){printf("0");return 0;}else if(P==2){work2();return 0;}else work3();return 0;
}
/*
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Wf2011]Chips Challenge(最小费用最大流)

[Wf2011]Chips Challengeproblemsolutioncodeproblem BZOJ2673 solution . 首先得知道这是网络流&#xff0c;但真的看不出来啊&#xff01;&#xff01;我真的郁闷啊(&#xffe3;﹏&#xffe3;&#xff1b;) 在知道做法是网络流后&#xff0c;初读题&#xff0c;肯定会…

深度:从 Office 365 新图标来看微软背后的设计新理念

开始表演请关注我的公众号“寒树Office”来获取一些新鲜而有趣的新闻与知识&#xff0c;最近又有两家俱乐部上线了&#xff08;东莞与长沙&#xff09;&#xff0c;俱乐部的活动告一段落&#xff0c;接下来的日子里我将持续与大家分享 Office 365 的精彩内容&#xff0c;这次很…

BZOJ4294 : [PA2015]Fibonacci(dfs、暴力、数位dp)

解析 新定义数位dp了属于是。 结论&#xff1a;斐波拉契在模 10m10^m10m 的意义下循环节为 6*10^m。 但这个不一定是最小循环节&#xff0c;我自己做的时候打表得出来的循环节更小。 考虑从低到高枚举周期中的位置&#xff0c;暴力check合法进行剪枝。 跑的飞快&#xff0c;O…

Chip Factory HDU - 5536

Chip Factory HDU - 5536 题意&#xff1a; 给你n个数&#xff0c;让你从中选出i&#xff0c;j&#xff0c;k三个下标&#xff0c;求最大的 &#xff08;a[i]a[j]&#xff09;^ a[k] 题解&#xff1a; 这种查找最大异或一般有两个方向&#xff0c;一个是有公式推导规律可循…

AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)

AtCoder Regular Contest 061 E - Snuke’s Subway Trip problem 洛谷翻译 my idea 最近一直在做网络流&#xff0c;所以一读这题后&#xff0c;我就想到了最小费用流。 首先的问题就是建边问题。 不同线路到达同一个点从而引发后面的费用是相互独立的&#xff0c;不能由…

NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统

前言当一个APM或一个日志中心实际部署在生产环境中时&#xff0c;是有点力不从心的。比如如下场景分析的问题&#xff1a;从APM上说&#xff0c;知道某个节点出现异常&#xff0c;或延迟过过高&#xff0c;却不能及时知道日志反馈情况&#xff0c;总不可能去相应的节点上一个一…

HDU5519:Kykneion asma(容斥)

计数的核心是双射。 解析 这也叫数位dp呗… 首先&#xff0c;这个题目的形式很容易令人想到硬币购物&#xff0c;考虑用容斥解决&#xff0c;暴力枚举强制超额的数的集合然后分别计算贡献。 然而&#xff0c;暴力dp计算贡献的复杂度是 O(n2)O(n^2)O(n2) 的。 考虑换一种统计…

Dancing Stars on Me HDU - 5533

Dancing Stars on Me HDU - 5533 题意&#xff1a; LYD又来了&#xff0c;这次他碰到了一个小问题&#xff0c;给定n个点&#xff0c;点的坐标为均为整数&#xff0c;问这些点能否组成正多边形&#xff1f; 题解&#xff1a; 如果是正多边形&#xff0c;那中心的坐标就是所…

[HDU 3625] Examining the Rooms(第一类斯特林数)

Examining the Roomsproblemsolutioncodeproblem hdu 3625 solution 之前考试有一道题&#xff1a;最多砸开 kkk 扇门&#xff0c;采取最有操作&#xff0c;求把 nnn 个门都打开的方案数。 本题稍稍多了一个不能砸开第一扇门的限制&#xff0c;以及求的是概率。 概率好说&…

P5801 [SEERC2019]Game on a Tree(博弈论)

解析 一直在路径可逆上做功夫&#xff0c;跑偏了。 题目可以转化为一个模型&#xff1a;给出一张无向图&#xff0c;每次可以移动到未移动过的点上&#xff0c;不能移动者判负。 这个的做法就是判断是否完美匹配&#xff0c;完美匹配则后手必胜&#xff0c;否则先手必胜。 …

House Building HDU - 5538

House Building HDU - 5538 题意&#xff1a; 有n * m的地方&#xff0c;每个地方都有不同高度的1 * 1的正方形块&#xff0c;相邻块紧密排列&#xff0c;问这些块的表面积是多少&#xff1f; 题解&#xff1a; 对于位置为(i,j)的一个高度为x的块&#xff0c;他的测表面积为…

.NET 中创建支持集合初始化器的类型

对象初始化器和集合初始化器只是语法糖&#xff0c;但是能让你的代码看起来更加清晰。至少能让对象初始化的代码和其他业务执行的代码分开&#xff0c;可读性会好一些。本文将编写一个类型&#xff0c;可以使用集合初始化器构造这个类型。不只是添加元素的集合初始化器&#xf…

【无码专区8】三角形二维数点——计数有多少个给定点落在三角形区域内

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…

P3426 [POI2005]SZA-Template(kmp、dp)

解析 做出来了就是胜利&#xff01; 个人感觉虽然我这个nxt树的码量会大一点&#xff0c;但是思路其实比较自然。&#xff08;看题解区也有&#xff09; 也是一个相当可取的做法。 现在来讲讲巧妙的dp做法。 考虑直接嗯设&#xff1a;fif_ifi​ 表示覆盖 [1,i][1,i ][1,i] 的…

为什么我的会话状态在ASP.NET Core中不工作了?

原文&#xff1a;Why isnt my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookies作者&#xff1a;Andrew Lock译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10526380.html译者&#xff1a;Lamond Lu在本篇博客中&#xff0c;我将…

Jury Compromise POJ - 1015

Jury Compromise POJ - 1015 题意&#xff1a; 在遥远的国家佛罗布尼亚&#xff0c;嫌犯是否有罪&#xff0c;须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n个人作为陪审团的候选人&#xff0c;然后再从这n个人中选m人组成陪审团。选m人的办法是&#xff1a; 控…

叁仟柒佰万(mex+线段树+dp+前缀和优化+双指针+桶)

叁仟柒佰万problemsolutioncode(50’)code(90’)code(100’)problem 多组数据。 给定一个序列 aaa&#xff0c;你可以将它划分成任意多段&#xff0c;满足每一个段的 mex 相同。 求方案数&#xff0c;对 109710^971097 取模。 T≤10,n≤3e5T\le 10,n\le 3e5T≤10,n≤3e5。 …

模板:吉司机线段树

所谓吉司机线段树&#xff0c;就是吉司机种的线段树 &#xff08;逃&#xff09; 解析 之前也看过一些相关内容的博客&#xff0c;但是因标记乱七八糟&#xff0c;感觉过于高深而放弃了… 直到看到洛谷这篇博客&#xff0c;完全颠覆了我的认知。&#xff08;怎么感觉语气像营…

现身说法:实际业务出发分析百亿数据量下的多表查询优化

今天给大家带来的讨论主题是通过实战经验来对百亿数据量下的多表数据查询进行优化&#xff0c;俗话说的好&#xff0c;一切脱离业务的架构都是耍流氓&#xff0c;接下来我就整理一下今天早上微信群里石头哥给大家分享的百亿数据量多表查询架构以及优化思路。由于本文内容整理自…

Help Jimmy POJ - 1661

Help Jimmy POJ - 1661 题意&#xff1a; 场景中包括多个长度和高度各不相同的平台。地面是最低的平台&#xff0c;高度为零&#xff0c;长度无限。 Jimmy老鼠在时刻0从高于所有平台的某处开始下落&#xff0c;它的下落速度始终为1米/秒。当Jimmy落到某个平台上时&#xff0c…