日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Codeforces & Atcoder神仙题做题记录

發(fā)布時間:2024/6/21 综合教程 51 生活家
生活随笔 收集整理的這篇文章主要介紹了 Codeforces & Atcoder神仙题做题记录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

鑒于Codeforces和atcoder上有很多神題,即使發(fā)呆了一整節(jié)數(shù)學(xué)課也是肝不出來,所以就記錄一下。


AGC033B LRUD Game

只要橫坐標(biāo)或者縱坐標(biāo)超出范圍就可以,所以我們只用看其中一維就可以了。

我們又知道,如果先手想要讓它從左邊出去,那么先手就會一直Left,后手就會一直Right。

所以枚舉四種情況(L,R,U,D)就可以了。


AGC033C Removing Coins

首先我們考慮鏈的情況,如果選的是端點,那么有一個點沒有硬幣,如果選的不是端點,那么有兩個點沒有硬幣。所以就是一個取石子問題了。兩個點的情況要特殊考慮。

但是樹的情況過于復(fù)雜,所以我們要選一條鏈來代替這整棵樹,使得這條鏈被刪完當(dāng)且僅當(dāng)整棵樹被刪完。

這條鏈就是這棵樹的直徑。


ABC126F XOR Matching

被ABC狠狠地虐了一發(fā) 。。。

設(shè)$a oplus b=k$且$a,b,k$互不相同,則構(gòu)造$a,k,a,b,ldots,k,ldots,b$,其中$ldots$為除了$a,b,k$之外的所有數(shù)。


ARC080F Prime Flip

首先看到翻轉(zhuǎn)一段的肯定要差分,變成了對$x_i$和$x_{i+p}$都異或1,其中$p$為3以上的質(zhì)數(shù)。于是不知道為什么就想到了先配對然后每次去掉兩個點。現(xiàn)在我們要把$x_u$和$x_v$都異或上1,肯定就是通過“一條鏈”從$u$到$v$。打打表就會發(fā)現(xiàn):

若$|u-v|$為奇質(zhì)數(shù)時,需要1步
若$|u-v|$為偶數(shù)時,需要2步(哥德巴赫猜想)
否則需要3步

那么就是進(jìn)行配對,使得1最多,在1最多的情況下2最多。

1最多就是把奇數(shù)和偶數(shù)放在兩邊,差為質(zhì)數(shù)的連一條邊然后跑二分圖。

2最多就是跑完之后把未配對的分別在一組內(nèi)配對。配對完或者是剩下兩個差不為奇質(zhì)數(shù)的數(shù),湊一個3.


ARC082E Convex Score

前方浪費好題現(xiàn)場。

注意到$2^{內(nèi)部點個數(shù)}$是子集個數(shù),所以我們對$(S,T)$計算貢獻(xiàn),其中$T$是$S$凸包的內(nèi)部點的子集,所以$Scup T$的凸包是$S$。所以它的貢獻(xiàn)為$Scup T$有凸包。

所以答案就是有凸包的子集個數(shù)。轉(zhuǎn)換成沒有凸包的子集個數(shù)就可以做了,時間復(fù)雜度$O(n^2log n)$


AGC019B

記$B[l,r]$表示$A$翻轉(zhuǎn)$[l,r]$后的字符串。

我們知道,如果$s[l]=s[r]$,那么翻轉(zhuǎn)$[l,r]$和$[l+1,r-1]$是一樣的,無貢獻(xiàn)。如果$s[l]
eq s[r]$,且$B[l,r]= B[x,y]$,那么$B[l,r]$與$A$不相同的第一個位置就是$l$,最后一個不同的位置就是$r$,$B[x,y]$同理,所以$l=x,r=y$。

綜上,答案為$1+s[x]
eq s[y]$的點對個數(shù),反面考慮就可以直接$O(n)$計算了。


CF623B

發(fā)現(xiàn)只要確定gcd是多少就可以簡單計算了。

發(fā)現(xiàn)第一個數(shù)和第$n$個數(shù)至少有一個會留下來,枚舉是$+1,-1$還是不變。那么gcd肯定是這些的質(zhì)因子。


CF901B

自閉了。。。

根據(jù)整數(shù)的歐幾里得算法,取Fibonacci數(shù)列里面的數(shù)能到達(dá)復(fù)雜度上界。

