F 牛牛的猜球游戏
我们可以用一个数组 记录下前
次操作后第
杯子里球的颜色,也可用一个 vector 存储。
那么每个询问 到
后的结果,我们可以对于每一个
找到对应的
,这里的对应指杯子里球的颜色相等,并将
。
那么为什么呢? 原因如下:
如果 那么就说明如果颜色
在第
号杯子里,那么无论如何经过
的操作后
都会出现在第
个杯子里。因为我们是从
操作开始的所以
。
my code(有点写麻烦了,但不想改了):
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n,m;
int a[maxn][20],l[maxn],r[maxn],res[20];
void solve(int x,int y){
x--;
for(int i = 1;i <= 10;i++)
for(int j = 1;j <= 10;j++)
if(a[x][i] == a[y][j]){
res[j] = i - 1;
break;
}
for(int i = 1;i <= 10;i++)
printf("%d ",res[i]);
puts("");
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++)
scanf("%d%d",&l[i],&r[i]);
for(int i = 1;i <= 10;i++) a[0][i] = i;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= 10;j++)
a[i][j] = a[i - 1][j];
swap(a[i][l[i] + 1],a[i][r[i] + 1]);
}
int x,y;
while(m--){
scanf("%d%d",&x,&y);
solve(x,y);
}
return 0;
}std:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
struct ballList {
int pos[10];
};
ballList operator - (const ballList A, const ballList B) {
ballList C, temp;
for (int i = 0; i < 10; ++i) {
temp.pos[B.pos[i]] = i;
}
for (int i = 0; i < 10; ++i) {
C.pos[i] = temp.pos[A.pos[i]];
}
return C;
}
ostream & operator << (ostream& os, const ballList &ob) {
for (int i = 0; i < 10; ++i) {
if (i)os << ' ';
os << ob.pos[i];
}
return os;
}
ballList presum[MAXN];
int n, m, u[MAXN], v[MAXN], l, r;
ballList bf(int l, int r) {
ballList ret;
for (int i = 0; i < 10; ++i) {
ret.pos[i] = i;
}
for (int i = l; i <= r; ++i) {
swap(ret.pos[u[i]], ret.pos[v[i]]);
}
return ret;
}
int main()
{
ios::sync_with_stdio(false);
for (int i = 0; i < 10; ++i) {
presum->pos[i] = i;
}
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> u[i] >> v[i];
presum[i] = presum[i - 1];
swap(presum[i].pos[u[i]], presum[i].pos[v[i]]);
}
for (int i = 1; i <= m; ++i) {
cin >> l >> r;
cout << presum[r] - presum[l - 1] << endl;
}
return 0;
}