會議中心 APIO2009

2022-08-05 14:00:19 字數 1898 閱讀 7286

會議中心

思路

這一題的正解是倍增的,但是由於我太蒟蒻了,所以我選了一個不算正解但是有可以拿滿分的題目學習

思路和我考場上其實差不多,只是我無法實現....

下面我先來介紹幾個陣列的用途

1.s,s陣列代表的是列舉的i時,包括i區間在內最多有多少個區間

2.p陣列,p[i]記錄的是在這一區間和這一區間之前,字典序最小的並且滿足使區間數最多的區間的位置

3.而pr陣列代表的是由哪一個區間+1轉移過來的...(大概是這個意思,表達能力不是很好)

然後我們就要討論情況了

第一種情況是我們對這個區間有更新,就是說是由這個區間加上它前面的區間可以構成一個更大的區間總和

第二種情況就是守老本,看上一層得到的解是否依然更加優秀

所以我們就要有不同的處理方式

m是在該區間之前,滿足其r最接近當前區間的l的,然後我們就看

如果:s[m]+1>s[i-1] ,我們就要更新,即p[i]=i,s[i]=s[m]+1;

s[m]+1

但是還有一種情況,就是2者相等,這是我們就要有選擇了,因為我們既然選擇了這個,後面的方案就是確定了的,但是前面的方案我們就要選擇更優的,即字典序更小的

那就是判斷了,具體見**

tips:是由那個點轉移過來的我們要記錄好,到時候判斷更優的時候需要

二分就不要問我了,我也有點小蒙

1 #include2

#define ll long long

3#define for(i,a,b) for(register int i=a;i<=b;i++)

4#define rof(i,a,b) for(register int i=a;i>=b;i--)

5using

namespace

std;

6const

int n=200000+10;7

intn;

8int

p[n],pr[n],s[n];

9int

q[n];

10struct

s111

a[n];

14bool

cmp(s1 x,s1 y)

1518

intscan()

1923

while(c>='

0'&&c<='9')

24return

as*f;25}

26int

main()

2733 sort(a+1,a+n+1

,cmp);

34 for(i,1

,n)35

43//

現在我們找到了最近的一個區間

44int f=s[m]+1

;45 pr[i]=p[m];

46if(f>s[i-1]) s[i]=f,p[i]=i;

47else

if(s[i-1]>f) s[i]=s[i-1],p[i]=p[i-1

];48

else

4957

if(a[p1].id//

處理"祖先"相同但當前結點不同

58if(a[p2].ida[p2].id;

59if(min11],p[i]=p[i-1

];60

else s[i]=f,p[i]=i,pr[i]=p[m];61}

62}63int now=p[n],top=0

;64 cout

65while

(now)

6669 sort(q+1,q+top+1

);70 for(i,1,top) cout

71return0;

72 }

view code

APIO2009 ATM

input 第一行包含兩個整數n m。n表示路口的個數,m表示道路條數。接下來m行,每行兩個整數,這兩個整數都在1到n之間,第i 1行的兩個整數表示第i條道路的起點和終點的路口編號。接下來n行,每行一個整數,按順序表示每個路口處的atm機中的錢數。接下來一行包含兩個整數s p,s表示市中心的編號,也...

1179 Apio2009 Atm

time limit 15 sec memory limit 162 mb submit 4832 solved 2147 submit status discuss siruseri 城中的道路都是單向的。不同的道路由路口連線。按照法律的規定, 在每個路口都設立了一個 siruser i 銀行的 ...

BZOJ 1179 Apio2009 Atm

傳送門 今天這是咋了。。寫了一堆假演算法給了一堆假分。我竟然剛開始傻不拉幾的寫了個dijkstra跑最長路,結果87分???後面被告知只有spfa能跑最長路,並且需要將點權化為邊權。。做法是因為所有atm都是非負數,所以不搶白不搶,我們考慮縮點。縮完點之後spfa最長路即可。多虧ghostcai神,要...