数论,比较好想。
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;
}
维护。
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;
}
map
和 字符判断
。
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;
}
链表维护。
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;
}