【模拟试题2】【20150520】
模拟+堆+链表+贪心+最小生成树+倍增LCA
这次题目简单了许多……然而蒟蒻还是傻逼了……sad连NOIP题都做这么烂……没救了
File
给定一些目录&文件,让按给定格式输出一个文件列表
其实直接排序一下,就可以满足字典序的条件了,顺便还能使在同一目录下的文件顺序连在一起,然后模拟一下“dfs”的过程即可:
记录当前在第几层目录,以及当前的目录名称,然后比较一下,如果相同则输出“| | .... |",否则更新当前目录,并清空后面的目录。
唉我就是没加清空后面目录的操作,导致【root/A/abc 和root/B/abc】的两个abc当成是一个目录了……挂了20分……sad。。。
其实蛮好写的……
1 //20150520 file 2 #include<string> 3 #include<cstdio> 4 #include<cstring> 5 #include<cstdlib> 6 #include<iostream> 7 #include<algorithm> 8 #define rep(i,n) for(int i=0;i<n;++i) 9 #define F(i,j,n) for(int i=j;i<=n;++i) 10 #define D(i,j,n) for(int i=j;i>=n;--i) 11 #define pb push_back 12 using namespace std; 13 typedef long long LL; 14 inline int getint(){ 15 int r=1,v=0; char ch=getchar(); 16 for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1; 17 for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch; 18 return r*v; 19 } 20 const int N=55; 21 /*******************template********************/ 22 int n; 23 string s[N],r[N]; 24 int st[N]; 25 int main(){ 26 #ifndef ONLINE_JUDGE 27 freopen("file.in","r",stdin); 28 freopen("file.out","w",stdout); 29 #endif 30 n=getint(); 31 F(i,1,n) cin >> s[i]; 32 sort(s+1,s+n+1); 33 int ceng=0,now=0,ed=0; 34 string ss=""; 35 rep(i,s[1].length()){ 36 if (s[1][i]=='/') break; 37 ss+=s[1][i]; 38 } 39 cout <<ss<<endl; 40 ceng=0; r[0]=ss; 41 42 F(i,1,n){ 43 string tmp=""; 44 int now=0; 45 rep(j,s[i].length()){ 46 if (j==s[i].length()-1) tmp+=s[i][j]; 47 if (s[i][j]=='/'||j==s[i].length()-1){ 48 if (tmp!=r[now]){ 49 F(i,1,now-1) printf("| "); 50 printf("|----"); 51 cout <<tmp<<endl; 52 r[now]=tmp; 53 F(k,now+1,6) r[k]=""; 54 } 55 tmp=""; now++; 56 }else tmp+=s[i][j]; 57 } 58 } 59 return 0; 60 }
Compile
其实这题跟【BZOJ】【1150】【CTSC2007】数据备份Backup 差不多……反而还更简单了……因为这题不用特判首尾
一开始还在想DP,然而N和M是同阶的……那么……根据自古流传的规律:DP不行想贪心!
然后就很流畅地写出来了……
上次写1150的时候还是看的lyd神犇的代码= =这次居然自己yy出来了,好评
1 //20150520 compile 2 #include<queue> 3 #include<cstdio> 4 #include<cstring> 5 #include<cstdlib> 6 #include<iostream> 7 #include<algorithm> 8 #define rep(i,n) for(int i=0;i<n;++i) 9 #define F(i,j,n) for(int i=j;i<=n;++i) 10 #define D(i,j,n) for(int i=j;i>=n;--i) 11 #define pb push_back 12 using namespace std; 13 typedef long long LL; 14 inline int getint(){ 15 int r=1,v=0; char ch=getchar(); 16 for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1; 17 for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch; 18 return r*v; 19 } 20 const int N=200010; 21 /*******************template********************/ 22 int n,m,a[N<<2],pre[N<<2],nex[N<<2],cnt; 23 bool vis[N<<2]; 24 typedef pair<int,int> pii; 25 priority_queue<pii>Q; 26 #define mp make_pair 27 #define X first 28 #define Y second 29 int main(){ 30 #ifndef ONLINE_JUDGE 31 freopen("compile.in","r",stdin); 32 freopen("compile.out","w",stdout); 33 #endif 34 n=getint(); m=getint(); 35 if (m>(n>>1)){puts("Error!"); return 0;} 36 F(i,1,n){ 37 a[i]=getint(); 38 pre[i]=i-1; 39 nex[i]=i+1; 40 vis[i]=0; 41 Q.push(mp(a[i],i)); 42 } 43 pre[1]=n; nex[n]=1; 44 int ans=0,num=0; 45 while(num<m && !Q.empty()){ 46 int x=Q.top().Y; Q.pop(); 47 if (vis[x]||vis[pre[x]]||vis[nex[x]]) continue; 48 // printf("%d %d \n",x,a[x]); 49 num++; 50 ans+=a[x]; 51 vis[x]=vis[pre[x]]=vis[nex[x]]=1; 52 /* a[x]=a[pre[x]]+a[nex[x]]-a[x]; 53 vis[x]=0; 54 pre[x]=pre[pre[x]]; nex[pre[x]]=x; 55 nex[x]=nex[nex[x]]; pre[nex[x]]=x; 56 Q.push(mp(a[x],x)); 57 */ a[++n]=a[pre[x]]+a[nex[x]]-a[x]; 58 pre[n]=pre[pre[x]]; nex[pre[n]]=n; 59 nex[n]=nex[nex[x]]; pre[nex[n]]=n; 60 Q.push(mp(a[n],n)); 61 // F(i,1,n) printf("%d ",pre[i]); puts(""); 62 // F(i,1,n) printf("%d ",nex[i]); puts(""); 63 // F(i,1,n) printf("%d ",vis[i]); puts(""); 64 } 65 if (num<m) puts("Error!"); 66 else printf("%d\n",ans); 67 return 0; 68 }
Cost
尼玛这样的题要不要考这么多遍,前两天tyvj刚做……又来……
1 //20150520 cost 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<iostream> 6 #include<algorithm> 7 #define rep(i,n) for(int i=0;i<n;++i) 8 #define F(i,j,n) for(int i=j;i<=n;++i) 9 #define D(i,j,n) for(int i=j;i>=n;--i) 10 #define pb push_back 11 using namespace std; 12 typedef long long LL; 13 inline int getint(){ 14 int r=1,v=0; char ch=getchar(); 15 for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1; 16 for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch; 17 return r*v; 18 } 19 const int N=10010,M=1e5+10; 20 /*******************template********************/ 21 int to[N<<1],next[N<<1],len[N<<1],head[N],cnt; 22 void add(int x,int y,int z){ 23 to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt; len[cnt]=z; 24 to[++cnt]=x; next[cnt]=head[y]; head[y]=cnt; len[cnt]=z; 25 } 26 struct edge{ 27 int x,y,z; 28 inline bool operator < (const edge &b)const {return z<b.z;} 29 }E[M]; 30 int n,m,fa[N][20],mx[N][20],dep[N],f[N],size[N]; 31 int Find(int x){return f[x]==x ? x : Find(f[x]);} 32 33 void dfs(int x){ 34 F(i,1,14) 35 if (dep[x]>=(1<<i)){ 36 fa[x][i]=fa[fa[x][i-1]][i-1]; 37 mx[x][i]=max(mx[fa[x][i-1]][i-1],mx[x][i-1]); 38 } 39 else break; 40 for(int i=head[x];i;i=next[i]) 41 if (to[i]!=fa[x][0]){ 42 dep[to[i]]=dep[x]+1; 43 fa[to[i]][0]=x; 44 mx[to[i]][0]=len[i]; 45 dfs(to[i]); 46 } 47 } 48 int query(int x,int y){ 49 int ans=0; 50 if (dep[x]<dep[y]) swap(x,y); 51 int t=dep[x]-dep[y]; 52 F(i,0,14) if (t&(1<<i)){ 53 ans=max(ans,mx[x][i]); 54 x=fa[x][i]; 55 } 56 D(i,14,0) if (fa[x][i]!=fa[y][i]){ 57 ans=max(ans,max(mx[x][i],mx[y][i])); 58 x=fa[x][i]; y=fa[y][i]; 59 } 60 if (x!=y) 61 ans=max(ans,max(mx[x][0],mx[y][0])); 62 return ans; 63 } 64 int main(){ 65 #ifndef ONLINE_JUDGE 66 freopen("cost.in","r",stdin); 67 freopen("cost.out","w",stdout); 68 #endif 69 n=getint(); m=getint(); 70 F(i,1,m){ 71 int x=getint(),y=getint(),z=getint(); 72 E[i]=(edge){x,y,z}; 73 } 74 sort(E+1,E+m+1); 75 F(i,1,n) f[i]=i,size[i]=1; 76 F(i,1,m){ 77 int f1=Find(E[i].x),f2=Find(E[i].y); 78 if (f1!=f2){ 79 if (size[f1]>size[f2]) swap(f1,f2); 80 f[f1]=f2; 81 size[f2]+=size[f1]; 82 add(E[i].x,E[i].y,E[i].z); 83 } 84 } 85 dfs(1); 86 int T=getint(); 87 while(T--){ 88 int x=getint(),y=getint(); 89 printf("%d\n",query(x,y)); 90 } 91 return 0; 92 }