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#includeusing
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#includeusing
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裡,所以...