Codeforces Round#430 Div2 第一次hack別人的程式碼--------------附Codeforces842別人的題解
阿新 • • 發佈:2018-12-24
利用浮點數的精確除法與整數的整除(舍值)的差別,第一次成功hack別人的程式碼。
hack的測試資料 4 5 1 3 3。
那位外國朋友的程式碼被別人質疑過一次,沒成功舉出反例,然後我就用 4 5 1 3 3質疑成功了,不過他厲害,分分鐘除錯成功。
C題樹圖gcd, 暴力上, 計算所有可能。
D題二分,把每次詢問的x異或一下,然後每次的詢問就相當於對初始的陣列詢問了。#include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <set> using namespace std; const int N = 200005; int n, a[N], ans[N]; vector< vector<int> > v; set<int> s[N]; int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } void dfs(int rt, int pre) { for (int t : s[pre]) s[rt].insert(gcd(t, a[rt])); a[rt] = gcd(a[pre], a[rt]); s[rt].insert(a[pre]); ans[rt] = *s[rt].rbegin(); for (int t : v[rt]) { if (t != pre) dfs(t, rt); } } int main() { ios::sync_with_stdio(0); while (cin >> n) { v.clear(); v.resize(n + 1); s[0].clear(); for (int i = 1; i <= n; i++) { cin >> a[i]; s[i].clear(); } for (int i = 1; i < n; i++) { int x, y; cin >> x >> y; v[x].push_back(y); v[y].push_back(x); } a[0] = 0; s[0].insert(0); dfs(1, 0); cout << ans[1]; for (int i = 2; i <= n; i++) cout << " " << ans[i]; cout << endl; } return 0; }
#include <iostream> #include <cstring> using namespace std; const int N = 3e5; int cnt[1 << 19]; int main() { ios::sync_with_stdio(false); int n, m; while (cin >> n >> m) { memset(cnt, 0, sizeof cnt); cnt[0] = 0; for (int i = 1; i <= n; ++i) { int x; cin >> x; cnt[x] = 1; } for (int i = 1; i <= N; ++i) cnt[i] += cnt[i - 1]; int t = 0; while (m--) { int x; cin >> x; t ^= x; int l = 0, r = (1 << 19) - 1; for (int i = 18; i >= 0; --i) { int tmp = t & (1 << i), mid = l + r >> 1; if (tmp) { //若第i位為1 if (cnt[r] - cnt[mid] < r - mid) l = mid + 1; else r = mid; } else { if (cnt[mid] - (l ? cnt[l - 1] : 0) < mid - l + 1) r = mid; else l = mid + 1; } } cout << (l ^ t) << endl; } } return 0; }
這是開學前一週,難道俄羅斯人知道中國大學生都該返校了,然後這兩週就在codeforces三天舉行一場比賽。又要熬到凌晨1點半了。好事還是壞事,未知。