CSP-J

\(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;
}
上一篇:【PAT B1040】有几个PAT (25 分)


下一篇:【ybtoj高效进阶 21282】数字重组(DP)(数学)