1. 程式人生 > >Codeforces Round#430 Div2 第一次hack別人的程式碼--------------附Codeforces842別人的題解

Codeforces Round#430 Div2 第一次hack別人的程式碼--------------附Codeforces842別人的題解

利用浮點數的精確除法與整數的整除(舍值)的差別,第一次成功hack別人的程式碼。

hack的測試資料 4 5 1 3 3。

那位外國朋友的程式碼被別人質疑過一次,沒成功舉出反例,然後我就用 4 5 1 3 3質疑成功了,不過他厲害,分分鐘除錯成功。

C題樹圖gcd, 暴力上, 計算所有可能。

#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;
}
D題二分,把每次詢問的x異或一下,然後每次的詢問就相當於對初始的陣列詢問了。
#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點半了。好事還是壞事,未知。