那對于多項式,$p_0=1,p_1=x,p_n=xp_{n-1}pm p_{n-2}$,那么$(p_n,p_{n-1})$就是答案。

那如何要求$p_n$的系數(shù)絕對值$le 1$呢,取$p_n=xp_{n-1}+p_{n-2}(mathrm{mod} 2)$.

感覺上是$pm$之下$mathrm{mod} 2$是不變的吧。。。但是不太會證。。。當(dāng)時想到了但是不知道為什么是對的。。。


AGC039D

首先看一張圖:

其中G為$Delta ABC$的內(nèi)心,證明:G為$Delta DEF$的垂心。

證明:【略】(導(dǎo)角即可)

還有一個東西叫歐拉線,$overrightarrow{OH}=overrightarrow{OA}+overrightarrow{OB}+overrightarrow{OC}$。

枚舉$D,E,F$計算貢獻(xiàn),由于是循環(huán)對稱的,所以只用枚舉$O(n^2)$個$D$。


AGC005C

雖然可能能做出來但是還是跑去看題解了。

我們知道,設(shè)$a,b$是樹直徑的端點,則$k=max(a_i)$是直徑長度,$max_j(dis(i,j))=max(dis(i,a),dis(i,b))$。

首先看直徑上面的值,如果$k$為偶數(shù),那么直徑上面為$k,k-1,ldots,k/2,k/2+1,ldots,k$,如果$k$為奇數(shù),則為$k,k-1,ldots,(k+1)/2,(k+1)/2,ldots,k-1,k$。首先把這些值

去除掉,如果不能直接輸出Impossible.

然后看直徑外面的,如果$k$為偶數(shù),那么直徑外面至少為$k/2+1$,如果$k$為奇數(shù),那么直徑外面至少為$(k+1)/2+1$,檢查一下是不是就可以了。


AGC005D

(才發(fā)現(xiàn)這場的F題在n年前做掉了)

(看不懂題解,溜了)


AGC005E

首先,答案為-1當(dāng)且僅當(dāng)Red能夠到達(dá)兩個點$u$或$v$使得$(u,v)in E_R$且$dis_B(u,v)geq 3$。

那如何判斷能否到達(dá)一個點$v$呢,就是$dis_R(X,v)<dis_B(Y,v)$。

用一個dfs和一個bfs就可以找出所有Red能到達(dá)的點,如果有上面條件的點則輸出-1,否則輸出$dis_B$的最大值。


AGC006D

首先二分答案,這樣序列里面就只剩下$0/1$了。

打打表,發(fā)現(xiàn)答案就是離中心最近的相鄰兩個相等的數(shù)的值。

如果是0/1相間的,特判一下。


AGC006C

我們發(fā)現(xiàn)一次操作實際上就是$x_i=frac{2x_{i+1}+2x_{i-1}-2x_i}{2}=x_{i+1}+x_{i-1}-x_i$。

這個式子之前見過一遍了,改為差分之后就相當(dāng)于交換$i$和$i+1$。一共做$k$次就是先求出這個置換,然后求這個置換的$k$次方。置換的冪可以通過分解成環(huán),然后在

每個環(huán)上做。


AGC006F

之前VK Cup好像lqy講的一道題跟這個很像。

由于是$(u,v),(v,w)ightarrow (w,u)$,所以考慮對每一個弱聯(lián)通分量建一個三分圖(逃),如果能建出來且三個分量中都有點,則為$cnt_0 imes cnt_1+cnt_1 imes cnt_2+cnt_2 imes cnt_0$,如果能建出來而且只有兩個分量有點,則什么都加不上去。如果不能建出來那么它就是一個完全圖(包括自環(huán))。

直接dfs就可以做。


CF1240B

發(fā)現(xiàn)自己想假了之后就直接停止了思考。。。

注意到離散化之后,不動的地方肯定是一個連續(xù)段而且位置單調(diào)不降。。。然后就沒了。。。


CF1240D

要把自己做過的題記住。

AGC007F

超級神仙題。

我們畫畫圖就會發(fā)現(xiàn),$S$中相同連續(xù)的字符到$T$中相同連續(xù)的字符構(gòu)成了一段折線。借一張圖:

(我們定義拐點是折線中上面和右面和自己是同一個字符的格子)

