- P3156 【深基15.例1】询问学号
#include<iostream>
#include<vector>
using namespace std;
const int N = 2e6+5;
vector<int> a(N);
int main(){
int n,m; cin >> n >> m;
for(int i = 1;i<=n;i++) cin >> a[i];
int x;
while(m--){
cin >> x;
cout << a[x]<<endl;
}
return 0;
}
- P3613 【深基15.例2】寄包柜
#include<iostream>
#include<vector>
using namespace std;
const int N = 1e5+5;
vector<int> a[N];
int main(){
int n,q; cin >> n >> q;
while(q--){
int op,i,j,k;cin >> op >> i >> j;
if(op == 1){
cin >> k;
if(a[i].size()<=j){
a[i].resize(j+1);
}
a[i][j] = k;
}
else cout << a[i][j]<< endl;
}
return 0;
}
-
- 移动零
class Solution
{
public:
void sortColors(vector<int>& nums)
{
int n = nums.size();
int left = -1, right = n, i = 0;
while(i < right)
{
if(nums[i] == 0) swap(nums[++left], nums[i++]);
else if(nums[i] == 1) i++;
else swap(nums[--right], nums[i]);
}
}
};
-
- 颜⾊分类
class Solution
{
public:
void sortColors(vector<int>& nums)
{
int n = nums.size();
int left = -1, right = n, i = 0;
while(i < right)
{
if(nums[i] == 0) swap(nums[++left], nums[i++]);
else if(nums[i] == 1) i++;
else swap(nums[--right], nums[i]);
}
}
};
- 合并两个有序数组
class Solution
{
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
int cur1 = m - 1, cur2 = n - 1, cur = m + n - 1;
while(cur1 >= 0 && cur2 >= 0)
{
if(nums1[cur1] >= nums2[cur2]) nums1[cur--] = nums1[cur1--];
else nums1[cur--] = nums2[cur2--];
}
while(cur2 >= 0) nums1[cur--] = nums2[cur2--];
}
};
- The Blocks Problem
#include <iostream>
#include <vector>
using namespace std;
const int N = 30;
typedef pair<int, int> PII;
int n;
vector<int> p[N]; // 创建 n 个放⽊块的槽
PII find(int x)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < p[i].size(); j++)
{
if(p[i][j] == x)
{
return {i, j};
}
}
}
}
void clean(int x, int y)
{
// 把 [x, y] 以上的⽊块归位
for(int j = y + 1; j < p[x].size(); j++)
{
int t = p[x][j];
p[t].push_back(t);
}
p[x].resize(y + 1);
}
void move(int x1, int y1, int x2)
{
// 把 [x1, y1] 及其以上的⽊块放在 x2 上⾯
for(int j = y1; j < p[x1].size(); j++)
{
p[x2].push_back(p[x1][j]);
}
p[x1].resize(y1);
}
int main()
{
cin >> n;
// 初始化
for(int i = 0; i < n; i++)
{
p[i].push_back(i);
}
string op1, op2;
int a, b;
while(cin >> op1 >> a >> op2 >> b)
{
// 查找 a 和 b 的位置
PII pa = find(a);
int x1 = pa.first, y1 = pa.second;
PII pb = find(b);
int x2 = pb.first, y2 = pb.second;
if(x1 == x2) continue; // 处理不合法的操作
if(op1 == "move") // 把 a 上⽅归位
{
clean(x1, y1);
}
if(op2 == "onto") // 把 b 上⽅归位
{
clean(x2, y2);
}
move(x1, y1, x2);
}
// 打印
for(int i = 0; i < n; i++)
{
cout << i << ":";
for(int j = 0; j < p[i].size(); j++)
{
cout << " " << p[i][j];
}
cout << endl;
}