2959: 長跑
time limit: 10 sec memory limit: 256 mb
submit: 807 solved: 408
[submit][status][discuss]
description
某校開展了同學們喜聞樂見的陽光長跑活動。為了能「為祖國健康工作五十年」,同學們紛紛離開寢室,離開教室,離開實驗室,到操場參加3000公尺長跑運動。一時間操場上熙熙攘攘,摩肩接踵,盛況空前。
為了讓同學們更好地監督自己,學校推行了刷卡機制。
學校中有n個地點,用1到n的整數表示,每個地點設有若干個刷卡機。
有以下三類事件:
1、修建了一條連線a地點和b地點的跑道。
2、a點的刷卡機台數變為了b。
3、進行了一次長跑。問乙個同學從a出發,最後到達b最多可以刷卡多少次。具體的要求如下:
當同學到達乙個地點時,他可以在這裡的每一台刷卡機上都刷卡。但每台刷卡機只能刷卡一次,即使多次到達同一地點也不能多次刷卡。
為了安全起見,每條跑道都需要設定乙個方向,這條跑道只能按照這個方向單向通行。最多的刷卡次數即為在任意設定跑道方向,按照任意路徑從a地點到b地點能刷卡的最多次數。
input
輸入的第一行包含兩個正整數n,m,表示地點的個數和操作的個數。
第二行包含n個非負整數,其中第i個數為第個地點最開始刷卡機的台數。
接下來有m行,每行包含三個非負整數p,a,b,p為事件型別,a,b為事件的兩個引數。
最初所有地點之間都沒有跑道。
每行相鄰的兩個數之間均用乙個空格隔開。表示地點編號的數均在1到n之間,每個地點的刷卡機台數始終不超過10000,p=1,2,3。
output
輸出的行數等於第3類事件的個數,每行表示乙個第3類事件。如果該情況下存在一種設定跑道方向的方案和路徑的方案,可以到達,則輸出最多可以刷卡的次數。如果a不能到達b,則輸出-1。
sample input
9 31
10 20 30 40 50 60 70 80 90
3 1 2
1 1 3
1 1 2
1 8 9
1 2 4
1 2 5
1 4 6
1 4 7
3 1 8
3 8 8
1 8 9
3 8 8
3 7 5
3 7 3
1 4 1
3 7 5
3 7 3
1 5 7
3 6 5
3 3 6
1 2 4
1 5 5
3 3 6
2 8 180
3 8 8
2 9 190
3 9 9
2 5 150
3 3 6
2 1 210
3 3 6
sample output
-1-1
hint
資料規模及約定
對於100%的資料,m<=5n,任意時刻,每個地點的刷卡機台數不超過10000。n<=1.5×105
source
中國國家隊清華集訓 2012-2013 第二天
[submit][status][discuss]
和4229有點像,突出表現了lct find_root函式有多慢。必須使用並查集維護連通性才能過。縮下點,多了個求鏈的權值和的操作。
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
inline
int read()
const
int n=200000;
int rev[n],lc[n],rc[n],fa[n],father[n];
int sum[n],val[n],v[n];
inline
int find(int x)
inline
void unit(int x,int y)
}inline
void updata(int x)
inline
void tag_rev(int x)
inline
void tag_down(int x)
}inline
void rotate(int x)
if(lc[y]==x) lc[y]=b,rc[x]=y;
else rc[y]=b,lc[x]=y;
updata(y);
}int sta[n];
inline
bool is_root(int x)
inline
void splay(int x)
while(sta[0]) tag_down(sta[sta[0]--]);
while(!is_root(x))
rotate(x);
}updata(x);
}inline
void access(int q)
}inline
void make_root(int x)
inline
void sc(int x,int y)
inline
void link(int x,int y)
int fake[n];
inline
int find_root(int x)
inline
void add(int x,int y)
fake[find_root(y)]=find_root(x);
link(x,y);
}int n,m,q;
char sr[5];
struct cc
a[n],b[n];
int ans[n];
int main()
if(tp==3)
make_root(x);
access(y);
splay(x);
printf("%d\n",sum[x]);}}
for(int i=1;i<=q;++i)
if(a[i].z) puts(ans[i]?"yes":"no");
}
BZOJ 2959 長跑 解題報告
某校開展了同學們喜聞樂見的陽光長跑活動。為了能 為祖國健康工作五十年 同學們紛紛離開寢室,離開教室,離開實驗室,到操場參加3000公尺長跑運動。一時間操場上熙熙攘攘,摩肩接踵,盛況空前。為了讓同學們更好地監督自己,學校推行了刷卡機制。學校中有n個地點,用1到n的整數表示,每個地點設有若干個刷卡機。有...
刷題 BZOJ 2959 長跑
某校開展了同學們喜聞樂見的陽光長跑活動。為了能 為祖國健康工作五十年 同學們紛紛離開寢室,離開教室,離開實驗室,到操場參加3000公尺長跑運動。一時間操場上熙熙攘攘,摩肩接踵,盛況空前。為了讓同學們更好地監督自己,學校推行了刷卡機制。學校中有n個地點,用1到n的整數表示,每個地點設有若干個刷卡機。有...
bzoj 2959 長跑(LCT 並查集)
time limit 10 sec memory limit 256 mb submit 315 solved 178 submit status discuss 某校開展了同學們喜聞樂見的陽光長跑活動。為了能 為祖國健康工作五十年 同學們紛紛離開寢室,離開教室,離開實驗室,到操場參加3000公尺長...