zoukankan      html  css  js  c++  java
  • 【HDU】3335 Divisibility

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define MAXM 1010
     4 #define MAXN 1000000
     5 #define INF 0x7FFFFFFF
     6 typedef long long LL;
     7 using namespace std;
     8 LL a[MAXM];
     9 int size, ans;
    10 int L[MAXN], R[MAXN], U[MAXN], D[MAXN];
    11 int H[MAXN], C[MAXN], S[MAXN];
    12 void Init(int n) {
    13     int i;
    14     for (i = 0; i <= n; i++) {
    15         R[i] = i + 1;
    16         L[i + 1] = i;
    17         U[i] = D[i] = i;
    18         S[i] = 0;
    19         H[i] = -1;
    20     }
    21     R[n] = 0;
    22     size = n + 1;
    23 }
    24 void Link(int r, int c) {
    25     D[size] = D[c];
    26     U[size] = c;
    27     U[D[c]] = size;
    28     D[c] = size;
    29     if (H[r] < 0)
    30         H[r] = L[size] = R[size] = size;
    31     else {
    32         L[size] = H[r];
    33         R[size] = R[H[r]];
    34         L[R[H[r]]] = size;
    35         R[H[r]] = size;
    36     }
    37     S[c]++;
    38     C[size++] = c;
    39 }
    40 int A() {
    41     int i, res;
    42     for (res = 0, i = R[0]; i; i = R[i])
    43         res++;
    44     return res;
    45 }
    46 void Remove(int c) {
    47     int i;
    48     for (i = D[c]; i != c; i = D[i]) {
    49         L[R[i]] = L[i];
    50         R[L[i]] = R[i];
    51     }
    52 }
    53 void Resume(int c) {
    54     int i;
    55     for (i = D[c]; i != c; i = D[i])
    56         L[R[i]] = R[L[i]] = i;
    57 }
    58 void Dance(int now) {
    59     if (R[0] == 0)
    60         ans = max(ans, now);
    61     else if (now + A() > ans) {
    62         int i, j, temp, c;
    63         for (temp = INF,i = R[0]; i; i = R[i]) {
    64             if (temp > S[i]) {
    65                 temp = S[i];
    66                 c = i;
    67             }
    68         }
    69         for (i = D[c]; i != c; i = D[i]) {
    70             Remove(i);
    71             for (j = R[i]; j != i; j = R[j])
    72                 Remove(j);
    73             Dance(now + 1);
    74             for (j = L[i]; j != i; j = L[j])
    75                 Resume(j);
    76             Resume(j);
    77         }
    78     }
    79 }
    80 int main() {
    81     int c, i, j, n;
    82     scanf("%d", &c);
    83     while (c--) {
    84         scanf("%d", &n);
    85         Init(n);
    86         for (i = 1; i <= n; i++)
    87             scanf("%I64d", &a[i]);
    88         for (i = 1; i <= n; i++) {
    89             for (j = 1; j <= n; j++) {
    90                 if (a[i] % a[j] == 0 || a[j] % a[i] == 0)
    91                     Link(i, j);
    92             }
    93         }
    94         ans = 0;
    95         Dance(0);
    96         printf("%d\n", ans);
    97     }
    98     return 0;
    99 }
  • 相关阅读:
    Redis学习笔记
    RedisTemplate操作命令
    RedisTemplate操作命令
    RedisTemplate操作命令
    RedisTemplate操作命令
    将chrome储存的密码转为MarkDown表格
    使用redisson做redis分布式锁
    RocketMQ 整合SpringBoot发送事务消息
    关于java读写锁的测试
    java8 stream记录
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2612399.html
Copyright © 2011-2022 走看看