这是这次题目最好AC的题
查看原帖
这是这次题目最好AC的题
124314
lcyxds楼主2020/11/8 10:40

考场抠123题,4题想了个错解,20分,前三题做的都特低,哭了

回来瞬间秒了第四题,真的全套题最简单的题,算法难度不超过橙

AC代码附上:

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

struct Snake{
  int _index;
  int _num;
};

bool operator < (Snake a, Snake b) {
  if (a._num == b._num) {
    return a._index < b._index;
  }
  return a._num < b._num;
}

bool operator > (Snake a, Snake b) {
  if (a._num == b._num) {
    return a._index > b._index;
  }
  return a._num > b._num;
}

Snake operator -(Snake a, Snake b) {
  a._num-=b._num;
  return a;
}

int _T;
int _n;
int _list[1000010];
Snake _queue[1000010];
int _head;
int _tail;
Snake _queue2[1000010];
int _head2;
int _tail2;

int _eat[1000010];
int _eaten[1000010];

bool _live[1000010];

int _res;

void DisplayList() {
  for (int i = 1; i <= _n; i++) {
    cout << _list[i] << ',';
  }
  cout << endl;
}

void Eat(int total) {
  Snake eat;
  Snake eaten;
  Snake next;
  if (_head2 == _tail2 || _head != _tail && _queue[_tail-1] > _queue2[_head2]) {
    _tail--;
    eat = _queue[_tail];
  }
  else {
    eat = _queue2[_head2];
    _head2++;
  }
  if (_head == _tail || _head2 != _tail2 && _queue2[_tail2-1] < _queue[_head]) {
    _tail2--;
    eaten = _queue2[_tail2];
  }
  else {
    eaten = _queue[_head];
    _head++;
  }
  //cout << eat._index << " eats " << eaten._index << endl;
  _eat[total] = eat._index;
  _eaten[total] = eaten._index;
  next = eat-eaten;
  _queue2[_tail2] = next;
  _tail2++;
}

void GenRes() {
  //DisplayList();
  _head = 1;
  _tail = _n+1;
  _head2 = 0;
  _tail2 = 0;
  for (int i = 1; i <= _n; i++) {
    _queue[i]._index = i;
    _queue[i]._num = _list[i];
  }
  for (int i = _n; i > 1; i--) {
    Eat(i);
  }
  memset(_live, 0, sizeof(_live));
  _live[_queue2[_head2]._index] = true;
  //cout << _queue2[_head2]._index;
  _res = 1;
  for (int i = 2; i <= _n; i++) {
    if (!_live[_eat[i]]) {
      while (_res < i) {
	_res++;
	_live[_eaten[_res]] = true;
      }
    }
  }
}

int main() {
  int k, a, b;
  scanf("%d%d", &_T, &_n);
  _T--;
  for (int i = 1; i <= _n; i++) {
    scanf("%d", _list+i);
  }
  GenRes();
  printf("%d\n", _res);
  while (_T--) {
    scanf("%d", &k);
    for (int i = 0; i < k; i++) {
      scanf("%d%d", &a, &b);
      _list[a] = b;
    }
    GenRes();
    printf("%d\n", _res);
  }
}
2020/11/8 10:40
加载中...