题意:
给你n条指令,三种操作。1.创建普通文件。2.删除普通文件后目录。3.给目录设置配额。判断每条指令是否执行成功
题解:
将数据以树的形式存储下来,在创建普通文件时,注意祖先节点的配额是否超出。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e6+10;
int n,lenP,tot;
struct node{
ll LD,LR,curLD,curLR,sz;
int kind,fa;
}A[maxn];
map<string,int>mp[maxn];
string pathA[25];
vector<pair<int,string> >vecTmp;
void splitPath(string s){
int i,lenS;
string tmpS="";
lenP=0;lenS=s.size();i=0;
while(i<lenS){
while(i<lenS&&(s[i]=='/'))i++;
if(i>=lenS)break;
tmpS="";
while(i<lenS&&(s[i]!='/'))tmpS+=s[i],i++;
if(tmpS=="")break;
pathA[++lenP]=tmpS;
}
}
void deleteNode(){
int i,lenV,fa;
string sec;
lenV=vecTmp.size();
for (i=0;i<lenV;i++){
fa=vecTmp[i].first;sec=vecTmp[i].second;
mp[fa].erase(mp[fa].find(sec));
}
}
bool createFile(string path,ll sz){
int i,j,fa,son,tmpTot,flag;
ll delta;
vecTmp.clear();
splitPath(path);
fa=0;tmpTot=tot;
for (i=1;i<=lenP;i++){
son=mp[fa][pathA[i]];
if(i<lenP){
if(son&&(A[son].kind==1)){
deleteNode();return false;
}
if(!son){
++tmpTot;
A[tmpTot]={0,0,0,0,0,2,fa};
mp[fa][pathA[i]]=tmpTot;vecTmp.push_back(make_pair(fa,pathA[i]));
fa=tmpTot;
}
else fa=son;
continue;
}
if(son&&(A[son].kind==2)){
deleteNode();return false;
}
if(!son){
++tmpTot;
A[tmpTot]={0,0,0,0,0,1,fa};
mp[fa][pathA[i]]=tmpTot;vecTmp.push_back(make_pair(fa,pathA[i]));
delta=sz;son=tmpTot;
}
else delta=sz-A[son].sz;
if(A[fa].LD&&(A[fa].LD<A[fa].curLD+delta)){
deleteNode();return false;
}
for (j=fa;j!=-1;j=A[j].fa){
if(A[j].LR&&(A[j].LR<A[j].curLR+delta)){
deleteNode();return false;
}
}
A[fa].curLD=A[fa].curLD+delta;
for (j=fa;j!=-1;j=A[j].fa){
A[j].curLR=A[j].curLR+delta;
}
A[son].sz=sz;
tot=tmpTot;
}
return true;
}
void removeFile(string path){
int i,j,son,fa;
ll delta;
splitPath(path);
fa=0;
for (i=1;i<=lenP;i++){
son=mp[fa][pathA[i]];
if(!son)return;
if(i<lenP){
fa=son;continue;
}
if(A[son].kind==1)delta=-A[son].sz;
else delta=-A[son].curLR;
if(A[son].kind==1)A[fa].curLD+=delta;
for (j=fa;j!=-1;j=A[j].fa)A[j].curLR+=delta;
mp[fa].erase(mp[fa].find(pathA[i]));
}
}
bool allocate(string path,ll LD,ll LR){
int i,son,fa;
splitPath(path);
if(!lenP){
if(LD&&(LD<A[0].curLD))return false;
if(LR&&(LR<A[0].curLR))return false;
A[0].LD=LD;A[0].LR=LR;
return true;
}
fa=0;
for (i=1;i<=lenP;i++){
son=mp[fa][pathA[i]];
if(!son)return false;
if(A[son].kind==1)return false;
if(i<lenP){
fa=son;continue;
}
if(LD&&(LD<A[son].curLD))return false;
if(LR&&(LR<A[son].curLR))return false;
A[son].LD=LD,A[son].LR=LR;
}
return true;
}
void init(){
int i;
tot=0;
A[0]={0,0,0,0,0,2,-1};
for (i=0;i<maxn;i++)mp[i].clear();
}
int main(){
string op,path;
ll sz,LD,LR;
bool flag;
while(cin>>n){
init();
while(n--){
flag=true;
cin>>op;
if(op[0]=='C'){
cin>>path>>sz;
flag=createFile(path,sz);
}
else if(op[0]=='R'){
cin>>path;
removeFile(path);
}
else if(op[0]=='Q'){
cin>>path>>LD>>LR;
flag=allocate(path,LD,LR);
}
printf("%c\n",flag?'Y':'N');
}
}
return 0;
}