Codeforces Round #525 (Div. 2)題解
阿新 • • 發佈:2019-01-05
Codeforces Round #525 (Div. 2)題解
題解 CF1088A 【Ehab and another construction problem】
依據題意列舉即可
# include <bits/stdc++.h> int main() { int x; scanf("%d", &x); for(int i = 1; i <= x; i++) for(int j = 1; j <= x; j++) if((i % j == 0) && (j * i > x) && ((i / j) < x)) return 0 * printf("%d %d\n", i, j); printf("-1"); return 0; }
題解 CF1088B 【Ehab and subtraction】
這種題一上來先排序啊
然後就開始操作了
對於每一次操作,找到第一個\(\geq\)當前已經減去的數的數\(a_i\),把它減去當前已經減去數的值\(now\),然後把now更新為\(a[i]\),最後再二分(所以知道為什麼要排序了吧)找下一個大於\(now\)的數,如果這個位置越界了之後就都輸出\(0\)
如果還不理解就看程式碼
# include <bits/stdc++.h> # define ll long long ll a[100010]; int main() { ll n, k; ll now = 0, pos = 1; scanf("%I64d%I64d", &n, &k); for(int i = 1; i <= n; i++) scanf("%I64d", &a[i]); std::sort(a + 1, a + n + 1); a[n + 1] = 0x7f7f7f7f7f7f7f; for(int i = 1; i <= k; i++) { if(pos == n + 1) { printf("0\n"); continue; } printf("%I64d\n", a[pos] - now); now += a[pos] - now; ll l = pos + 1, r = n + 1; while(l < r) { ll mid = (l + r) >> 1; if(a[mid] > now) r = mid; else l = mid + 1; } pos = l; } return 0; }
題解 CF1088C 【Ehab and a 2-operation task】
怎麼把一個序列弄成單調遞增的呢?當然是把它搞成\(1 \cdots n\)啦
我們顯然可以找到這樣一種構造
- 對於每個數\(a_i\),通過\(\mod a_i - i + 1\)讓它變成\(i\)
這樣有一個漏洞:當前的\(a_i\)小於\(i\)怎麼辦?
我們發現我們還有一次操作機會
所以我們把這次給\(1\)操作:把整個序列加上一個特別大的數(但要滿足題目條件)
這樣就剛好用了\(n+1\)次操作
# include <bits/stdc++.h> int a[2010]; int main() { int n; scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); printf("%d\n", n + 1); printf("1 %d %d\n", n, 899999); for(int i = 1; i <= n; i++) { a[i] += 899999; printf("2 %d %d\n", i, (a[i] - i + 1)); a[i] %= (a[i] - i + 1); } return 0; }