我和我们队一个同学时间复杂度一模一样(我看着,如有误请纠正),但是他AC了我80,到底是什么原因呢,有没有大佬帮我看看。 我的代码:80
#include<bits/stdc++.h>
using namespace std;
int a[200010], n, k;
struct fruit{
int num, ao;
};
typedef struct LNode{
queue <fruit> Q;
int kind;
LNode *nxt, *prior;
}LNode, *LinkList;
LinkList L, R, s;
int main(){
L = new LNode;
L->nxt = L->prior = NULL;
L->Q.front().num = -1;
R = L;
cin >> n;
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1; i <= n; ){
s = new LNode;
fruit Now; Now.num = i, Now.ao = a[i];
s->Q.push(Now);
s->kind = Now.ao;
int j;
for(j = i + 1 ; j <= n && a[j] == a[j - 1]; j++){
Now.num = j, Now.ao = a[j];
s->Q.push(Now);
}
k++;
i = j;
R->nxt = s;
s->prior = R;
R = s;
}
R->nxt = NULL;
while(L != R && k ){
for(LinkList p = L->nxt; p ; p = p->nxt){
if(p->Q.empty()) continue;
if(p == L->nxt || p->kind != p->prior->kind){
printf("%d ", p->Q.front().num);
p->Q.pop();
}
}
for(LinkList p = L->nxt; p ;p = p->nxt)
if(p->Q.empty()){
if(k == 1)
exit(0);
if(p == L->nxt){
LinkList tem = L->nxt;
tem->nxt->prior = L;
L = L->nxt;
L->prior = NULL;
free(L->prior);
}
else if(p == R){
R = R->prior;
free(R->nxt);
R->nxt = NULL;
}
else {
LinkList q;
q = p->nxt;
p->prior->nxt = q;
q->prior = p->prior;
free(p);
}
k--;
}
puts("");
}
return 0;
}
同学的代码:AC
#include <bits/stdc++.h>
using namespace std;
struct Node{
int data, next, prev;
}List[200005], plist[200005];
int arr[200005], n, len;
void dele(int x){
int nxt = plist[x].next, pre = plist[x].prev;
plist[nxt].prev = pre;
plist[pre].next = nxt;
}
void putin(int x){
int nxt = List[x].next, pre = List[x].prev;
List[nxt].prev = pre;
List[pre].next = nxt;
printf("%d ", x);
}
int main(){
scanf("%d", &n);
arr[0] = arr[n + 1] = 0x3f3f3f3f;
plist[0].next = 1;
for(int i = 1; i <= n; i++){
scanf("%d", &arr[i]);
List[i].next = i + 1;
List[i].prev = i - 1;
List[i].data = i;
}
for(int i = 1; i <= n; i++){
if(arr[i] != arr[i - 1]){
plist[++len].data = i;
plist[len].next = len + 1;
plist[len].prev = len - 1;
}
}
while(List[0].next != n + 1){
int head = plist[0].next;
int fruit = arr[plist[head].data];
while(head != len + 1){
if(fruit != arr[plist[head].data]){
dele(head);
head = plist[head].next;
continue;
}
putin(plist[head].data);
plist[head].data = List[plist[head].data].next;
if(fruit != arr[plist[head].data]){
dele(head);
}
fruit = !fruit;
head = plist[head].next;
}
putchar('\n');
}
return 0;
}
思路也基本上是一模一样的啊。