求条
#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;
}