那再看看,為何我們需要多次復(fù)制呢?是因為折線不能相交,左邊的拐點會被右邊的拐點壓下去。從右到左考慮,如果這個折線的某個拐點的影響不消失,那么下一個折線必定有一個拐點是當(dāng)前拐點向左向下一位。

那我們用隊列維護(hù)當(dāng)前折線的拐點,隊列里面第$i+1$個元素(從隊尾到對首)減去$i$是當(dāng)前折線的從上往下第$i+1$個拐點的位置(?第幾個字符),那么在隊尾加上一個數(shù)就是讓前面的折線往前一位,并在后面加上一個。注意如果``q[front] - (rear - front) >= i``就說明這個拐點沒用了(拐點不可能比它要后),那么答案就是隊列長度最大值$+1$,因為滿足當(dāng)前點需要的復(fù)制次數(shù)(即行數(shù))是拐點個數(shù)$+1$.

 1 #include<bits/stdc++.h>
 2 #define Rint register int 
 3 using namespace std;
 4 const int N = 1000003;
 5 int n, ans, q[N], front, rear;
 6 char s[N], t[N];
 7 int main(){
 8     scanf("%d%s%s", &n, s + 1, t + 1);
 9     if(!strcmp(s + 1, t + 1)){puts("0"); return 0;}
10     int cur = n;
11     for(Rint i = n;i;i --){
12         if(t[i] == t[i - 1]) continue;
13         while(cur && (cur > i || s[cur] != t[i])) -- cur;
14         if(!cur){puts("-1"); return 0;}
15         while(front < rear && q[front] - (rear - front) >= i) ++ front;
16         if(cur != i) q[rear ++] = cur;
17         ans = max(ans, rear - front + 1);
18     }
19     printf("%d", ans);
20 }

View Code


AGC030F

對于一個排列,里面一些值已經(jīng)給出,一些沒有給出,設(shè)。求不同的的個數(shù)。

首先我們發(fā)現(xiàn)它求的是,所以要從大到小填數(shù),方便在配對好了的計算貢獻(xiàn)。

我們?nèi)拥羲泻筒⒓僭O(shè)組的順序無關(guān),最后乘上的個數(shù)的階乘就可以了。

設(shè)表示填了的數(shù)之后,沒匹配的未知數(shù)有個,沒匹配的已知數(shù)有個。

若第個數(shù)是已知數(shù),那么有兩種選擇:匹配未知數(shù)或者不匹配。

若第個數(shù)是未知數(shù),那么有三種選擇:匹配已知數(shù)(這個有系數(shù),因為這種選擇的結(jié)果各不相同),匹配未知數(shù),或者不匹配。

