2017 ACM ICPC 廣西邀請賽 題解

2022-05-27 22:51:09 字數 3868 閱讀 8744

題目鏈結  problems

hdoj上的題目順序可能和現場比賽的題目順序不一樣,

我這裡的是按照hdoj的題目順序來寫的。

problem 1001

簽到

#include using namespace std;

#define rep(i, a, b) for (int i(a); i <= (b); ++i)

typedef long long ll;

ll n, f[31];

int ans;

int main()

while (~scanf("%lld", &n))

return 0;

}

problem 1002

這道題的話,其實乙個點上是可以有多種顏色的

因為最多只有51種顏色,所以我們維護51棵線段樹即可。

我們對y座標建立線段樹,對於每個y,我們只需要知道最小的x在**即可。

因為他的詢問的x座標下界總是1,那麼我們只要看看y1到y2的最小值是否小於等於給定的x即可。

詢問的時候做51次子詢問就可以了。

#include using namespace std;

#define rep(i, a, b) for (int i(a); i <= (b); ++i)

#define dec(i, a, b) for (int i(a); i >= (b); --i)

typedef long long ll;

const int n = 2e6 + 10;

int x, c, d, x, y, op, ans, ret, cnt;

int root[53];

int l[n], r[n], v[n];

void update(int &i, int l, int r, int x, int val)

v[i] = min(v[i], val);

if (l == r) return;

int mid = (l + r) >> 1;

if (x <= mid) update(l[i], l, mid, x, val);

else update(r[i], mid + 1, r, x, val);

}void query(int i, int l, int r)

int mid = (l + r) >> 1;

if (c <= mid) query(l[i], l, mid);

if (d > mid) query(r[i], mid + 1, r);

} int main()

if (op == 1)

if (op == 2)

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

} }return 0;

}

problem 1003

我們對於每一條邊,找到所有包含這條邊的三元環,個數計為x

然後這對答案的貢獻就是$c_^$

判斷兩點之間是否有邊的時候要手寫雜湊才能過

#include const int n = 2e5 + 10;

#define rep(i, a, b) for (int i(a); i <= (b); ++i)

#define dec(i, a, b) for (int i(a); i >= (b); --i)

namespace hashmap

inline void add(int _u, int _v)

inline bool query(int _u, int _v)

}using namespace std;

using namespace hashmap;

typedef long long ll;

vectora[n];

struct ss e[n];

int n, m;

int main()

ll ans = 0;

rep(i, 1, m)

printf("%lld\n", ans);

} return 0;

}

problem 1004

這題規律找了半天……

$f[n] = f[n - 1] + 5f[n - 2] + f[n - 3] - f[n - 4]$

然後矩陣加速下就可以了

#include using namespace std;

#define rep(i, a, b) for (int i(a); i <= (b); ++i)

#define dec(i, a, b) for (int i(a); i >= (b); --i)

#define mp make_pair

#define fi first

#define se second

typedef long long ll;

const ll mod = 1e9 + 7;

struct matrix f, unit, a;

ll m, k;

int n;

matrix add(matrix a, matrix b)

return c;

}matrix mul(matrix a, matrix b)

return c;

}matrix pow(matrix a, ll k)

int main()

if (m == 2ll)

if (m == 3ll)

if (m == 4ll)

if (m == 5ll)

k = m - 4;

matrix b = pow(f, k);

matrix c = mul(b, a);

printf("%lld\n", c.arr[1][1]);

} return 0;

}

problem 1010

這道題的話先轉dfs序,然後求出以每個點為根的子樹的對應區間,

於是就轉化成了求區間裡選乙個數和x異或後的最大值。

可持久化trie即可。

#include using namespace std;

#define rep(i, a, b) for (int i(a); i <= (b); ++i)

#define dec(i, a, b) for (int i(a); i >= (b); --i)

typedef long long ll;

const int n = 1e5 + 10;

const int m = 1e7 + 10;

int n, m, tot = 0;

int rt[n], id[m], t[m][2];

int l, r, x;

int a[n], c[n], l[n], r[n], g[n];

int ti;

int u;

vector v[n];

inline void insert(int pre, int x, int k)

}inline int query(int l, int r, int x)

return ans;

}void dfs(int x)

r[x] = ti;

}int main()

dfs(1);

id[0] = -1;

insert(0, 0, 0);

rep(i, 1, n) insert(rt[i - 1], g[i], i);

rep(i, 1, m)

} return 0;

}

2017ACM ICPC廣西邀請賽

c counting stars 無向圖求三元環 這裡需要一些小小的改動 題目中要求的a結構其實是兩個具有一條公共邊的三元環 求這樣的個數 根據演算法我們一開始就是先列舉一條邊,這樣我們就以第一條邊為公共邊,找出三元環的個數,然後從這n個中選2個即可,也就是sum sum 1 2 include i...

2017 ACM ICPC 西安邀請賽總結

在這個月20號,我和隊友自費去了西安參加邀請賽,本想著就算拿不了好成績也不至於太差了,然而事實總是出乎意料,讓我打出了第一次參加 acm 的感覺 想起一年前第一次參加 acm,簡直了,讓我懷疑人生,一開始自信心滿滿,可是賽後卻心灰意冷 為此,比賽後一直到現在我都沒有調整過來心態,心態太 了,一度懷疑...

2017ACM ICPC北京賽區

有n只貓,和m條魚,第i只貓吃掉一條魚所花的時間為c i 乙隻貓,吃完乙個會繼續吃 如果還有的話 問在x時刻後有多少條魚留下 分別輸出完整的和不完整的 分析 暴力for一遍,trick 給每只貓設定乙個標記表示i秒的時候,它吃的魚還剩多少,這樣方便統計,便於模擬啊 include define ll...