首页 > 其他分享 >luogu P3685 [CERC2016]不可见的整数 Invisible Integers

luogu P3685 [CERC2016]不可见的整数 Invisible Integers

时间:2022-10-17 19:22:27浏览次数:79  
标签:Integers && int luogu 向右走 CERC2016 using dp define

题面传送门

真的吐了,写了五六个小时。

首先我们不考虑两边都能走,只考虑向左走,那么的话如果两个从左到右的集合分别为\(S1,S2\),则\(S1\subset S2\),且除去\(S1\)已经匹配掉的部分,剩下的点在\(S2\)中必定单调。这两个就是充要条件。

仿照这个,设\(dp_{S,p1,p2,l1,l2}\)表示已经不用考虑的点在\(S\)里面,向左的考虑到\(p1\)的\(l1\)长度,向右的考虑到\(p2\)的\(l2\)长度。然后复杂度大概就是\(O(n^3a^22^n)\)。

但是实现起来细节一大堆。这里大概罗列几点。

向左走的要一开始就放进去,否则无法对接下来要放的向右走做出限制,向右走的则不能一开始就放进去。

到最后向左走的可以停止,这样会少掉对向右走的限制,可以再记录一下。

有些时候不一定能匹配就匹配更优,可以不匹配以减少限制。

还有自己犯的一个sb错误,循环顺序错乱。

反正就这些。

code:

#include<bits/stdc++.h>
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((m)*(x-1)+(y))
#define R(n) (rnd()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using ll=long long;using db=double;using lb=long db;using ui=unsigned;using ull=unsigned ll;
using namespace std;const int N=10+5,M=(1<<10)+5,K=2e3+5,mod=1e9+7,Mod=mod-1;const db eps=1e-5;const int INF=1e9+7;mt19937 rnd(time(0));
int n,m,k,x,y,z,A[N][N],T[N],g[N][N],dp[M][N][N][N][N],Ans=1e9,p[N][N],p1[N][N],p2[N][N],Ts[N];
void chkmin(int &x,int y){x>y&&(x=y);}
int main(){
	freopen("1.in","r",stdin);
	int i,j,h,x,y,k;scanf("%d",&n);for(i=1;i<=n;T[i]--,i++) while(scanf("%d",&A[i][++T[i]]),A[i][T[i]])Ts[i]|=(1<<A[i][T[i]]-1);
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){x=T[j];for(h=T[i];h;h--){while(x&&A[j][x]^A[i][h]) x--;if(!x) {g[i][j]=h;break;}}p[i][j]=((Ts[i]&Ts[j])==Ts[i]);}
	}Me(dp,0x3f);for(i=1;i<=n;i++) dp[1<<i-1][i][0][T[i]][0]=0;
	for(i=0;i<(1<<n);i++)for(j=n;~j;j--)for(h=0;h<=n;h++)for(x=T[j];~x;x--)for(y=0;y<=T[h];y++){if(dp[i][j][h][x][y]>1e9) continue;
		if(x) {
			z=A[j][x];int Fl=0;for(k=1;k<=y+1;k++) if(A[h][k]==z){Fl=1;break;}
			if(Fl||!h){
				
				if(A[h][y+1]==z)chkin(dp[i][j][h][x-1][y+1],dp[i][j][h][x][y]+1); 
				else chkmin(dp[i][j][h][x-1][y],dp[i][j][h][x][y]+1);
			} 
		}
		if(y^T[h]){
			z=A[h][y+1];int Fl=0;for(k=1;k<=x;k++) if(A[j][k]==z) {Fl=1;break;}
			if(Fl||!j){
				if(A[j][x]==z) chkmin(dp[i][j][h][x-1][y+1],dp[i][j][h][x][y]+1);
				else 
				chkmin(dp[i][j][h][x][y+1],dp[i][j][h][x][y]+1);
			} 
		}
		if(!x&&j){
			for(k=1;k<=n;k++){if(i>>(k-1)&1||!p[j][k]) continue;
				for(int P=T[k];P>=g[k][j];P--) chkmin(dp[i|(1<<k-1)][k][h][P][y],dp[i][j][h][x][y]);
			}
			chkmin(dp[i][0][h][0][y],dp[i][j][h][x][y]);
		}
		if(!h) for(k=1;k<=n;k++) !(i>>(k-1)&1)&&(chkmin(dp[i|(1<<k-1)][j][k][x][0],dp[i][j][h][x][y]),0);
		else for(k=1;k<=n;k++) !(i>>(k-1)&1)&&g[h][k]<=y&&p[k][h]&&(chkmin(dp[i|(1<<k-1)][j][k][x][0],dp[i][j][h][x][y]),0);
	}
	for(i=0;i<=n;i++) for(j=0;j<=n;j++) chkmin(Ans,dp[(1<<n)-1][i][j][0][T[j]]);
	printf("%d\n",Ans>=1e9?-1:Ans); 
}

