查看原帖
689584
zhangjinfeng楼主2024/10/10 13:49

求条

#include<bits/stdc++.h>
using namespace std;
map<string,long long>fni;//find name i
struct USER{
	long long t;
	/*usertype(类型)
	1 uploaduser(上传)
	2 downloaduser(下载)
	3 guest(浏览) 
	*/
	long long s;
	/*userstate(状态)
	0表示已连接 
	-1表示已断开连接 
	*/
	long long p;//userposition(位置) 
	long long pn;//pronum 进程数量 
};
struct File{
	string name;
	map<string,long long>fm;//find map(寻找文件或子目录)
	vector<long long>zm;//子目录 
	long long siz;//大小
	long long fa;//父目录 
	long long s;//状态 
};
struct PROCESS{
	long long g;//类型,1为上传,0为下载 
	long long siz;
	long long p;
	long long in;//属于 
};

PROCESS pro[100000];
long long pronum;
long long nowpronum;

USER user[100000];
long long usernum;
long long nowinusernum;

File file[100000];
long long filenum;

long long mun;//maxusernumber(最大成员数量)
long long msf;//maxserverflux(服务器最大流量)
long long muf;//maxuserflux(用户最大流量)

long long lastrunprotime;
void runpro(long long runtime){
	if(runtime<=lastrunprotime)return;
	for(long long t=lastrunprotime+1;t<=runtime;t++){
	//	cout<<t<<endl;	
		long long nowtimepronum=nowpronum;
		for(long long i=1;i<=pronum;i++){
			//cout<<"	"<<i<<nowpronum<<endl;
			if(pro[i].siz<=0)continue;
			file[pro[i].p].siz+=min(pro[i].siz,min(muf,msf/nowpronum));
			long long nowpath=file[pro[i].p].fa;
			while(nowpath)
				file[nowpath].siz+=min(pro[i].siz,min(muf,msf/nowpronum)),
				nowpath=file[nowpath].fa;
			pro[i].siz-=min(muf,msf/nowpronum);
//			cout<<"time:"<<t<<"   id:"<<i<<"   size:"<<pro[i].siz<<endl; 
			if(pro[i].siz<=0){
				user[pro[i].in].pn--;
				if(user[pro[i].in].pn==0)nowpronum--;
				if(pro[i].g==1){
					file[pro[i].p].s=0;
					long long nowpath=file[pro[i].p].fa;
					while(nowpath)
						file[nowpath].s=0,
						nowpath=file[nowpath].fa;
				}
			}
		}
	}
	lastrunprotime=runtime;
}

void runstate(long long u){
	if(file[u].s)return;
	file[u].s=0;
	for(long long i=0;i<file[u].zm.size();i++){
		runstate(file[u].zm[i]);
		if(file[file[u].zm[i]].s==1)file[u].s=1;
	}
}
 

int main(){
	cin>>mun>>msf>>muf;
	long long np=0;//now position(当前位置)
	stack<long long>p;//path(路径)
	p.push(0);
	while(!p.empty()){
		//cout<<p.size()<<endl;
		string s; 
		long long l;
		cin>>s;
		if(s=="-"){
			if(p.top()!=0){
				long long x=p.top(); 
				p.pop();
				file[p.top()].siz+=file[x].siz;	
			}else
				p.pop();
			continue;
		}
		cin>>l;
		np=p.top();
		++filenum;
		file[np].fm[s]=filenum;
		file[np].siz+=l;
		file[np].zm.push_back(filenum); 
		file[filenum].fa=np;
		file[filenum].name=s;
		file[filenum].siz=l;
		file[filenum].s=0;
		if(l==0)p.push(filenum);
	} 
	string s;
	user[0].s=-1;
	while(cin>>s){
		//puts("");
		if(s=="down")break;
		long long nowtime=0;
		for(long long i=0;i<s.size();i++)
			nowtime=nowtime*10+s[i]-'0';
		runpro(nowtime-1);
		runstate(0);
//		for(long long i=1;i<=filenum;i++){
//			cout<<i<<" state:"<<file[i].s<<endl; 
//		}
		//cout<<nowpronum<<endl;
		
		string name,order;
		cin>>name>>order;
		if(order=="connect"){
			long long A;cin>>A; 
			long long x=fni[name];
			if(user[x].s==-1&&nowinusernum<mun){
				usernum++;
				nowinusernum++;
				user[usernum].p=0;
				user[usernum].s=0;
				user[usernum].t=A;
				user[usernum].pn=0;
				fni[name]=usernum;
				puts("success");	
			}else
				puts("unsuccess");
			
		}else if(order=="quit"){
			long long x=fni[name];
			if(user[x].s==-1)puts("unsuccess");
			else 
				puts("success"),
				user[x].s=-1,
				nowinusernum--;
		}else if(order=="cd"){
			string fn;cin>>fn;
			long long x=fni[name];
			if(user[x].s==0&&file[user[x].p].fm[fn]&&file[file[user[x].p].fm[fn]].s==0){
				puts("success");
				user[x].p=file[user[x].p].fm[fn];
			}else puts("unsuccess");
		}else if(order=="cd.."){
			long long x=fni[name];
			if(user[x].s==-1||user[x].p==0){
				puts("unsuccess");
			}else{
				puts("success");
				user[x].p=file[user[x].p].fa;
			}
		}else if(order=="download"){
			long long x=fni[name];
			string name1;cin>>name1;
			if(user[x].s==-1||user[x].t!=2||
			file[user[x].p].fm[name1]==0||
			file[file[user[x].p].fm[name1]].s==1||
			user[x].pn){
				puts("unsuccess");
			}else{
				puts("success");
				pronum++;
				nowpronum++;
				user[x].pn++;
				pro[pronum].g=0;
				pro[pronum].siz=file[file[user[x].p].fm[name1]].siz;
			 	pro[pronum].p=file[user[x].p].fm[name1];
				pro[pronum].in=x;
			}
		}else if(order=="upload"){
			long long x=fni[name];
			string name1;long long siz;
			cin>>name1>>siz;
			if(user[x].s==-1||user[x].t!=1||file[user[x].p].fm[name1]||
			user[x].pn){
				puts("unsuccess");
			}else{
				puts("success");
				filenum++;
				file[filenum].fa=user[x].p; 
				file[filenum].name=name1;
				file[filenum].s=1;
				file[filenum].siz=0;
				file[user[x].p].fm[name1]=filenum;
				file[user[x].p].zm.push_back(filenum);
				file[user[x].p].siz+=siz;
				if(siz){
					pronum++;
					nowpronum++;
					user[x].pn++;
					pro[pronum].g=1;
					pro[pronum].siz=siz;
					pro[pronum].in=x;
					pro[pronum].p=filenum; 	
				}
			}
			
		}
	} 
	return 0;
}
2024/10/10 13:49
加载中...