\(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;
}