P3613 【深基15.例2】寄包柜
因为在数据结构题单下面嘛,所以我用了邻接表存储,结果RE了。经过大佬指点迷津,它又变成了一份(不,是两份)好代码(●ˇ∀ˇ●)
RE代码变成AC代码
#include <bits/stdc++.h>
using namespace std;
//邻接表存储
typedef struct LList
{
int j;
long long data;
struct LList *next;
} LNode;
typedef struct Tnode
{
int data;
LNode *first;
} Tnode;
typedef Tnode Adjlist[100005];
typedef struct
{
Adjlist adjlist;
}*AList,Alnode;
void CreatAdj(AList &G,int n)
{
int i;
G=new Alnode;
for(i=1; i<=n; i++)
G->adjlist[i].first=NULL;
}
int main()
{
int n,q;
AList G;
int type,num,j;
long long data;
cin>>n>>q;
CreatAdj(G,n);
for(int i=0; i<q; i++)
{
cin>>type;
switch (type)
{
case 1:
{
cin>>num>>j>>data;
LNode *p;
p=new LNode;
if(data)
{
p->j=j;
p->data=data;
p->next=G->adjlist[num].first;
G->adjlist[num].first=p;
}
else
{
p=G->adjlist[num].first;
while(p)
{
if(p->j==j) {p->data=0;break;}
p=p->next;
}
}
break;
}
case 2:
{
cin>>num>>j;
LNode *p;
//p=new LNode;
p=G->adjlist[num].first;
while(p)
{
if(p->j==j&&p->data)
cout<<p->data<<"\n";
p=p->next;
}
break;
}
}
}
return 0;
}
删除结点法:其实我觉得这样做不合题意,但是结果是对的,所以仍旧A了
#include <bits/stdc++.h>
using namespace std;
//邻接表存储
typedef struct LList
{
int j;
long long data;
struct LList *next;
} LNode;
typedef struct Tnode
{
int data;
LNode *first;
} Tnode;
typedef Tnode Adjlist[100005];
typedef struct
{
Adjlist adjlist;
}*AList,Alnode;
void CreatAdj(AList &G,int n)
{
int i;
G=new Alnode;
for(i=1; i<=n; i++)
G->adjlist[i].first=NULL;
}
int main()
{
int n,q;
AList G;
int type,num,j;
long long data;
cin>>n>>q;
CreatAdj(G,n);
for(int i=0; i<q; i++)
{
cin>>type;
switch (type)
{
case 1:
{
cin>>num>>j>>data;
LNode *p;
p=new LNode;
if(data)
{
p->j=j;
p->data=data;
p->next=G->adjlist[num].first;
G->adjlist[num].first=p;
}
else
{
p=G->adjlist[num].first;
if(!p) break;
if(p->j==j) G->adjlist[num].first=p->next;
else
while(p->next)
{
if(p->next->j==j)
{
LNode *q=p->next;
p->next=q->next;
delete q;
break;
}
p=p->next;
}
}
break;
}
case 2:
{
cin>>num>>j;
LNode *p;
//p=new LNode;
p=G->adjlist[num].first;
while(p)
{
if(p->j==j)
cout<<p->data<<"\n";
p=p->next;
}
break;
}
}
}
return 0;
}
30行的map做法
#include <bits/stdc++.h>
using namespace std;
map<int,map<int,int> >m;
int main()
{
int n,q,a,b,c,d;
cin>>n>>q;
while(q--)
{
cin>>a;
if(a==1)
{
cin>>b>>c>>d;
m[b][c]=d;
}
else
{
cin>>b>>c;
cout<<m[b][c]<<endl;
}
}
return 0;
}
P4387 【深基15.习9】验证栈序列
这是一道模拟栈的出栈顺序的题目,我信誓旦旦的模拟了好久,自认为很不错,可以A掉,结果20分…orz. 在我这里分析,情况繁多复杂。于是参考了一些博客,其中一篇的总结很好:顺序入栈,随时出栈!
原文链接
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int m;
cin>>m;
for(int mi=0;mi<m;mi++)
{
int n;
cin>>n;
vector<int> v1;
vector<int> v2;
int c;
for(int i=0;i<n;i++) { cin>>c; v1.push_back(c); };
for(int i=0;i<n;i++) { cin>>c; v2.push_back(c); };
stack<int> q;
c=0;//出
for(int i=0;i<n;i++)
{
if(v2[c]==v1[i]) {
c++;
while(!q.empty())
{
int t=q.top();
if(t!=v2[c]) break;
c++;
q.pop();
}
}
else q.push(v1[i]);
}
if(q.empty()) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
另外附上很好的实用类STL介绍博客【以下均为转载链接】
1.C++ STL栈Stack的使用
2.Vector的详细用法