SDNUOJ 1613.阿哲的理想国(练习deque的用法)

it2026-06-21  9

Time Limit: 1000 MS Memory Limit: 32768 KB Description 在阿哲的理想国,每个人都可以玩弄自己的东西,或者让别人玩弄

给出每个人的物品,每个人都可以

1 x y, 代表x将将自己的最后一个物品给y 如果x没有东西,什么都不会发生2 x,代表x将自己的物品序列反转

请你帮阿哲输出最终理想国的人民的物品序列

Input 第一行一个n, 代表n个居民, 下面n行给出n个数字序列,第i个序列第一个数字k代表物品序列长度,接着是第i个居民的物品序列 然后一个q,接下来q行代表操作

1 <= n <= 100000, 1 <= q <= 100000, 物品总数保证不会超过100000, 且最初每个居民都拥有物品 Output 输出最终每个居民的物品序列 Sample Input 5 3 1 2 3 3 4 5 5 3 6 4 2 1 1 1 5 3 1 1 5 2 1 1 2 4 Sample Output 2 1 4 5 6 4 2 1 5 5 3

什么是deque?deque就是一种特殊的队列,它叫双队列,可以高效地在队首和队尾进行插入删除操作,本题就用到了deque的基本用法。 还有关于将物品倒置的问题,实际上不用进行倒置操作,只需要用bool型的变量标记这组数据是否需要倒置,最后若需要倒置则倒序输出即可,倒置的数据在中间对其进行的操作也稍有不同,将所有情况列出再根据数据的情况进行对应的操作即可,下面是ac代码:

#include<iostream> #include<vector> #include<algorithm> #include<cstdio> #include<deque> using namespace std; struct pero{ int k; //int things[80]; deque<int> things; bool check; //用来判断数组是否倒置 }; pero dat[100005]; int main() { int n,p,a,b,c; cin>>n; for(int i=1;i<=n;++i) { cin>>dat[i].k; dat[i].check=false; for(int j=1;j<=dat[i].k;++j) { cin>>a; dat[i].things.push_back(a); } } cin>>p; for(int i=0;i<p;++i) { cin>>c; if(c==1) { cin>>a>>b; if(dat[a].k!=0) //以下是所有4种情况 { if(dat[a].check==false&&dat[b].check==false) { //dat[b].things[++dat[b].k]=dat[a].things[dat[a].k--]; dat[b].things.push_back(dat[a].things.back()); dat[a].things.pop_back(); dat[b].k++; dat[a].k--; } if(dat[a].check==true&&dat[b].check==true) { //dat[b].things[++dat[b].k]=dat[a].things[dat[a].k--]; dat[b].things.push_front(dat[a].things.front()); dat[a].things.pop_front(); dat[b].k++; dat[a].k--; } if(dat[a].check==true&&dat[b].check==false) { //dat[b].things[++dat[b].k]=dat[a].things[dat[a].k--]; dat[b].things.push_back(dat[a].things.front()); dat[a].things.pop_front(); //dat[a].things.pop_back(); dat[b].k++; dat[a].k--; } if(dat[a].check==false&&dat[b].check==true) { //dat[b].things[++dat[b].k]=dat[a].things[dat[a].k--]; dat[b].things.push_front(dat[a].things.back()); dat[a].things.pop_back(); dat[b].k++; dat[a].k--; } } } if(c==2) { cin>>a; dat[a].check=!dat[a].check; //形式上将数组倒置,如果再倒一次就倒回来,用bool变量再合适不过。 //cout<<dat[a].check; //reverse(dat[a].things.begin(),dat[a].things.end()); } } deque<int>::iterator j; //声明迭代器j for(int i=1;i<=n;++i) { if(dat[i].k==0) cout<<"\n"; else { if(dat[i].check==false) { for(j=dat[i].things.begin();j!=--dat[i].things.end();++j) { cout<<*j<<" "; } cout<<*j<<"\n"; } else //如果数组是倒序的,就倒着输出 { for(j=--dat[i].things.end();j!=dat[i].things.begin();--j) { cout<<*j<<" "; } cout<<*j<<"\n"; } } } return 0; }

将数组或一些容器中的数据倒置可以用reverse(,)函数,里面的两个参数限定了对哪个范围的数据进行倒置操作,这个区间老样子是左闭右开的,这一点一定要牢记。

还有,利用迭代器输出时,最后一个元素要拎到for外面单独输出,不然oj上会PE,我也不知道为啥= =

最新回复(0)