1. 程式人生 > >洛谷P1983 車站分級

洛谷P1983 車站分級

這題有三種做法

1.O(nm2)

488ms / 9.61MB / 0.68KB
不用講,直接貼程式碼

#include<bits/stdc++.h>
using namespace std;
const int N=1002;
int n,m,i,j,a[N],d[N],ans,f[N],k,vi[N][N],c[N][N],l;
int dfs(int x){
    if (f[x]) return f[x];
    for (int i=1;i<=c[x][0];i++) f[x]=max(f[x],dfs(c[x][i]));
    return
++f[x]; } int main(){ scanf("%d%d",&n,&m); for (i=1;i<=m;i++){ scanf("%d",&a[0]); for (j=1;j<=a[0];j++) scanf("%d",&a[j]); l=1; for (j=a[1];j<a[a[0]];j++) if (a[l]==j) l++; else for (k=1;k<=a[0];k++) if
(!vi[a[k]][j]) c[a[k]][++c[a[k]][0]]=j,vi[a[k]][j]=1; } for (i=1;i<=n;i++) ans=max(ans,dfs(i)); printf("%d",ans); }

2.O(nm)

244ms / 13.34MB / 0.69KB
原本要連n2條邊:

但是,如果在中間新增一個虛點,就可以變成2n條邊:

#include<bits/stdc++.h>
using namespace std; 
int n,m,ans,a[2003],s,i,j,u,to[2003
][2003],uans[2003],sto[2003]; void dfs(int u){ if (uans[u]) return; for(int i=1;i<=to[u][0];i++){ if(!uans[to[u][i]]) dfs(to[u][i]); uans[u]=max(uans[u],uans[to[u][i]]+1); } if(u>n) uans[u]--; ans=max(ans,uans[u]); } int main(){ scanf("%d%d",&n,&m); for (i=1;i<=m;i++){ scanf("%d",&s); for (j=1;j<=s;j++) scanf("%d",&a[j]),sto[a[j]]=i,to[n+i][++to[n+i][0]]=a[j]; for (u=a[1]+1;u<a[s];u++) if (sto[u]!=i) to[u][++to[u][0]]=n+i; } for (i=1;i<=n;i++) if (!uans[i]) dfs(i); printf("%d",++ans); }

3.O(nmlogn)

72ms / 7.75MB / 1.62KB
看起來還是第二種方法更優,但是實際很快
有這樣一棵線段樹,每個點都和父親連邊:

每加進一個區間,則把線段樹上對應區間和那個點連起來,比如加[1,3]這個區間:

程式碼是參考這裡的,老師給我們講過,但我寫不出

#include<bits/stdc++.h>
using namespace std;
const int N=1500;
int h[N<<3],n,m,i,st[N],in[N<<3],num[N],dis[N<<3],dep[N<<3],tot,tp,q[N<<5],he,ta,cnt,j,ans;
struct node{
    int to,ne;
}e[N*700];
inline char gc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
#define gc getchar
inline int read(){
    int x=0,fl=1;char ch=gc();
    for (;ch<48||ch>57;ch=gc())if(ch=='-')fl=-1;
    for (;48<=ch&&ch<=57;ch=gc())x=(x<<3)+(x<<1)+(ch^48);
    return x*fl;
}
void add(int x,int y){
    in[y]++;
    e[++tot]=(node){y,h[x]};
    h[x]=tot;
}
void build(int t,int l,int r){
    tp=max(tp,t);
    if (l==r){
        num[l]=t;
        dis[t]=1;
        return;
    }
    int mid=l+r>>1;
    add(t<<1,t);
    build(t<<1,l,mid);
    add(t<<1|1,t);
    build(t<<1|1,mid+1,r);
}
void update(int t,int l,int r,int x,int y,int tmp){
    if (x<=l && r<=y){
        add(t,tmp);
        return;
    }
    int mid=l+r>>1;
    if (x<=mid) update(t<<1,l,mid,x,y,tmp);
    if (mid<y) update(t<<1|1,mid+1,r,x,y,tmp);
}
void bfs(){
    for (int i=1;i<=tp;i++)
        if (!in[i]) q[ta++]=i,dep[i]=dis[i];
    while (he<ta){
        int u=q[he++];
        for (int i=h[u],v;i;i=e[i].ne){
            v=e[i].to;
            dep[v]=max(dep[v],dep[u]+dis[v]);
            if (!(--in[v])) q[ta++]=v;
        }
    }
}
int main(){
    n=read();m=read();
    build(1,1,n);
    for (i=1;i<=m;i++){
        cnt=read();tp++;
        for (j=1;j<=cnt;j++) st[j]=read();
        for (j=1;j<cnt;j++){
            add(tp,num[st[j]]);
            if (st[j]+1<=st[j+1]-1) update(1,1,n,st[j]+1,st[j+1]-1,tp);
        }
        add(tp,num[st[cnt]]);
    }
    bfs();
    for (i=1;i<=n;i++) ans=max(ans,dep[num[i]]);
    printf("%d",ans);
}

相關推薦

P1983 車站分級 拓撲排序

Code: #include<cstdio> #include<queue> #include<algorithm> #include<cstring> using namespace std; const int N=1000+1; co

P1983 車站分級

題目:車站分級 思路: 根據每條線路,把經過的不停的站向停的站連邊。 然後跑一遍拓撲排序就好了。 程式碼: #include<bits/stdc++.h> using namespace std; #define maxn 1000 #define read(x

P1983車站分級題解

題目 這個題非常毒瘤,只要還是體現在其思維難度上,因為要停留的車站的等級一定要大於不停留的車站的等級,因此我們可以從不停留的車站向停留的車站進行連邊,然後從入度為0的點即不停留的點全都入隊,然後拓撲排序即可 程式碼 #include <bits/stdc++.h> #pragma GCC o

