20260425-入门班-简单模拟02

已结束 IOI 开始于: 2026-5-16 8:00 4 小时 主持人: 34

信奥常用数学符号

i=1nai\sum _ {i=1} ^ {n} a_i

属于

i[1,n]i \in [1,n]

求和

i=1ni\sum_{i=1}^n i

相当于

for (int i=1;i<=n;i++){
    sum+=i;
}

累乘

i=1ni\prod_{i=1}^ni


函数

f(x)=x2+x+5f(x)=x^2+x+5

连乘

N!N!

vector

创建容器

vector 可以理解成:

一个可以自动变长的数组。

普通数组:

int a[100];

大小一开始就固定了。

vector 可以这样:

vector<int> v;

一开始是空的,后面可以不断加入数据。

vector<int> v;

表示创建一个存整数的 vector。

也可以一开始有 5 个数:

vector<int> v(5);

表示有 5 个元素,默认都是 0。

还可以这样:

vector<int> v(5, 7);

表示有 5 个元素,每个都是 7。

加入元素

v.push_back(10);
v.push_back(20);
v.push_back(30);

现在 v 里有:

10 20 30

访问

vector 和数组一样,从 0 开始编号。

cout << v[0] << endl; // 10
cout << v[1] << endl; // 20
cout << v[2] << endl; // 30

size()

cout << v.size() << endl;

如果 v 里有 3 个数,就输出:

3

遍历

方法一:普通 for
for (int i = 0; i < v.size(); i++) {
    cout << v[i] << " ";
}
方法二:范围 for
for (int x : v) {
    cout << x << " ";
}

输入 n 个数并输出

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;

    vector<int> v;

    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        v.push_back(x);
    }

    for (int x : v) {
        cout << x << " ";
    }

    return 0;
}

array

array 可以理解成:

STL 版的普通数组。

它的大小固定,不能变长。

普通数组:

int a[5];

STL 的 array:

array<int, 5> a;

创建容器

array<int, 5> a;

表示创建 5 个整数。

也可以直接赋值:

array<int, 5> a = {3, 1, 4, 1, 5};

访问

cout << a[0] << endl;
cout << a[1] << endl;

遍历

for (int i = 0; i < a.size(); i++) {
    cout << a[i] << " ";
}

或者:

for (int x : a) {
    cout << x << " ";
}

pair

pair 可以理解成:

一个小盒子,里面放两个东西。

比如一个学生有:

姓名 + 分数

一个坐标有:

x + y

这时候就可以用 pair

创建容器

pair<int, int> p;

表示这个 pair 里有两个整数。

第一个叫:

p.first

第二个叫:

p.second

赋值

方法一:

pair<int, int> p;
p.first = 3;
p.second = 5;

方法二:

pair<int, int> p = {3, 5};

方法三:

pair<int, int> p = make_pair(3, 5);

输出

cout << p.first << " " << p.second << endl;

如果:

p = {3, 5};

输出:

3 5

存坐标

#include <bits/stdc++.h>
using namespace std;

int main() {
    pair<int, int> p;

    cin >> p.first >> p.second;

    cout << "x = " << p.first << endl;
    cout << "y = " << p.second << endl;

    return 0;
}

结合使用

pair 可以直接排序。

vector<pair<int, int>> v;

如果里面有:

{2, 3}
{1, 9}
{2, 1}

执行:

sort(v.begin(), v.end());

排序后:

{1, 9}
{2, 1}
{2, 3}

规则是:

先比 first,first 小的在前。 first 相同,再比 second。


struct br{
	string name;
	int year;
	int id;
}a[1000];
bool cmp(br p,br q){
	if(p.year<60&&q.year<60){
		return p.id<q.id;
	}
	else if(p.year>=60&&q.year>=60){
		if(p.year!=q.year){
			return 	p.year>q.year ;
		}
		else{
			return p.id<q.id;
		}
	} 
	else{
		return 	p.year>q.year ;
	}
}
int main(){
	int n;cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].name>>a[i].year;
		a[i].id=i;
	}
	sort(a+1,a+1+n,cmp);
	
}

struct stu{
	int c,m,e;
	int rank;
	int id;
}s[10005];
bool cmp(stu p,stu q){
	if(p.c+p.m+p.e !=  q.c+q.m+q.e){
		return p.c+p.m+p.e  >   q.c+q.m+q.e ;
	}
	else if(p.c+p.m != q.c+q.m){
		return p.c+p.m > q.c+q.m;
	}
	else if(max(p.c,p.m) != max(q.c,q.m)){
		return max(p.c,p.m) > max(q.c,q.m);
	}
  return 1;
}
bool cmp2(stu p,stu q){	
	return p.id<q.id;
}
int main(){
	int n;cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s[i].c>>s[i].m>>s[i].e;
		s[i].id=i;
	}
	sort(s+1,s+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(s[i].c+s[i].m+s[i].e ==  s[i-1].c+s[i-1].m+s[i-1].e&&s[i].c+s[i].m == s[i-1].c+s[i-1].m&&max(s[i].c,s[i].m) == max(s[i-1].c,s[i-1].m)){
			s[i].rank=s[i-1].rank;
		}
		else s[i].rank=i;
	}
	sort(s+1,s+1+n,cmp2);
	for(int i=1;i<=n;i++){
		
	}
}

状态
已结束
规则
IOI
题目
6
开始于
2026-5-16 8:00
结束于
2026-5-16 12:00
持续时间
4 小时
主持人
参赛人数
34