某古 11 月月賽 I 遊記

2022-03-30 08:04:49 字數 3945 閱讀 4070

難度好評,沒有像我上次打的那場比賽那麼水了,不過自己的分數還是好低,只會前三題。。。

希望你古月賽的題目一直都能像這場這麼有意思。

三角形面積公式 \(s=\fracah\) ,由於 \(a\) 相等,所以題目給出的其實就是 \(h\) 之比。

題目中給出了 \(a,b,c,d\) ,不妨令 \(a\le b\le c\le d\) ,由於題目給出的是正方形,所以必須要滿足 \(a+d=b+c\) ,否則不是正方形,答案就是 \(0\) ,如果滿足 \(a+d=b+c\) ,不妨令正方形的左下角為 \((0,0)\) ,正方形邊長為 \(a+d\) ,那麼這個點的選擇方法就只有 \((a,b),(a,c),(b,a),(c,a),(d,b),(d,c),(b,d),(c,d)\) 八種,排序後去重就行了。

#include#include#include#include#includeusing namespace std;

#define ch() getchar()

#define pc(x) putchar(x)

templateinline void read(t&x)

templateinline void write(t x)

long long a[4];

pairs[8];

int main()

}sort(s,s+cn);cn=unique(s,s+cn)-s;write(cn),pc('\n');

} }

return 0;

}

一開始看到這題真的沒有頭緒,但是仔細思考後發現題面就是唬人的,感覺這樣的題目還是挺有意思的。

假如當前好感值最高的點是 \(x\) ,那麼會先選擇一直去 \(x\) 直到 \(x\) 旁邊出現了乙個點的好感值和 \(x\) 相等並且編號盡可能小,不妨設這個點為 \(y\) ,那麼就會一直先去 \(x,y\) 中編號小的,然後去 \(x,y\) 中編號大的一直迴圈,所以此時只需要判斷 \(m\) 的奇偶性就行了。

需要注意的一點就是如果 \(x\) 不存在相鄰的點答案就是 \(x\) 。

#include#include#include#include#includeusing namespace std;

#define ch() getchar()

#define pc(x) putchar(x)

templateinline void read(t&x)

templateinline void write(t x)

const int maxn=2000006;

int a[maxn];

int main()

int bo=0;

for(int i=1;ia[bo]||(a[v]==a[bo]&&vbo)po^=bo^=po^=bo;

if(m&1)write(bo);else write(po);

}} pc('\n');

} return 0;

}

當 \(k=0\) 的時候,可以通過乙個棧來求答案,不斷刪去匹配括號最後留下的串肯定是)))...))((...(((,答案就是這個串的長度,下面只考慮 \(k>0\) 的情況。

考慮 \(s(l,r)\) 的 0 級偏值給答案造成貢獻時需要乘以的係數,要從串 \(s(1,n)\) 得到 \(s(l,r)\) 左端點需要向右邊移動 \(l-1\) 次,右端點需要向左邊移動 \(n-r\) 次,這些移動都是在 \(k\) 步裡面完成的,由隔板法就可以得出要乘上的係數就是 \(\times \) ,不妨設 \(s(l,r)\) 的 0 級偏值等於 \(t(l,r)\) ,那麼答案就是 \(\sum_^n\sum_^n(t(l,r)\times \times )\) 。

如何統計所有的 \(s(l,r)\) ?考慮從右邊往左邊掃,由 \(\sum_^n(t(l+1,r)\times )\) 遞推得出 \(\sum_^n(t(l,r)\times )\) 。

首先需要知道,如果固定左端點,隨著右端點的增加,不斷刪去匹配括號得到的串)))...))((...(((中的左半部分(即)))...)))的長度一定會不斷增加,那麼我們刪去匹配括號最終保留的串肯定是這樣的:

)))(...((

)))(...((

)))(...((

))(...((

))(...((

))(...((

)(...((

(...((

(...((..

.(

假如左邊新增了乙個)

))))(...((

))))(...((

))))(...((

)))(...((

)))(...((

)))(...((

))(...((

)(...((

)(...((..

.)()

只是每個串的長度增加了 \(1\) ,所以此時滿足:

\[\sum_^n(t(l,r)\times )=\sum_^n+\sum_^n(t(l+1,r)\times )

\]假如左邊新增了乙個(

()))(...((

()))(...((

()))(...((

())(...((

())(...((

())(...((

()(...((

((...((

((...((..

.(((

此時可能出現匹配括號,需要把匹配括號刪去:

)(...((

)(...((

)(...((

(...((

(...((

(...((

(...((

((...((

((...((..

.(((

不難發現,所有原本存在)的子串的長度都減小了 \(2\) ,不妨設最小的滿足 \(s(l+1,r)\) 左邊保留了乙個)的 \(r\) 是 \(p\) ,那麼可以得到:

\[\sum_^n(t(l,r)\times )=\sum_^n-2\sum_^n+\sum_^n(t(l+1,r)\times )

\]由此我們可以得出,我們需要維護的就是)數量不同的所有斷點,不難發現這個是很好維護的,用乙個棧維護就行了,時間複雜度 \(\mathcal o(n+k)\) 。

#include#include#include#include#includeusing namespace std;

#define ch() getchar()

#define pc(x) putchar(x)

templateinline void read(t&x)

templateinline void write(t x)

const int mod=998244353,maxn=2000005;

int mo(const int x)

int fac[maxn],iac[maxn];

int binom(int n,int m)

char s[maxn];

int st[maxn],tp;

int main()

else ++now;

} ans+=now;

write(ans),pc('\n');

} else

}else

ans=mo(ans+1ll*all*binom(i-1+k-1,k-1)%mod);

} write(ans),pc('\n');

} return 0;

}

這次月賽沒有打多久,這個成績勉強滿意吧。

某古 9 月月賽 I 遊記

目錄b cnoi2020 雷雨 c cnoi2020 夢原 d cnoi2020 線形生物 小結由於部落格已經估了好久沒寫了,所以跑來水更篇部落格。第一次 ak div2 莫名感動。這題難道有比 sam 還簡單的方法?越短的串出現次數才可能會越多,直接統計每個字元出現的次數,輸出最大值即可。incl...

NOIP模擬賽 洛谷11月月賽

t1終於結束的起點 題解 列舉啊.斐波那契數 第46個爆int,第92個爆long long.發現結果一般是m的幾倍左右.不用擔心t。題解 貪心。從當前沒跳過的最高的和最低的之間來回跳。預計10分 include include include include define ll long long...

2018 1月 月賽總結

a題 n,m 1e18,p 1e5,lucas定理求組合數 include include include using namespace std typedef long long ll ll n,m,p 100003 ll f 100005 ll qpow ll a,ll b return an...