洛谷P1983 車站分級
這題有三種做法
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);
}
244ms / 13.34MB / 0.69KB
原本要連條邊:
但是,如果在中間新增一個虛點,就可以變成條邊:
#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);
}
72ms / 7.75MB / 1.62KB
看起來還是第二種方法更優,但是實際很快
有這樣一棵線段樹,每個點都和父親連邊:
每加進一個區間,則把線段樹上對應區間和那個點連起來,比如加這個區間:
程式碼是參考這裡的,老師給我們講過,但我寫不出
#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。他們之間有從屬關系,也就是說他們的關系就像一棵以校長為根的