第一种方法:数组10^5*10^5 超范围
第二种方法:vector(mle)
//较麻烦,并且通过不了hack,需要手动搜索查询 #include <iostream> #include <vector> using namespace std; int n,p,judge,num1,num2,k; struct num{//格子 int index,k;//第index个格子,放的是k }; struct cupboard{ vector<num>b;//柜子的格子,非连续 }; int main() { cin>>n>>p; cupboard a[n+1]; for(int i=0;i<p;++i){ cin>>judge;//操作模式 if(judge==1){ cin>>num1>>num2>>k;//第几个柜子第几个格子放了几 if(!k){//清数 for(int j=0;j<a[num1].b.size();++j){//遍历第num1个柜子的格子 if(a[num1].b[j].index==num2){//如果已经有该数字,清除该格子 a[num1].b.erase(a[num1].b.begin()+j); } } } else{//放数 num tmp; tmp.index=num2; tmp.k=k; a[num1].b.push_back(tmp); } } else{ cin>>num1>>num2; for(int j=0;j<a[num1].b.size();++j){ if(a[num1].b[j].index==num2){ cout<<a[num1].b[j].k<<endl; } } } } return 0; }
需要0(n)去搜索有没有这个k
第三种方法:map
#include <iostream> #include <map> using namespace std; int n,p,judge,num1,num2,k; int main() { cin>>n>>p; map<pair<int,int>,int>a;//运用pair可用o(1)时间找出第几个柜子的第几个格子的k for(int i=0;i<p;++i){ cin>>judge; if(judge==1){ cin>>num1>>num2>>k; if(!k){ a.erase({num1,num2}); } else{ a[{num1,num2}]=k; } } else{ cin>>num1>>num2; cout<<a[{num1,num2}]<<endl; } } return 0; }
标签:num1,num2,int,cin,包柜,w3,judge,第几个 From: https://www.cnblogs.com/lijunjie03/p/17334904.html