第一次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. 王子和公主 UVa10635

    [题目描述]:王子和公主 一个王子和公主在n*n的格子中行走,这些格子是有1....n^2的编号的.现在给定p+1个数,再给定q+1个数,公主和王子可以选择其中某些格子行走,求他们最多能走几个相同的格 ...

  2. IntelliJ IDEA开发golang环境配置

    IntelliJ IDEA开发golang环境配置 首先把GO安装好...(自行安装,附上一篇我之前写的MAC安装GO) 安装IntelliJ IDEA,下载地址: https://www.jetbr ...

  3. es学习-索引配置

    1.创建一个新的索引并且添加一个配置 2.更新索引配置:(更新分词器为例子) 更新分词器前,一定要关闭索引,然后更新,最后再次开启索引 url:PUT http://127.0.0.1:9200/su ...

  4. POJ 1985 Cow Marathon (树形DP,树的直径)

    题意:给定一棵树,然后让你找出它的直径,也就是两点中的最远距离. 析:很明显这是一个树上DP,应该有三种方式,分别是两次DFS,两次BFS,和一次DFS,我只写了后两种. 代码如下: 两次BFS: # ...

  5. 编写高质量代码改善C#程序的157个建议——建议81:使用Parallel简化同步状态下Task的使用

    建议81:使用Parallel简化同步状态下Task的使用 在命名空间System.Threading.Tasks中,有一个静态类Parallel简化了在同步状态下的Task的操作.Parallel主 ...

  6. NIOS II 软件程序固化的相关知识

    片上RAM和ROM的SOPC系统1.生成hex文件2.将hex文件添加到quartus工程中(添加qip文件)3.对工程进行全编译4.下载sof就可以看到程序运行5.将sof转换为jic文件,烧写到E ...

  7. 通俗理解java序列化

    1 序列化是干什么的呢? 搬家的 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object sta ...

  8. C++基本数据类型(转)

    C++中定义了一组表示整数.浮点数.单个字符和布尔值的算术类型(arithmetic type). 另外还定义了一种叫做void的特殊类型.void类型没有对应的值,仅用在有限的一些情况下,通常用作无 ...

  9. sql查询语句的拼接小技巧(高手勿喷)

    1. 基本的查询语句后面加上 WHERE 1=1,便于增加查询条件. ASkStr := 'select * from Twork where 1=1 '; if length(cxTEworkid. ...

  10. MVC4 Action 方法的执行

    1. ActionInvoker 的执行: 在MVC 中  包括Model绑定与验证在内的整个Action的执行是通过一个名为ActionInvoker的组件来完成的. 它同样具有 同步/异步两个版本 ...