BZOJ 5299 解锁屏幕CQOI2018

Problem

BZOJ

Solution

解法比较好想,记录当前点和状态,记忆化一下, O ( n 2 2 n ) ,因此你需要卡常。
其实我的本意并不是水题解,而是因为被卡常很痛苦。
所以去你的出题人

所以这篇题解是告诉你如何卡过去的!!!

我也不知道为什么,预处理的时候改成连边会快一些,而且是玄学快……
快一点???
连边前:TLE
连边后:7396ms

真·快一些
exm?

洛谷由于是算的单点时间,死活卡不过,得开O2才能过。

Code

#include <cstdio>
#define midx(a,b,c) (x[a]<=x[c]&&x[c]<=x[b])
#define midy(a,b,c) (y[a]<=y[c]&&y[c]<=y[b])
using namespace std;
const int maxn=600010,mod=100000007;
struct data{int v,w,nxt;}edge[20000];
int n,p,lim,x[20],y[20],f[20][maxn],head[20];
template <typename Tp> inline void read(Tp &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') f=1,ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    if(f) x=-x;
}
inline void insert(int u,int v,int w){edge[++p]=(data){v,w,head[u]};head[u]=p;}
inline int check(int a,int b,int c)
{
    int ff=0;
    if(midx(a,b,c)&&midy(a,b,c)) ff=1;
    else if(midx(a,b,c)&&midy(b,a,c)) ff=1;
    else if(midx(b,a,c)&&midy(a,b,c)) ff=1;
    else if(midx(b,a,c)&&midy(b,a,c)) ff=1;
    if(!ff) return 0;
    int xab=x[b]-x[a],yab=y[b]-y[a];
    int xac=x[c]-x[a],yac=y[c]-y[a];
    return xab*yac-xac*yab==0;
}
inline int dfs(int x,int s,int cnt)
{
    if(f[x][s]) return f[x][s];
    if(s==lim)
      return f[x][s]=1;
    if(cnt>=4) f[x][s]=1;
    for(int i=head[x];i;i=edge[i].nxt)
      if((s&(1<<(edge[i].v-1)))==0&&(edge[i].w&s)==edge[i].w)
      {
        f[x][s]+=dfs(edge[i].v,s|(1<<(edge[i].v-1)),cnt+1);
        if(f[x][s]>=mod)
          f[x][s]-=mod;
      }
    return f[x][s];
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    read(n);
    lim=(1<<n)-1;
    for(int i=1;i<=n;i++)
    {
        read(x[i]);read(y[i]);
        insert(0,i,0);
    }
    for(int i=1,w;i<=n;i++)
      for(int j=i+1;j<=n;j++)
      {
        w=0;
        for(int k=1;k<=n;k++)
          if(k^i&&k^j&&check(i,j,k))
            w|=(1<<(k-1));
        insert(i,j,w);insert(j,i,w);
      }
    printf("%d\n",dfs(0,0,0));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/as_a_kid/article/details/80139755
今日推荐