例题6-5 移动盒子 UVa 12657 链表(模拟链表)
2015-09-16 16:28
344 查看
分析:看到这题,就想用list,自己写了好久,其中erase和insert需要注意好多东西,好不容易搞定了,提交总是超时。大概list的遍历会很慢吧。书上用的是数组形式双向链表,学习了一下,AC了。
TLE
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cstdlib> using namespace std; const int maxn=100005; int Right[100005],Left[100005]; void link(int L, int R) { Right[L]=R; Left[R]=L; } int main() { int n,m; int op; int cas=0; while(~scanf("%d%d",&n,&m)) { for(int i=1; i<=n; i++) { Left[i]=i-1; Right[i]=(i+1)%(n+1); } Right[0]=1; Left[0]=n; int inv=0; int X,Y; while(m--) { cin>>op; if(op==4) inv=!inv; else { cin>>X>>Y; if(op==3&&Right[Y]==X) swap(X,Y); if(op!=3&&inv) op=3-op; if(op==1&&Right[X]==Y) continue; if(op==2&&Right[Y]==X) continue; int LX=Left[X], RX=Right[X], LY=Left[Y], RY=Right[Y]; if(op==1) { link(LX,RX); link(X,Y); link(LY,X); } else if(op==2) { link(LX,RX); link(Y,X); link(X,RY); } else if(op==3) { if(RX==Y) { link(LX,Y); link(Y,X); link(X,RY); } else { link(LX,Y); link(Y,RX); link(LY,X); link(X,RY); } } } } int t=0; long long ans=0; for(int i=1; i<=n; i++) { t=Right[t]; if(i%2) ans+=t; } if(inv&&n%2==0) ans=(long long)n*(n+1)/2-ans; cout<<"Case "<<++cas<<": "<<ans<<endl; } return 0; }
TLE
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> #include<list> #include<deque> #define LL long long using namespace std; const int maxn=100005; //typedef list<int>LIST; int main() { freopen("f.txt","r",stdin); list<int> lis; list<int>::iterator it,vx,vy,bed,ed,vvx,vvy; int n,m,x,y,kk; int cas=0; while(scanf("%d%d",&n,&m)!=EOF){ if(!lis.empty()) lis.clear(); lis.push_back(0); for(int i=1;i<=n;i++){ lis.push_back(i); } lis.push_back(0); bool flag=false; for(int i=0;i<m;i++){ scanf("%d",&kk); if(kk==4){ flag=!flag; continue; } scanf("%d%d",&x,&y); // if(kk==1){ int posx=0,posy=0,p=0; for(it=lis.begin();it!=lis.end();it++){ p++; if(*it==x){ vx=it; posx=p; } else if(*it==y){ vy=it; posy=p; } // if(posx&&posy)break; } if(kk==3){ // if(vx++!=lis.end()--&&vy++!=lis.end()--){ vvx=vx; vvy=vy; lis.insert(vvx++,y); lis.erase(vx); lis.insert(vvy++,x); lis.erase(vy); continue; // } } if(flag)kk=3-kk; if(kk==1){ // vvx=vx; // vvy=vy; if(posx==posy-1)continue; if(posx<posy){ lis.insert(vy,x); lis.erase(vx); } else{ lis.erase(vx); lis.insert(vy,x); } } else if(kk==2){ if(posx==posy+1)continue; vy++; if(posx<posy){ lis.insert(vy,x); lis.erase(vx); } else{ lis.erase(vx); lis.insert(vy,x); } } } LL ans=0; int j=0; bed=lis.begin(); bed++; ed=lis.end(); ed--; for(it=bed;it!=ed;it++){ if((++j)%2==1)ans+=*it; } if(flag&&j%2==0)ans=(LL)n*(n+1)/2-ans; printf("Case %d: %lld\n",++cas,ans); } return 0; }
相关文章推荐
- HDU 4746 Mophues(莫比乌斯反演)
- HBase 数据模型
- 常用安全测试用例(一)
- 常用安全测试用例(二)
- 产品交互设计入门书籍推荐(亲自看过)
- VS2008编译问题
- rails 网站跨域
- Android:都是Layout的BaselineAligned惹的祸
- 面试题_List和Set不同
- Delphi星期几的判断
- uva 10253 Series-Parallel Networks 树的性质,可重排列
- POP3、SMTP、IMAP和Exchange都是个什么玩意?
- 标准SQL
- TCP协议总结--停止等待协议,连续ARQ协议,滑动窗口协议
- 在网站测试中如何做好安全性测试
- 关于BaseAdapter和simpleAdapter
- CSS3Ps -Photoshop图层特效转CSS3代码
- 作为团队Boss,如何处理PM与RD之间的矛盾?
- R语言连接Mysql数据库的步骤及简单使用mysql数据库中的数据
- iOS 延时的几种方法