2017 4 9四校聯考

2022-07-24 09:24:05 字數 2498 閱讀 9387

t2結論推得有點問題結果只有30,t3暴力騙了40,170/300

t1.交易

題目大意:乙個人從0走到m,走1要1s,路上有n個點xi,每個點必須被經過2次,第二次要在第一次的ts之後經過才算數,求最少時間。(n<=3,000,000,0思路:f[i]表示完成前i個點後到達第i個點的最小時間,每次回頭顯然必須完成所有之前未完成的點,故有f[i]=min(f[j]+x[i]-x[j]+max(2*(x[i]-x[j+1]),t)),把max分開討論,當2*(x[i]-x[j+1])<=t時,我們記最小的f[j]-x[j]-2*x[j+1]即可,2*(x[i]-x[j+1])>t時,顯然只要考慮最左邊的點(本人比較菜,寫了單調佇列),然後就o(n)了。

#include#include

using

namespace

std;

#define ll long long

char b[1

<<15],*s,*t,c;int

x;#define getc() (s==t&&(t=((s=b)+fread(b,1,1<<15,stdin)),s==t)?0:*s++)inline

intread()

#define mn 3000000

#define inf (1ll<<60)

int x[mn+5],q[mn+5

],ql,qr;

ll f[mn+5],mn=inf;

intmain()

f[i]=min(3ll*x[i]+mn,x[i]+t+(ql<=qr?f[q[ql]]-x[q[ql]]:inf));

while(ql<=qr&&f[i]-x[i]<=f[q[qr]]-x[q[qr]])--qr;

q[++qr]=i;

}printf(

"%i64d

",f[n]+m-x[n]);

fclose(stdin);fclose(stdout);

return0;

}

t2.字串

題目大意:給定兩個長度為n的字串s和t,一次變換定義為從左到右,每次令s[i]變成s[i]或s[i-1],問s變成t至少需要幾次變換。(n<=3,000,000)

思路:顯然從後往前,每次找到s[k[i]]=t[i]且k[i]<=i,k[i]<=k[j](j>i),令t[i]由s[k[i]]變換到最優,考慮計算這麼做的最小耗時,用x[i]表示第i格在前x[i]次操作都被占用了,動態計算x[i],最大值就是答案,每次k[i]減小時,我們要用s[k[i]]從k[i]染到i,那麼有x[j]=max(x[j],x[j+1])+1(k[i]<=j

#include#include

using

namespace

std;

#define mn 3000000

char a[mn+5],b[mn+5

];int f[mn+5

];int

solve()

s-=f[p+i];f[p+i]=0

; }

printf("%d

",ans);

}int

main()

t3.矩陣

題目大意:乙個n*n的矩陣,給出m個黑格,其他全是白的,每次若(x,y)和(y,z)都是黑的,可以把(z,x)染成黑的,問最多染出多少個黑格。(n,m<=1,000,000)

思路:結論題。把這個矩陣當成鄰接矩陣,題目轉化n個點m條邊的有向圖,為若x到y有邊且y到z有邊,z到x也有邊,問有多少條邊。每個弱聯通塊獨立,分開考慮,對這個聯通塊染色,染成0,1,2,滿足若u到v有邊,則$c[u]+1\equiv c[v]\ (mod\ 3)$,如果染色成功且三個顏色都有,那麼所有0到所有1有邊,所有1到所有2有邊,所有2到所有0有邊,因為若只有三個點,其中0到1,1到2,那麼這三個點顯然滿足,每次加入乙個點連到已有的圖中,仍然滿足,故由歸納法可證;若只有兩個或乙個顏色,顯然不可能出現新的邊。如果染色失敗,與上面同一種思路可用歸納法證明,所有點到所有點都有連邊,包括自環。然後隨便寫寫就o(n)了。

#includechar b[1

<<15],*s,*t,c;int

x;#define getc() (s==t&&(t=((s=b)+fread(b,1,1<<15,stdin)),s==t)?0:*s++)inline

intread()

#define mn 1000000

struct edgee[mn*2+5

];int h[mn+5],en,c[mn+5],o,s,f[4

];inline

void ins(int x,int

y);h[x]=en;

e[++en]=(edge);h[y]=en;

}void dfs(intx)}

intmain()

printf(

"%i64d

",ans);

fclose(stdin);fclose(stdout);

return0;

}

四校聯考 20171001

二分 期望得分 70 實際得分 10 列舉最高的高度可能為多少 二分。o logm 列舉最高高度應該位於哪一列上.o n 左右擴散列舉出需要用的積木總數,與m相比較。容易發現合法的高度的最高值,最終需要搭建乙個金字塔。1,3,5,7 正解是預處理出每一列作為最高列的左右邊界。然後再二分最大高度。ch...

四校聯考(20170910)

ditoly出的題目果然喪,待我一天啃一題。廢話不多說,開更 我是分割線 t1 最大值 max 問題描述 小c有n個區間,其中第i個區間為 li,ri 小c想從每個區間中各選出乙個整數,使得所有選出的數and起來得到的結果最大,請你求出這個值。輸入格式 第一行乙個正整數n,表示區間個數。接下來n行,...

四校聯考 傳遞

題解 如果乙個圖是競賽圖那麼如果存在邊,那麼a一定能走到b,反之亦然 還有,如果在圖p中存在邊,那麼圖q中一定不存在邊或 基圖是完全圖 那麼,如果圖p中存在邊,圖q一定不能從a走到b或者從b走到a 既然如此,因為圖p 圖q是完全圖 所以,對於點u和點v,u和v之間的邊要不然在p裡,要不然在q裡,所以...