P1983 車站分級

這題有三種做法 1.O(nm2)1.O(nm2) 488ms / 9.61MB / 0.68KB 不用講,直接貼程式碼 #include<bits/stdc++.h> using namespace std; const int

P1983 車站分級(搜尋_圖論)

傳送門 每次從所有停靠的車站往不停靠的車站把沒建過的邊建一次。 由於保證資料符合要求,圖是沒有環的,所以直接深搜跑最長路找最多的級別數。 Code: #include<cstdio&g

P1983 車站分級 解題報告

這題卡了2天 看到該題的第一想法是貪心 然後就碼了一個 結果不知道哪裡寫掛了才拿40分 後面就寫了個拓撲 結果一開始思路不對 每次while的時候ans++ 後面才發現bug 然後修正了一下就A了 #include <iostream>#include &

車站分級 p1983

題目描述 一條單向的鐵路線上,依次有編號為 1, 2, …, n 的 n 個火車站。每個火車站都有一個級別,最低為 1 級。現有若干趟車次在這條線路上行駛,每一趟都滿足如下要求:如果這趟車次停靠了火車站 x,則始發站、終點站之間所有級別大於等於火車站 x 的都必須停靠。(注意:起始站和終點站自然也算作事先已

P1011 車站

++ -1 span 的人 scanf print blog %d 格式 題目描述 火車從始發站(稱為第1站)開出,在始發站上車的人數為a,然後到達第2站,在第2站有人上、下車,但上、下車的人數相同,因此在第2站開出時(即在到達第3站之前)車上的人數保持為a人。從第3站起

luogu P1983 車站分級

truct rank pri size 火車 起點 ron head 路線 題目描述 一條單向的鐵路線上,依次有編號為 1, 2, …, n 的 n 個火車站。每個火車站都有一個級別,最低為 1 級。現有若幹趟車次在這條線路上行駛,每一趟都滿足如下要求:如果

P1983 車站分級

分享 技術 技術分享 true 單向 ios copy 輸出格式 new 題目描述 一條單向的鐵路線上,依次有編號為 1, 2, …, n 的 n 個火車站。每個火車站都有一個級別,最低為 1 級。現有若幹趟車次在這條線路上行駛,每一趟都滿足如下要求:如果這趟車次停靠了火車

C++ P1983 車站分級

題目描述 一條單向的鐵路線上,依次有編號為 1, 2, …, n 的 n 個火車站。每個火車站都有一個級別,最低為 1 級。現有若干趟車次在這條線路上行駛,每一趟都滿足如下要求:如果這趟車次停靠了火車站 x,則始發站、終點站之間所有級別大於等於火車站 x 的都必須停靠。(注意:起始站和終點站

Luogu P1983 車站分級

題目描述 一條單向的鐵路線上,依次有編號為 1, 2, …, n1,2,…,n的 nn個火車站。每個火車站都有一個級別,最低為 11 級。現有若干趟車次在這條線路上行駛,每一趟都滿足如下要求:如果這趟車次停靠了火車站 xx,則始發站、終點站之間所有級別大於等於火車站xx

P1983 拓撲排序 解題報告

題目描述 一條單向的鐵路線上,依次有編號為 1, 2, …, n 的 n 個火車站。每個火車站都有一個級別,最低為 1 級。現有若干趟車次在這條線路上行駛,每一趟都滿足如下要求:如果這趟車次停靠了火車站 x,則始發站、終點站之間所有級別大於等於火車站 x 的都

1983】車站分級(暴力水過,正解:虛擬點優化)

點此看題面 大致題意: 一條單向鐵路上有n個火車站,每個火車站有一個等級,火車若在x點停靠,則起點站與終點站之間每個等級大於等於x的等級的車站都必須停靠,現已知m趟車次的執行情況,請你求出這n個火車站至

noip普及組2013 車站分級(luogu P1983

eof 矩陣 oid har 一個 org pac 題目 style 原題鏈接:https://www.luogu.org/problem/show?pid=1983 題目大意:每個車站有一個權值,每一車次始發站與終點站之間如果有不停靠的點,那麽它的權值一定比停靠的點的權值

】P1011 車站 (暴力)

題目連結 題目描述 火車從始發站(稱為第 1 站)開出,在始發站上車的人數為 a ,然後到達第 2 站,在第 2 站有人上、下車,但上、下車的人數相同,因此在第 2 站開出時(即在到達第 3 站之前)車上的人數保持為 a 人。從第 3 站起(包括第 3 站)上、下車的人數

動態規劃背包問題 P1064 金明的預算方案

輸出 ret 設計 div 輸入輸出 style 乘號 輸入輸出格式 sin P1064 金明的預算方案 題目描述 金明今天很開心,家裏購置的新房就要領鑰匙了,新房裏有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎麽布置,你

P1352 沒有上司的舞會

整數 urn read getc -s blog 計算 情況 def 題目描述 某大學有N個職員,編號為1~N。他們之間有從屬關系,也就是說他們的關系就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來一個職員都會增

——P1351 聯合權值

problem org cto 輸入 最大的 -m http color 說明 https://www.luogu.org/problem/show?pid=1351 題目描述 無向連通圖G 有n 個點,n - 1 條邊。點從1 到n 依次編號,編號為 i 的點的權值為

——P1352 沒有上司的舞會

tps 否則 pre www using 題目 表示 i++ color https://www.luogu.org/problem/show?pid=1352#sub 題目描述 某大學有N個職員,編號為1~N。他們之間有從屬關系,也就是說他們的關系就像一棵以校長為根的