解題報告 2015ACM ICPC亞洲區長春站

2021-07-10 01:49:01 字數 3406 閱讀 9821

題目鏈結 分析

不妨先解決這個問題的判斷非降序的部分。既然符合條件的陣列移除乙個數字就能使得整個陣列非降序,那麼我們先統計滿足 a[

i−1]

>a[

i]的i的個數cnt。另外,令idx等於當 cn

t=1 時的滿足 a[

i−1]

>a[

i]i的值。

下面根據cnt的值來分類討論:

對非公升序的判斷只要把陣列顛倒一下順序,然後重複非降序的判斷方法即可。

#include 

using

namespace

std;

const

int maxn = 1e5 + 5;

int t, n, a[maxn];

bool isincrease()

}if(cnt == 0) return

true;

if(cnt > 1) return

false;

if(idx == 1 || idx == n - 1)

if(a[idx-1] <= a[idx+1])

if(a[idx-2] <= a[idx])

return

false;

}bool isdecrease()

int main()

if(isincrease() || isdecrease())

else

puts("no");

}return

0;}

分析:

本題需要判斷若干個點是否正好構成乙個正多邊形。剛開始想得很複雜,覺得應該先求個凸包來判斷是否這些點收是否正好構成乙個凸多邊形。後來才發現,這些點構成正多邊形只須滿足它們的重心到各個點的距離相等就好了。

**:

#include 

using

namespace

std;

struct point

double distance(point p)

};const

double eps = 1e-10;

const

int maxn = 105;

int t, n;

double x, y, sx, sy;

point p[maxn];

int dcmp(double x)

int main()

bool flag = true;

point c = point(sx / n, sy / n);

double dis = c.distance(p[0]);

for(int i = 1; i < n; i++)

}puts(flag ? "yes" : "no");

}return

0;}

分析

由於滿足連通性和 n=

m−1 (其中為

n 點數,

m為邊數)的圖就是樹,所以在為

n 個結點分配 2(

n−1)

個度數且保證每個節點都有非零度數後,定能構造出一棵合法的樹。若沒有「每個結點都有非零度數」這一限制的話,這就是乙個完全揹包的問題。其中總度數為揹包的體積,度數i為物品的體積, f(

i)為物品的價值。為了解決這一限制給我們帶來的麻煩,我們假設先給每個結點分配了乙個度數,這下就可以進行完全揹包了。揹包的體積為 n−

1 ,度數i為物品的體積,價值為 f(

i)−f

(1) 。為什麼價值改變了呢?因為往揹包裡拿乙個度數為

i 代表的物品就相當於讓乙個度數為

1的結點的度數增加到

i 。由於體積小於節點數,因此不會發生改變已經改變過的結點的事情。也就是說,可以保證每次改變點的度數(往揹包中拿一件物品)都是對度數為

1的點進行的。

**

#include 

using

namespace

std;

const

int maxn = 2020;

int t, n, m, f[maxn], d[maxn];

int main()

memset(d, 0, sizeof(d));

d[0] = n * f[1];

for(int i = 2; i < n; i++)

}printf("%d\n", d[m]);

}return

0;}

分析

求集合中兩個數的最大異或值,這樣的問題非常適合用 trie來高效的求解。先將所有的數的二進位制表示的字串插入trie。然後列舉兩個數i, j,並將這兩個數刪除,接著直接在trie中找與i + j的異或值最大的那個數,並更新最大值。

**

#include 

using

namespace

std;

const

int maxn = 1e3 + 10, maxnode = 1e7;

int t, n, a[maxn], ans;

struct trie

void update(int num, int v)

u = ch[u][c];

val[u] += v;}}

int match(int num)

else u = ch[u][c];

}return ans;

}}o;int main()

ans = 0;

for(int i = 0; i < n; i++)

o.update(a[i], 1);

}printf("%d\n", ans);

}return

0;}

分析

我們可以列舉柱體(即矩陣中的元素)。對每個柱體,計算它的高度與四個方向上的柱體的高度差d,另外考慮柱頂也要貼玻璃,所以計算出該柱體對答案的貢獻為d + 1。注意,由於每組的輸入的矩陣規模可能不同,所以進入每組的計算前都要對二維陣列進行初始化(或者顯式地對邊界情況進行判斷)。

**

#include 

using

namespace

std;

const

int maxn = 55;

// 用於表示四個方向座標變化情況的二維陣列

const

int dir[2][4] = , };

int t, x, y, n, m, d, sum, c[maxn][maxn];

int main()

}for(int i = 1; i <= n; i++) }}

printf("%d\n", sum);

}return

0;}

(其他題目略)

2015 ACM ICPC 長春現場賽 部分題解

昨天全隊做了這個比賽,做乙個小小的總結,寫一寫部分題的題解。e rebuild 題意 依次輸入n個點的座標,分別為圓心。保證相鄰圓心的距離是個正整數。第n個圓和第1個圓相鄰。要求相鄰兩個圓要相切,求全部圓面積和的最小值,以及此時半徑的取法。解題方法 先根據座標求出相鄰圓心距離依次為a0 a1,an ...

PKU Campus 2015解題報告

這是第一次參加北大校賽,有一段時間沒有好好做題了,加上自己太水,這場比賽做得很不好,場下仔細想了想沒搞定的題目,其實沒有想象中那麼難 下次北大校賽,一定要好好打!因為平時實驗室有不少事情要做,沒辦法將時間全花在做題上面,只能慢慢啃這一套題,同時將我的解決思路總結在這篇部落格當中。a wu xing ...

NOIP2015解題報告

day1.當時的zxn很弱,弱到連dfs都調不明白就開始去noip。現在他會了dfs,二分答案,求lca,bfs,拓撲排序。所以他回去填noip2015的題解坑。t1.我現在依然不知道除了這種尾遞迴式的寫法之外還有啥別的寫法 偽 void dfs int i,int j,int x 咳我好像現在明白...