時間復(fù)雜度為$O(n^3)$

 1 #include<bits/stdc++.h>
 2 #define Rint register int
 3 using namespace std;
 4 typedef long long LL;
 5 const int N = 603, mod = 1e9 + 7;
 6 inline void add(int &a, int b){a += b; if(a >= mod) a -= mod;}
 7 int n, cur, tmp, t, a[N], c[N], f[2][303][303];
 8 int cnt[N];
 9 int main(){
10     scanf("%d", &n); n <<= 1;
11     for(Rint i = 1;i <= n;i ++)
12         scanf("%d", a + i);
13     for(Rint i = 1;i <= n;i += 2){
14         if(a[i] != -1 && a[i + 1] != -1) cnt[a[i]] = cnt[a[i + 1]] = 2;
15         else if(a[i] == -1 && a[i + 1] == -1) ++ tmp;
16         else if(a[i] != -1) cnt[a[i]] = 1;
17         else cnt[a[i + 1]] = 1;
18     }
19     for(Rint i = 1;i <= n;i ++)
20         if(cnt[i] == 1) c[++ t] = 1;
21         else if(cnt[i] == 0) c[++ t] = 0;
22     f[0][0][0] = 1;
23     for(Rint i = t;i;i --){
24         cur ^= 1;
25         memset(f[cur], 0, sizeof f[cur]);
26         for(Rint j = 0;j <= (n >> 1) && j <= t;j ++)
27             for(Rint k = 0;k <= (n >> 1) && k <= t;k ++){
28                 if(c[i] == 1){
29                     add(f[cur][j][k + 1], f[cur ^ 1][j][k]);
30                     if(j) add(f[cur][j - 1][k], f[cur ^ 1][j][k]);
31                 } else if(c[i] == 0){
32                     add(f[cur][j + 1][k], f[cur ^ 1][j][k]);
33                     if(j) add(f[cur][j - 1][k], f[cur ^ 1][j][k]);
34                     if(k) add(f[cur][j][k - 1], (LL) f[cur ^ 1][j][k] * k % mod);
35                 }
36             }
37     }
38     int ans = f[cur][0][0];
39     for(Rint i = 1;i <= tmp;i ++)
40         ans = (LL) ans * i % mod;
41     printf("%d
", ans);
42 }

AGC030F


AGC030E

首先我們知道,如果修改$101$中間的$0$或者是$010$中間的$1$肯定是不行的,而且$000$和$111$根本不會出現(xiàn),所以每次修改的格子左右兩邊都是不同的,相當(dāng)于就是,將$1$和$0$的邊界劃線,每次可以將一條邊界移動一格,而且要求邊界的距離不超過$2$。

注意到匹配$S$和$T$的邊界線的方法有$O(n)$種,每次用$O(n)$計算貢獻(xiàn),時間復(fù)雜度是$O(n^2)$的。

注意如果$S_1
eq T_1$,那么$S$和$T$中$0$處的邊界線不能匹配,需要在$S$的前面加一條分界線。

實現(xiàn)上面,就是將$S$和$T$的分界線在前后各加$5000$條,然后枚舉移位的條數(shù)$i$,注意$2|i$(為了保證$0$和$1?$分別對應(yīng)),那么直接計算就可以了。

 1 #include<bits/stdc++.h>
 2 #define Rint register int
 3 using namespace std;
 4 const int N = 11111;
 5 int n, n1, n2, ans, _a[N], _b[N], *a = _a + 5000, *b = _b + 5000;
 6 char s1[N], s2[N];
 7 int main(){
 8     scanf("%d%s%s", &n, s1 + 1, s2 + 1);
 9     if(s1[1] != s2[1]) a[++ n1] = 0;
10     for(Rint i = 1;i < n;i ++){
11         if(s1[i] != s1[i + 1]) a[++ n1] = i;
12         if(s2[i] != s2[i + 1]) b[++ n2] = i;
13     }
14     for(Rint i = n1 + 1;i <= 5000;i ++) a[i] = n;
15     for(Rint i = n2 + 1;i <= 5000;i ++) b[i] = n;
16     ans = 1e9;
17     for(Rint i = -n1;i <= n2;i ++) if(!(i & 1)){
18         int tmp = 0;
19         for(Rint j = -5000;j <= 5000;j ++)
20             if(i + j >= -5000 && i + j <= 5000) tmp += abs(a[i + j] - b[j]);
21             else {
22                 if(i + j < -5000) tmp += b[j];
23                 else tmp += n - b[j];
24             }
25         ans = min(ans, tmp);
26     }
27     printf("%d", ans);
28 }

AGC030E


AGC030C

你發(fā)現(xiàn)小數(shù)據(jù)的時候,這樣填一定是對的。($n=k=4$)

1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3

但是你發(fā)現(xiàn)$k=2n$,所以繼續(xù)找規(guī)律,發(fā)現(xiàn)還可以這樣填($n=4,k=6$)

1 2 3 4
6 3 4 5
3 4 1 2
4 5 6 3

(就是一些斜行交叉著填兩種顏色,一些只填一種顏色)

 1 #include<bits/stdc++.h>
 2 #define Rint register int
 3 using namespace std;
 4 const int N = 503;
 5 int n, k, a[N][N];
 6 inline void AMOD(int &x){++ x; if(x >= n) x = 0;}
 7 int main(){
 8     scanf("%d", &k);
 9     n = min(k, 500);
10     for(Rint i = 0;i < n;i ++){
11         int x = 0, y = i;
12         for(Rint j = 0;j < n;j ++){
13             a[x][y] = i;
14             AMOD(x); AMOD(y);
15         }
16     }
17     for(Rint i = n;i < k;i ++){
18         int x = 0, y = i - n;
19         for(Rint j = 0;j < n;j ++){
20             if(y & 1) a[x][y] = i;
21             AMOD(x); AMOD(y);
22         }
23     }
24     printf("%d
", n);
25     for(Rint i = 0;i < n;i ++){
26         for(Rint j = 0;j < n;j ++)
27             printf("%d ", a[i][j] + 1);
28         putchar('
');
29     }
30 }

AGC030C

AGC040C

奇妙轉(zhuǎn)化:把偶數(shù)位置上面的 AB 取反,然后就變成了不能刪去 AA 和 BB.

充要條件就是 AB 數(shù)量都不超過一半。所以答案就是 $3^n-2sum_{i=lfloorfrac{n}{2}floor+1}^ninom{n}{i}2^{n-i}$

APC001F

題目描述:一個$n$ 個點的帶邊權(quán)的樹,每次可以選擇一個數(shù) $x$ 和一條路徑,將這條路徑上的點都異或上 $x$,求變?yōu)槿?的最少修改次數(shù)。

數(shù)據(jù)范圍:$nle 10^5,wle 15$

神仙套路:將點權(quán)設(shè)為與其相連的所有邊的異或和,則修改路徑 $u,v$ 相當(dāng)于把 $u$ 和 $v$ 的點權(quán)異或上 $x$.

沒那么神仙的套路:將 $u,v$ 的一次修改當(dāng)做$(u,v)$連邊,那么就是要分成一堆聯(lián)通塊,使得每個連通塊的異或和為 $0$,修改次數(shù)為 $n-$聯(lián)通塊個數(shù)。

首先去掉0,然后去掉相同數(shù),于是只剩下 15 個數(shù),枚舉子集再狀壓dp,時間復(fù)雜度 $O(n+3^w)$。

【以下是咕咕名單,希望這個括號可以不斷往下移動吧】


AGC035E

題目描述:有一個正整數(shù)集$S$,初始為空,然后Takahashi會做一些形如以下的操作:

選擇一個$1$到$n$的整數(shù)$x$,將$x$加入$S$
如果$x-2in S$,去掉$x-2$
如果$x+kin S$,去掉$x+k$

求能夠得到的$S$的個數(shù)$mathrm{mod} m$

數(shù)據(jù)范圍:$1le kle nle 150,10^8le mle 10^9$


AGC025D

題目描述:輸入$N,D_1,D_2$,要求構(gòu)造一個大小為$N^2$的點集,滿足以下條件:

$0le x_i,y_i<2N$
$forall i,jin [0,N^2),k=0,1,(x_i-x_j)^2+(y_i-y_j)^2
e D_k$

數(shù)據(jù)范圍:$1le Nle 300,1le D_1,D_2le 2 imes 10^5$.


AGC020D

題目描述:設(shè)$f(A,B)$,其中$A,Bin N_+$為滿足以下條件的字符串:

1. $|f(A,B)|=A+B$

2. $f(A,B)$中有$A$個`A`和$B$個`B`

3. 滿足上面條件時,要求$f(A,B)$的最長的只包含一種字符的子串盡可能短。

4. 滿足上面條件時,要求$f(A,B)$的字典序盡可能小。

$Q$次詢問,求$f(A_i,B_i)[C_i:D_i]$這個子串。

數(shù)據(jù)范圍:$1le Qle 10^3,1le A_i,B_ile 5 imes 10^8,1le C_ile D_ile A_i+B_i,D_i-C_i<100$


CF516E

題目描述:有$n$個boy和$m$個girl(標(biāo)號為0-based),有$b$個boy,$g$個girl開心。在第$i$天,第$i mathrm{mod} n$個boy可以和第$i mathrm{mod} m$個girl【被屏蔽】,如果他們中有一個人開心,那么兩個人都會變開心,否則啥事都不會發(fā)生。問經(jīng)過有限天之后能不能讓所有人都開心。

數(shù)據(jù)范圍:$1le n,mle 10^9,0le ble min(n,10^5),0le gle min(m,10^5)$


CF578E

題目描述:輸入一個長度為$n$的$ ext{LR}$字符串$S$,對于一個滿足下列要求的排列$p_1,p_2,ldots,p_n$:$S_{p_i}= ext{L}+[2|i]( ext{R}- ext{L})$,它的花費為$sum_{i=1}^{n-1}[p_i>p_{i+1}]$。求最小花費和可行方案。

數(shù)據(jù)范圍:$nle 10^5$,保證$ ext{R}$的數(shù)量減去$ ext{L}$的數(shù)量為$0$或$1$。

總結(jié)

以上是生活随笔為你收集整理的Codeforces &amp; Atcoder神仙题做题记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。