sicily 1934. 移动小球


Description


你有一些小球,从左到右依次编号为1,2,3,...,n. 你可以执行两种指令(1或者2)。其中, 1 X Y表示把小球X移动到小球Y的左边, 2 X Y表示把小球X移动到小球Y右边。 指令保证合法,即X不等于Y。 例如,初始状态1,2,3,4,5,6的小球执行1 1 4后,小球1被移动到小球4的左边,即2,3,1,4,5,6。如果再执行2 3 5,结点3将会移到5的右边,即2,1,4,5,3,6。


Input


第一行为一个整数t(0<t<10),表示测试用例个数。每个测试用例的第一行为两个整数n(1<n<=500000)和m(0<m<100000),n表示小球的个数,m为指令条数,以下m行每行为一条指令。


Output


为每个测试用例单独输出一行,从左到右输出最后序列,每个数字后面跟一个空格。


 1 #include<iostream>
 2 using namespace std;
 3 struct
 4 {
 5     int l;
 6     int r;
 7 }data[500001];    //尽量大
 8 int main()
 9 {
10     int t,n,m,i,h,u;
11     int control,x,y;
12     cin>>t;
13     for(int w=0;w<t;w++)
14     {
15         cin>>n>>m;
16         data[0].r=1;
17         data[n+1].l=n;
18         for(i=1;i<=n;i++)
19         {
20         data[i].l=i-1;
21         data[i].r=i+1;
22         }
23         for(int d=0;d<m;d++)
24         {
25         cin>>control>>x>>y;
26         data[data[x].l].r=data[x].r;
27         data[data[x].r].l=data[x].l;
28         if(control==1)
29         {
30             data[x].l=data[y].l;
31             data[x].r=y;
32             data[data[y].l].r=x;
33             data[y].l=x;
34         }
35         else
36         {
37             data[x].l=y;
38             data[x].r=data[y].r;
39             data[data[y].r].l=x;
40             data[y].r=x;
41         }
42         }
43         h=0;
44         for( u=1;u<=n;u++)
45         {
46             cout<<data[h].r<<" ";
47             h=data[h].r;
48         }
49         cout<<endl;
50     }
51     return 0;
52 }

如果用小球的绝对位置来做,每动一个小球其他小球的位置信息都要改,应该(肯定)会超时,如果只用相对位置做的话,每次只要改几个相关小球的位置信息就好了,效率高很多。(l左,r右)

下面是绝对位置堆栈来做:(可运行,sicily不通过)

  1 #include<iostream>
  2 #include<stack>
  3 using namespace std;
  4 int main()
  5 {
  6     stack<int> a;
  7     stack<int> b;
  8     int n,i,zhiling,x,y,save,temp,temp1;
  9     int r;
 10     int t;
 11     cin>>t;
 12     for(r=0;r<t;r++)
 13     {
 14     cin>>n;
 15     for(i=1;i<=n;i++)
 16     a.push(i);
 17     int m;
 18     cin>>m;
 19     int j;
 20     for(j=0;j<m;j++)
 21     {
 22     cin>>zhiling>>x>>y;
 23     if(zhiling==1)
 24     {
 25         for(i=1;i<=n;i++)
 26         {
 27         if(a.top()!=x)
 28         {
 29         temp=a.top();
 30         a.pop();
 31         b.push(temp);
 32         }
 33         else
 34         {
 35         save=a.top();
 36         a.pop();
 37         }
 38         }
 39         for(i=1;i<=n-1;i++)
 40         {
 41         if(b.top()!=y)
 42         {
 43         temp1=b.top();
 44         b.pop();
 45         a.push(temp1);
 46         }
 47         else
 48         {
 49         a.push(save);
 50         temp1=b.top();
 51         b.pop();
 52         a.push(temp1);
 53         }
 54         }
 55     }
 56         if(zhiling==2)
 57     {
 58         for(i=1;i<=n;i++)
 59         {
 60         if(a.top()!=x)
 61         {
 62         temp=a.top();
 63         a.pop();
 64         b.push(temp);
 65         }
 66         else
 67         {
 68         save=a.top();
 69         a.pop();
 70         }
 71         }
 72         for(i=1;i<=n-1;i++)
 73         {
 74         if(b.top()!=y)
 75         {
 76         temp1=b.top();
 77         b.pop();
 78         a.push(temp1);
 79         }
 80         else
 81         {
 82         temp1=b.top();
 83         b.pop();
 84         a.push(temp1);
 85         a.push(save);
 86         }
 87         }
 88     }
 89     }
 90     int w[100];
 91     for(i=0;i<n;i++)
 92     {
 93         w[i]=a.top();
 94         a.pop();
 95     }
 96     for(i=n-1;i>=0;i--)
 97     {
 98         cout<<w[i]<<" ";
 99     }
100     cout<<endl;
101     }
102     return 0;
103 }

