第一次TLE,对每个group重新设置Queue中定位,定位到每个group的最后一个元素,但WA

经过检查,DEQUEUE时没有根据情况重新计算group,插入时没有根据情况重新给last赋值

贴AC代码

import java.util.*;
public class POJ2259 {
static class Member{
String value;
int group;
//因为更新group数组会用到pre,所以得做一个双向链表
Member next;
Member pre; public Member(String value, int group, Member next,Member pre) {
this.value = value;
this.group = group;
this.pre = pre;
this.next = next;
}
} static Map<String,Member> members;//根据元素名称获取元素对象,用散列比较快
static Scanner sc = new Scanner(System.in);
static Member first;//列表头
static Member last;//列表尾
static Member[] gindicator;//记录每个group最后一个元素在列表中的位置 static void doQueueOp(){
String[] s=sc.nextLine().split(" ");
while (!s[0].equals("STOP")){
if(s.length==2){
// ENQUEUE x
//首先根据元素名称获取元素对象
String name = s[1];
Member m = members.get(name);
//检查团队中是否已经有队友在队列中
int group = m.group;
//没有队友在队列中,排在队列最后
if(gindicator[group]==null){
gindicator[group]=m;
//要记得更新last
last.next=m;
m.next=null;
m.pre=last;
last=m;
}
//有队友,排在团队最后一个队友最后
//gindicator[groupid]记录了团队最后一个队友的位置,所以直接排在group[groupid]后面就行
else {
m.next=gindicator[group].next;
if(gindicator[group].next!=null){
gindicator[group].next.pre=m;
}
m.pre=gindicator[group];
gindicator[group].next=m;
//如果队友正好是队列最后一个,需要更新last
if(last==gindicator[group]){
last=m;
}
gindicator[group]=m;
}
}
//DEQUEUE
else {
//如果队列不空,删除队列第一个元素
if(first.next!=null) {
Member m = first.next;
first.next = m.next;
if(m.next != null){
m.next.pre=first;
}
//如果队列只有一个元素,需要更新last
if(last==m){
last=m.pre;
}
//要记得更新gindicator
if(gindicator[m.group]==m){
//如果m是团队中唯一一个元素,把gindicator[groupid]置空
if(m.pre==null) {
gindicator[m.group] = null;
}
//否则把gindicator[groupid]置为m的前一个队友
//这里需要用到m.pre,所以做双向链表
else {
if(m.pre.group==m.group){
gindicator[m.group]=m.pre;
}else {
gindicator[m.group] = null;
}
}
}
System.out.println(m.value);
}
}
s=sc.nextLine().split(" ");
}
} public static void main(String[] args) {
int n = Integer.parseInt(sc.nextLine());
int so=1;
while (n != 0){
members = new HashMap<String,Member>();
//根据元素名称散列
for(int i=0;i<n;i++){
String[] s = sc.nextLine().split(" +|,");
for(int j=1;j<s.length;j++){
String name = s[j];
Member m = new Member(name,i,null,null);
members.put(name,m);
}
}
gindicator = new Member[n];
first = new Member("-1",-1,null,null);
last = first;
System.out.println("Scenario #"+so);
doQueueOp();
System.out.println();
so++;
n = Integer.parseInt(sc.nextLine());
}
}
}

  

POJ2259 Team Queue (JAVA)的更多相关文章

  1. poj-2259 team queue(数据结构)

    第一遍看的时候立即想到了哈希表. 再想时觉得两个队列,一个用来排队伍之间的顺序,一个用来排队伍内部成员的顺序即足够了. DEQUE的时候先判断哪只队伍排在队首,之后再让该队伍中的首队员出列. 整体没有 ...

  2. [POJ2259]Team Queue (队列,模拟)

    2559是栈,2259是队列,真的是巧啊 题意 模拟队列 思路 水题 代码 因为太水,不想打,发博客只是为了与2559照应,于是附上lyd的std #include <queue> #in ...

  3. poj2259 Team Queue

    吼哇,又是水题. 我本来准备开1010个queue的,但是STL容器里好像只有vector滋磁开组,于是只好数组模拟... 然后模拟过了...... #include <cstdio> # ...

  4. hdu 1387(Team Queue) STL

    Team Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  5. HDU 1387 Team Queue

    Team Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  6. Team Queue(多队列技巧处理)

    Team Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  7. Team Queue(STL练习题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1387 Team Queue Time Limit: 2000/1000 MS (Java/Others ...

  8. UVA 540 Team Queue(模拟+队列)

    题目代号:UVA 540 题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page ...

  9. HDU 1387 Team Queue( 单向链表 )

    Team Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

随机推荐

  1. C++细节理解

    1.为什么static类外初始化不需要static关键字 答:因为类外static变量或函数表示限定在此源文件中才能使用,而类中的static变量或函数表示由本类及其所有对象共享,如果在类外初始化或定 ...

  2. Cocos2dx之touch事件

    今天看了下ccocos2dx touch事件部分的源码,从CCTouch.CCTouchHandler和CCTouchDispatcher简单的做了分析和总结,先直接看源码吧! 1.CCTouch c ...

  3. Linux网络配置之虚拟网卡的配置(Red Hat 6.5)

    怎么查看当前的网络状态,这里就不着重描述,用ifconfig命令就可以.我们直接进入主题. red hat系统中的网卡配置在这个目录中:/etc/sysconfig/network-scripts 1 ...

  4. 1、设备网络SDK主要功能

    图像预览.文件回放和下载,云台控制,布防/撤防,语音对讲,日志管理,解码卡,远程升级,远程重启/关闭,格式化硬盘,参数配置(系统配置,通道配置,串口配置,报警配置,用户配置),多路解码器,智能设备功能 ...

  5. 并查集 - 1611 The Suspects

    题目地址: http://poj.org/problem?id=1611 分析: - 数据结构 - parent[x] 表示 x 元素的父节点位置. - rank[x] 记录x的子链的长度, 以便在合 ...

  6. C#6.0特性(快来围观)(转)

    出处:http://www.cnblogs.com/HJL-Blog/p/4457632.html 说明一下,很多博友一进来就认为仅仅是语法糖,C#语法的更新,代表着它的进步,语法糖是为了让我们更好的 ...

  7. python列表技巧

    1.访问列表元素 test1 = ["chengqian","and","what"] print(test1[0])#第一个元素 prin ...

  8. A Multi-Sensorial Simultaneous Localization and Mapping (SLAM) System for Low-Cost Micro Aerial Vehicles in GPS-Denied Environments

    A Multi-Sensorial Simultaneous Localization and Mapping (SLAM) System for Low-Cost Micro Aerial Vehi ...

  9. Appium 简介及工作原理

    申请:本文介绍主要是针对Android. 1.什么是Appium: Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持IOS.Android及Firefox ...

  10. Logstash 算术运算操作

    需求:input为json,output为ES,需使用filter提取json中的某个字段,并执行加法.加法.乘法等算法操作 思路:mutate过滤器+ruby过滤器实现 避坑:根据ES及Logsta ...