SCUTCODE.124 笔芯子序列 【最大流最小割】

来源:互联网 发布:4g网络设计思路 编辑:程序博客网 时间:2024/04/29 01:30

题目描述

对于一个nn个数的正整数序列AA,定义它的bxbx子序列为 p_1,p_2,\cdots,p_kp1,p2,,pk,满足

1 \leq p_1 < p_2 <\ ...\ <p_k \leq n, A_{p_i} \equiv 0 (mod\ A_{p_{i-1}}),2 \leq i \leq k1p1<p2< ... <pkn,Api0(mod Api1),2ik

对于AA,假设它的最长 bxbx 子序列长度为kk,它的一个 bxbx子序列为
q_1,q_2,\cdots,q_tq1,q2,,qt,使得删掉 A_{q_1}, A_{q_2},...,A_{q_t}Aq1,Aq2,...,Aqt 之后,AA的最长 bxbx 子序列长度小于 kk

给定一个 nn 个数的正整数序列 AA,你需要求出它的最小 bxbx 子序列的长度。


输入格式

输入第一行一个整数 TT,表示数据组数。
对于每组数据,第一行一个整数 nn
第二行nn个整数,表示序列 AA
1 \leq T \leq 201T20
1 \leq n \leq 1001n100
1 \leq A_i \leq 10000000001Ai1000000000


输出格式

对每组数据,输出它的最小 bxbx 子序列的长度。


样例数据

输入

241 3 2 662 4 8 3 9 27

输出

12

若a[i]%a[j]==0,(j<i),连接一条从j到i的边,

再添加源汇点S,T,建立图G

跑一遍Floyd求最长路maxDis

对边(u,v),如果dis[s][u]+dis[v][t]+1==maxDis

那通过(u,v)边可能走出最长路,将(u,v)添加进图G'中

此时跑一遍最大流,即可得到G'的最小割:删除最少多少条边,使得最长路变短

但是原题要求的是删除多少个点

于是拆点跑最大流即可 

#include<iostream>#include<cstdlib>#include<cstdio>#include<string>#include<vector>#include<deque>#include<queue>#include<algorithm>#include<set>#include<map>#include<stack>#include<ctime>#include<string.h>#include<math.h>#include<list>using namespace std;#define ll long long#define pii pair<int,int>const int inf = 1e9 + 7;const int N = 2*100+5;const int M = N*N*2;int a[N];struct Edge{    int fr,to,c,next;}edge[M];int head[N];int level[N];inline void addEdge(int k,int u,int v,int c){    edge[k].fr=u;    edge[k].to=v;    edge[k].c=c;    edge[k].next=head[u];    head[u]=k;}bool bfs(int s,int t,int n){    deque<int>que;    fill(level,level+n+1,-1);    que.push_back(s);    level[s]=0;    while(!que.empty()){        int u=que.front();        if(u==t){            return true;        }        que.pop_front();        for(int i=head[u];i!=-1;i=edge[i].next){            if(edge[i].c>0&&level[edge[i].to]==-1){                level[edge[i].to]=level[u]+1;                que.push_back(edge[i].to);            }        }    }    return false;}int dfs(int u,int t,int maxf){    if(u==t){        return maxf;    }    int sum=0;    for(int i=head[u];i!=-1;i=edge[i].next){        Edge&e=edge[i];        if(e.c>0&&level[e.to]==level[u]+1){            int f=dfs(e.to,t,min(maxf-sum,e.c));            sum+=f;            edge[i].c-=f;            edge[i^1].c+=f;            if(sum==maxf){                break;            }        }    }    level[u]=-1;    return sum;}int dinic(int s,int t,int n){    int ans=0;    while(bfs(s,t,n)){        ans+=dfs(s,t,2*inf);    }    return ans;}int dis[N][N];void floyd(int n){    for(int k=0;k<n;++k){        for(int i=0;i<n;++i){            for(int j=0;j<n;++j){                if(dis[i][k]>0&&dis[k][j]>0){                    dis[i][j]=max(dis[i][k]+dis[k][j],dis[i][j]);                }            }        }    }}vector<pii>vec;int main(){    //freopen("/home/lu/Documents/r.txt","r",stdin);    //freopen("/home/lu/Documents/w.txt","w",stdout);    int T;    scanf("%d",&T);    while(T--){        vec.clear();        int n;        scanf("%d",&n);        int s=2*n,t=s+1;        memset(dis,0,sizeof(dis));        for(int i=0;i<n;++i){            scanf("%d",&a[i]);            dis[s][i]=1;            vec.push_back({s,i});            dis[i+n][t]=1;            vec.push_back({i+n,t});            dis[i][i+n]=1;            vec.push_back({i,i+n});        }        for(int i=0;i<n;++i){            for(int j=0;j<i;++j){                if(a[i]%a[j]==0){                    dis[j+n][i]=1;                    vec.push_back({j+n,i});                }            }        }        floyd(t+1);        int maxDis=dis[s][t];        fill(head,head+t+1,-1);        int nume=0;        for(int i=0;i<vec.size();++i){            int u=vec[i].first,v=vec[i].second;            if(dis[s][u]+dis[v][t]+1==maxDis){                addEdge(nume++,u,v,1);                addEdge(nume++,v,u,0);            }        }        printf("%d\n",dinic(s,t,t+1));    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 开通余额宝提示身份验证失败怎么办 蚂蚁花呗刷脸认证老失败怎么办 火狐浏览器登录系统后打不开怎么办 花呗自动扣费怎么办 彪马运动裤买大了怎么办 淘宝卖家认证无法通过怎么办 淘宝开店申请未认证该怎么办 传照片到淘宝看不到照片怎么办 淘宝店铺秒出复核怎么办 钱盾身份认证一直不通过怎么办 淘宝开店一直不让认证通过怎么办 淘宝店铺不卖东西怎么办 企业误进虚空的增值税发票怎么办 唯品会商品有的不支持退换货怎么办 苹果手机和平板电脑共享怎么办 ipad被锁定了停用了怎么办 word文档被锁定不能编辑怎么办 苹果平板id忘了怎么办 ipad有id锁怎么办换主板 ipad刷机后忘记id密码怎么办 网购买东西手机号错了怎么办? 淘宝卖家虚假交易违规怎么办 好朋友问我借身份证开网店怎么办 为什么淘宝点开就跳过打不开怎么办 刹车油进眼睛里怎么办 眼睛被uv灯刺伤怎么办 眼睛被uv灯伤了怎么办 洗手台靠不到墙怎么办 加盟天猫优品不想干了怎么办 口袋侦探点开始就闪退怎么办 淘宝号被监控了怎么办 excel表格中把字体变细怎么办 wps方框中打字打不上怎么办 蘑菇街里面买东西受骗了怎么办? 淘宝买家号账户体检中心违规怎么办 支付宝充错手机账号怎么办 美团恶意差评怎么办 买家好评后追加差评怎么办 宝贝吃了一个金币怎么办 店铺微淘等级l1怎么办 淘宝占内存2个g怎么办