下面是绝对位置数组来做:(可运行,sicily不通过,好LOW)

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int t;
 6     cin>>t;
 7     for(int e=0;e<t;e++){
 8     int n;
 9     cin>>n;
10     int a[100];
11     int b[100];
12     int count;
13     for(int o=0;o<100;o++)
14     a[o]=0;
15     int zhiling,x,y,w;
16     for(int i=1;i<=n;i++)
17     a[i]=i;
18     int m;
19     cin>>m;
20     for(int j=0;j<m;j++)
21     {
22         cin>>zhiling>>x>>y;
23         if(zhiling==1)
24         {
25             for(w=n+1;w>=y+1;w--)
26             {
27                 a[w]=a[w-1];
28             }
29             a[y]=x;
30             for(w=1;w<=n+1;w++)
31             {
32                 if(a[w]==x&&a[w+1]!=y)
33                 {
34                     a[w]=0;
35                 }
36             }
37
38         }
39             if(zhiling==2)
40         {
41             for(w=n+1;w>=y+2;w--)
42             {
43                 a[w]=a[w-1];
44             }
45             a[y+1]=x;
46             for(w=1;w<=n+1;w++)
47             {
48                 if(a[w]==x&&a[w-1]!=y)
49                 {
50                     a[w]=0;
51                 }
52             }
53
54         }
55         count=1;
56         for(int c=0;c<100;c++)
57         {
58             if(a[c]!=0)
59             {
60             b[count]=a[c];
61             count++;
62             }
63         }
64         for(int s=1;s<=n;s++)
65         {
66             a[s]=b[s];
67         }
68     }
69     for(int k=1;k<=n;k++)
70     {
71         cout<<a[k]<<" ";
72     }
73     cout<<endl;
74 }
75     return 0;
76  } 
时间: 2024-10-12 20:13:56

sicily 1934. 移动小球的相关文章

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

小tips:用java模拟小球做抛物线运动

这几天刚刚学习了java线程,然后跟着书做了几个关于线程的练习,其中有一个练习题是小球动起来.这个相信很简单,只要运用线程就轻松能够实现.然后看到了它的一个课后思考题,怎样让小球做个抛物线运动,这点我调试了很久,上网也找了很多资料,但是没有那种适合我们小白的教程,于是我简单讲讲我的思路.我将从如何画一个小球开始到一步步实现小球进行抛物线运动.嘿嘿!! 一.任务分解 现在我们来做抛物线运动的小球,先不急写代码,先来想象一下做好的结果是什么样子的.我将这个任务分成三步,第一步,画一个小球:第二步,该

完美世界笔试题---小球弹性碰撞

题目描述: 时间限制:c/c++语言1000MS: 其它语言3000MS 内存限制:c/c++语言65536KB:其他语言589824KB 如下图一个类似手机屏幕的矩形区域,宽度为w,高度为h,一个小球(视为质点,忽略其体积大小)初始位于底边距离左侧x的位置,向右上角45度发射.当小球碰到边界时,按完全弹性碰撞理想反弹,如果小球恰好碰到角落,则反向返回.如此无限循环. 请编写程序,输出前n次小球回到底边时的横坐标(首次发射时的不算). 输入: 每个输入是一行依次表示为w,h,x,n的4个正整数,

[bzoj1867][Noi1999][钉子和小球] (动态规划)

Description Input 第1行为整数n(2<=n<=50)和m(0<=m<=n).以下n行依次为木板上从上至下n行钉子的信息,每行中‘*’表示钉子还在,‘.’表示钉子被拔去,注意在这n行中空格符可能出现在任何位置. Output 仅一行,是一个既约分数(0写成0/1),为小球落在编号为m的格子中的概pm.既约分数的定义:A/B是既约分数,当且仅当A.B为正整数且A和B没有大于1的公因子. Sample Input 5 2 Sample Output 7/16 Solut

UVa 679小球下落(二叉树的编号)

题意:二叉树按层次遍历从1开始标号,所有叶子结点深度相同,每个结点开关初始状态皆为关闭,小球从根结点开始下落(小球落在结点开关上会使结点开关状态改变),若结点开关关闭,则小球往左走,否则往右走,给定二叉树深度D,求第I个小球所落到的叶子结点编号. 分析:对于每一个结点,若小球当前编号为k, k为奇数,则这个小球是第(k+1)/2个落在此处的,则往左走; k为偶数,则这个小球是第k/2个落在此处的,则往右走; 从根结点到叶子结点需判断D-1次. 比如,假如I为15,则这是第15个落在根结点的小球,

canvas 模拟小球上抛运动的物理效果

最近一直想用学的canvas做一个漂亮的小应用,但是,发现事情并不是想的那么简单.比如,游戏的逼真效果,需要自己来coding…… 所以,自己又先做了一个小demo,算是体验一下亲手打造物理引擎的感觉吧.*_* 代码效果预览地址:http://code.w3ctech.com/detail/2524 html: 1 <div class="container"> 2 <canvas id="canvas" style="border:1p

BZOJ 1934: [Shoi2007]Vote 善意的投票 最小割

1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1934 Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相反的票.我们定义一次投票的冲突数

Windows Store App JavaScript 开发:小球运动示例

通过前面内容的学习,相信读者已经对开发基于JavaScript的Windows应用商店应用有了一定的了解,本小节通过一个小球运动的示例来介绍如何新建一个JavaScript的Windows应用商店项目,以及怎样向项目中添加功能实现代码. 首先启动Visual Studio 2012集成开发工具,打开"文件"菜单,选择其中的"新建项目"菜单项后会弹出"新建项目"窗口.在"新建项目"窗口左侧的JavaScript模板分类中选择&q

coco2d-js demo程序之滚动的小球

最近有一个游戏叫围住神经猫,报道说是使用html5技术来做的. html5的跨平台的优良特性很不错,对于人手不足,技术不足,选用html5技术实现跨平台的梦想真是不错. 最近在看coco2d-js这个跨平台游戏开发框架,很不错,写了一个demo程序供大家参考. /** * Created by caicai on 14-7-27. */ var Ball = cc.Sprite.extend({ velocity:null, ctor:function () { this._super(res.