【模拟试题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 }
View Code

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 
",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
",ans);
67     return 0;
68 }
View Code

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
",query(x,y));
90     }
91     return 0;
92 }
View Code
原文地址:https://www.cnblogs.com/Tunix/p/4516783.html