HDU5929 Basic Data Structure SB模拟题

(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

Catalog

Problem:Portal传送门

 原题目描述在最下面。
 题意不想过多描述,内心十分不平静。

Solution:

 简单就是可以找到一个规律就是很多次求和后到最后一个0哪里的值一定是1(除非这是最后一个0且只有一个0).问题转换为求最后一个0后面1的数量。

 组队训练赛写这题自闭了一下午!一下午都读错题了!赛后听别人讲后发现和我做的不是一道题我去???wtm?我听队友的题意是求和时要把栈首元素放到栈底求和,因为题目有一句话叫:

Take the element from top to bottom,

反正我是不知道为什么犯这错误。。。以后一定要自己把题意确定一遍!!!

啊,难受啊马飞!

AC_Code:
#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a));
const int N = 500005;

int n,m;
int stak[N], top, zero[N];
int lst[3], fir[3];
int main(){
  int tim, tc = 0;
  scanf("%d", &tim);
  while(tim--){
    scanf("%d",&n);
    mem(fir,-1);mem(lst,-1);
    char s[10];
    int u, flag = 1, st = 210002,ed = 210001;
    int a = 210002, b = 210001;
    printf("Case #%d:\n", ++tc);
    for(int i = 1; i <= n; ++i){
      scanf("%s", s);
      if(s[0]=='P'){
        if(s[1]=='U'){
          scanf("%d", &u);
          if(flag){
            stak[++ed] = u;
            lst[u] = ed;
            if(fir[u] == -1)fir[u]=ed;
            if(u == 0)zero[++b] = ed;
          }else{
            stak[--st] = u;
            fir[u] = st;
            if(lst[u] == -1)lst[u] = st;
            if(u == 0)zero[--a] = st;
          }
        }else{
          if(st > ed)continue;
          if(flag){
            u = stak[ed];--ed;
            if(u == 1)continue;
            if(a >= b)lst[u] = fir[u] = -1;
            else lst[u]=zero[b-1];
            if(a<=b)--b;
          }else{
            u = stak[st];++st;
            if(u == 1)continue;
            if(a >= b)fir[u] = lst[u] = -1;
            else fir[u] = zero[a+1];
            if(a<=b)++a;
          }
        }
      }else if(s[0]=='Q'){
          if(st > ed){
            printf("Invalid.\n");
            continue;
          }else if(st == ed){
            printf("%d\n", stak[st]);
            continue;
          }
          if(flag){
            int tmp = fir[0]-st+1;
            if(fir[0] == ed)tmp = fir[0]-st;
            if(fir[0] == -1) tmp = ed - st + 1;
            if(tmp%2 == 1)printf("1\n");
            else printf("0\n");
          }else{
            int tmp = ed - lst[0] + 1;
            if(lst[0] == st)tmp = ed - lst[0];
            if(lst[0] == -1)tmp = ed - st + 1;
            if(tmp % 2 == 1)printf("1\n");
            else printf("0\n");
          }
      }else flag = !flag;
    }
  }
  return 0;
}


Problem Description:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值