CSP-J
阿新 • • 發佈:2021-10-25
\(T1\)
數論,比較好想。
#include <bits/stdc++.h>
using namespace std;
long long a, b, c;
long long ans;
int main()
{
scanf("%lld%lld%lld", &a, &b, &c);
if(c - b >= a)
{
printf("%lld\n", a - 1);
return 0;
}
printf("%lld\n", c % a);
return 0;
}
T2
維護。
#include<bits/stdc++.h> using namespace std; int n, Q, x, v; int a[8010]; map<int, int> mp; vector<int> g; int main() { cin >> n >> Q; for(int i = 1; i <= n; ++i) { scanf("%d", &a[i]); g.insert(lower_bound(g.begin(), g.end(), a[i]), a[i]); mp[a[i]]++; } while(Q--) { int op; scanf("%d", &op); if(op == 1) { scanf("%d%d", &x, &v); int t = a[x]; a[x] = v; mp[t]--; mp[v]++; g.erase(lower_bound(g.begin(), g.end(), t)); g.insert(lower_bound(g.begin(), g.end(), v), v); } if(op == 2) { int cnt = 0; scanf("%d", &x); for(int i = 1; i < x; ++i) { if(a[i] == a[x]) cnt++; } int p = lower_bound(g.begin(), g.end(), a[x]) - g.begin() + 1; printf("%d\n", p + cnt); } } return 0; }
T3
map
和 字元判斷
。
#include <bits/stdc++.h> using namespace std; int n; char str[1007], s[1007]; map<string, int> mp; bool pd(char s, int id) { if(id < 0) return 0; if(s >= '0' && s <= '9') return 1; return 0; } bool check(char *s) { int cnt = 0, a[6]; for(int i = 0; i < 6; ++i) a[i] = 0; int len = strlen(s); int x = 0; bool flag = 0; if(!pd(s[0], 0)) return 1; for(int i = 0; i < len; ++i) { if(x > 65525) return 1; if(!pd(s[i], i) && !pd(s[i + 1], i + 1)) return 1; if(s[i] >= '0' && s[i] <= '9') { x = x * 10 + s[i] - '0'; if(!x && !flag && !pd(s[i - 1], i - 1) && pd(s[i + 1], i + 1)) return 1; if(x) flag++; } else if(s[i] == '.' || s[i] == ':') { a[++cnt] = x; x = 0; flag = 0; if(cnt >= 1 && cnt <= 3 && s[i] != '.') return 1; if(cnt == 4 && s[i] != ':') return 1; } else return 1; } if(cnt != 4) return 1; if(s[len - 1] == ':') return 1; a[++cnt] = x; for(int i = 1; i <= 4; ++i) if(a[i] < 0 || a[i] > 255) return 1; if(a[5] < 0 || a[5] > 65535) return 1; return 0; } int main() { freopen("network.in", "r", stdin); freopen("network.out", "w", stdout); scanf("%d", &n); for(int i = 1; i <= n; ++i) { int a, b, c, d, e; scanf("%s", str); scanf("%s", s); if(check(s)) { cout << "ERR\n"; continue; } if(str[0] == 'S') { if(!mp[s]) { mp[s] = i; cout << "OK\n"; } else { cout << "FAIL\n"; } } else { if(mp[s]) { cout << mp[s] << "\n"; } else { cout << "FAIL\n"; } } } return 0; }
T4
連結串列維護。
#include <bits/stdc++.h> using namespace std; const int N = 2e5 + 5; struct node { int l, r, pre, nxt, tag; }; node l[N]; int tot, L = 1, R, n, head = 1, a[N]; void Insert(int i) { ++tot; l[tot] = node {L, R, tot - 1, tot + 1, a[L]}; L = R = i; } void Delete(int i) { if (i == head) head = l[i].nxt; l[l[i].pre].nxt = l[i].nxt; l[l[i].nxt].pre = l[i].pre; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); if (a[i] == a[L]) R = i; else Insert(i); } Insert(n); l[tot].nxt = 0; bool flag = 1; while (flag) { int p = l[head].tag; flag = 0; for (int i = head; i; i = l[i].nxt) { if (p != l[i].tag) continue; flag = 1; printf("%d ", l[i].l); ++l[i].l; p ^= 1; if (l[i].l > l[i].r) Delete(i); } printf("\n"); } return 0; }
本文來自部落格園,作者:蒟蒻orz,轉載請註明原文連結:https://www.cnblogs.com/orzz/p/15458191.html