标签:Integers,&&,int,luogu,向右走,CERC2016,using,dp,define
From: https://www.cnblogs.com/275307894a/p/16800300.html

相关文章

  • luogu P5339 [TJOI2019]唱、跳、rap和篮球 (容斥,指数型母函数,NTT)
    https://www.luogu.com.cn/problem/P5339要求不含1234的方案,反过来求含至少一个1234的方案。钦定存在i个位置有1234,位置的方案是Cn-3i,i.其他n-4i个位置的方案是多重集......
  • 【luogu CF645E】Intellectual Inquiry(DP)(结论)(矩阵乘法)
    IntellectualInquiry题目链接:luoguCF645E题目大意给你一个序列,值域在1~k,然后要你在后面再加上m个数,也要满足值域,然后使得本质不同的子序列个数最多,输出这个数量。......
  • 【luogu P5161】WD与数列(SA)(单调栈)
    WD与数列题目链接:luoguP5161题目大意给你一个序列,问你有多少对区间,长度相同,没有相交部分,而且一个区间里面所有数同时加上某个数可以变成另一个区间。思路首先发现它......
  • luogu P3232 [HNOI2013]游走 (期望, 高斯消元)
    https://www.luogu.com.cn/problem/P3232思路:算出每条边的期望访问次数,将期望访问次数多的赋予小的编号。一条边的期望访问次数=访问点u的期望/u的度+访问点v的期望......
  • luoguP1505旅游(处理边权的树剖)
    /*luogu1505非常简单的处理边权的树剖题。在树上将一条边定向,把这条边的权值赋给这条边的出点树剖的时候不计算lca权值即可*/#include<bits/stdc......
  • Luogu1398
    思路什么毒瘤细节题。考虑如何解决。考虑对这些条件做出进一步的抽象。于是我们做出细致的观察。方便起见,我们横、纵坐标自左往右、自上往下标号。字母之间的关系O......
  • [CERC2016]机棚障碍 Hangar Hurdles
    Description给定一个\(n\timesn\)的网格图,其中部分格点有障碍物使得箱子不能置于其上。规定箱子是一个奇数边长的正方形,其坐标为其中心格点的坐标。箱子只能上下左右移......
  • LuoguP2633 Count on a tree
    题意给定一棵\(n\)个节点的树,每个点有一个权值。有\(m\)个询问,每次给你\(u,v,k\),你需要回答\(u\text{xorlast}\)和\(v\)这两个节点间第\(k\)小的点权。其......
  • 【luogu CF1396D】Rainbow Rectangles(线段树)
    RainbowRectangles题目链接:luoguCF1396D题目大意给你一个L*L的矩形,里面有n个点,有各自的颜色。然后问你有多少个端点是整点的矩形可以圈出所有颜色至少有一个点。......
  • Luogu P3469 [POI2008]BLO-Blockade
    [P3469POI2008]BLO-Blockade-洛谷|计算机科学教育新生态(luogu.com.cn)图\(G\)本身联通。删除\(u\)的连边后会形成\(k\ge2\)个连通块(至少会把\(u\)隔离出......