码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj5299: [Cqoi2018]解锁屏幕

时间:2018-06-24 23:53:33      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:define   get   sort   int   struct   href   需要   efi   https   

题目链接

bzoj 5299: [Cqoi2018]解锁屏幕

题解

很水的装压dp,相信没人需要看题解....
不过 我读入优化没读负数 ,为什么mod1e8 +7,我 mod 1e9 + 7 啊,WA了两发

#include<cstdio> 
#include<vector> 
#include<algorithm> 
inline int read() { 
    int x = 0,f = 1; 
    char c = getchar(); 
    while(c < '0' || c > '9'){if(c == '-')f = -1; c = getchar();} 
    while(c <= '9' && c >= '0')x = x * 10 + c - '0',c = getchar(); 
    return x * f;  
} 
#define mod 100000007 
int n; 
const int maxn = 21; 
struct node { 
    int x,y;
    bool operator < (const node &a)const { 
        if(x == a.x) return y < a.y; 
        return x < a.x; 
    } 
} loc[maxn]; 
int dp[(1 << maxn) + 7][maxn]; 
int po[maxn][maxn];  
void get(node x,node y,int X,int Y) { 
    int a = y.y - x.y , b = x.x - y.x , c = y.x * x.y - x.x * y.y; 
        int tmp = 0; 
    for(int i = X + 1;i < Y;++ i) { 
        if(loc[i].x * a + loc[i].y * b + c == 0) 
            tmp |= (1 << i); 
            //if(i != Y)vec[X].push_back(i); if(i != X)vec[Y].pish_back(i); 
    } 
    po[X][Y] = tmp | (1 << X); // ^ (1 << Y); 
    po[Y][X] = tmp | (1 << Y); // ^ (1 << X); 
    //printf("%d\n",tmp);  
} 
int main() {  
    n = read(); 
    for(int i = 0;i < n;++ i)  
        loc[i].x = read(),loc[i].y = read(); 
    std::sort(loc,loc + n); 
        for(int i = 0;i < n;++ i)  
        for(int j = i + 1;j < n;++ j) 
                get(loc[i],loc[j],i,j); 
    int ans = 0; 
    for(int i = 0;i < n;++ i) dp[1 << i][i] = 1; 
    for(int i = 0;i < (1 << n);++ i) { 
        //ans = 0; 
        for(int j = 0;j < n;++ j) { 
            if(((1 << j) & i)) continue; 
            for(int k = 0;k < n;++ k) { 
                if(!((1 << k) & i)) continue;  
                if((po[k][j] & i) == po[k][j]){dp[i | (1 << j)][j] = (dp[i | (1 << j)][j] + dp[i][k]) % mod;} 
            } 
        }           
    } 
    for(int K,i = 0;i < (1 << n);++ i) { 
        K = 0; 
        for(int t = i;t;t >>= 1) if(t & 1)K ++; 
        if(K >= 4) { 
            for(int k = 0;k < n;++ k)
                ans = (ans + dp[i][k]) % mod; 
        }   
    } 
    printf("%d\n",ans); 
    return 0; 
} 

bzoj5299: [Cqoi2018]解锁屏幕

标签:define   get   sort   int   struct   href   需要   efi   https   

原文地址:https://www.cnblogs.com/sssy/p/9222039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!