A.Movie

  题意是给n个线段,要求求出是否存在三个不相交的线段,是的话输出yes,否则输出no。根据贪心的想法,可以先找出右端点r'最小的线段,他是三条线段中最左的那条,再找出左端点l'最大的线段,他是三条线段中最右的那条,这样我们只需要找出是否存在一条线段可以放在中间,即区间[l,r],l>r',r<l'。

  代码

 #include<cstdio>
int n;
long long L,R,l,r,a,b,c,d,mi,mx,flag,u,v,i;
int main()
{
int test;
long long P=;
scanf("%d",&test);
while(test--)
{flag=;
scanf("%d%I64d%I64d%I64d%I64d%I64d%I64d",&n,&l,&r,&a,&b,&c,&d);
L=l;R=r;
u=L;v=R;
mi=P;mx=;
if (u>v) u^=v^=u^=v;
if (v<mi) mi=v;
if (u>mx) mx=u;
for (i=;i<=n;i++)
{
L=(L*a+b)%P;
R=(R*c+d)%P;
u=L;v=R;
if (u>v) u^=v^=u^=v;
if (v<mi) mi=v;
if (u>mx) mx=u;
}
L=l;R=r;
u=l;v=r;if (u>v) u^=v^=u^=v;
if ((u>mi)&&(v<mx)) flag=;
for (i=;i<=n;i++)
{
if (flag) break;
L=(L*a+b)%P;
R=(R*c+d)%P;
u=L;v=R;if (u>v) u^=v^=u^=v;
if ((u>mi)&&(v<mx)) flag=;
}
if (flag) printf("YES\n");else printf("NO\n");}
}

B.Cycle

  题意是问给一张无向图,是否存在一个奇环或者偶环,环可以经过同样的点,做法是需要先求出dfs求出一颗树,一些边为树边,一些边为非树边,首先一条非树边和一些树边可以构成一些环,我们可以先判断这些环长度的奇偶性,然后如果一个环可能由多条非树边构成,需要怎么求,也很简单,如果存多个由一条非树边构成的环,他们交集非空,那么有他们复合成环的长度的奇偶性即为这些环的奇偶性的和,即使这些环的交集可能经过一些边,也不要紧,因为构成的环的边是否存在,是根据有多少个环包含这条边所决定,若存在奇数个环包含该边,则该边存在,否则不存在,因而复合环的奇偶性等价于这些环的奇偶性的和。

  代码

 #pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
const int M = ;
const int N = ;
int vis[N],deep[N],jump[N][],i,a[N],b[N],v[N][];
int dp,p[N],pre[M],tt[M],id[M],flag[N],n,m,Flag[],s[N][];
void link(int x,int y,int z)
{
dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;id[dp]=z;
}
void dfs(int x,int fa)
{
vis[x]=;
deep[x]=deep[fa]+;
jump[x][]=fa;
int i;
for (i=;i<=;i++)
jump[x][i]=jump[jump[x][i-]][i-];
i=p[x];
while (i)
{
if (!vis[tt[i]])
{
dfs(tt[i],x);
flag[id[i]]=;
}
i=pre[i];
}
}
int lca(int a,int b)
{
if (deep[a]<deep[b]) a^=b^=a^=b;
int i;
for (i=;i>=;i--)
if (deep[jump[a][i]]>=deep[b]) a=jump[a][i];
if (a==b) return a;
for (i=;i>=;i--)
if (jump[a][i]!=jump[b][i])
{
a=jump[a][i];b=jump[b][i];
}
return jump[a][];
}
void gao(int x)
{
int i;
s[x][]+=v[x][];
s[x][]+=v[x][];
i=p[x];
while (i)
{
if (jump[tt[i]][]==x)
{
gao(tt[i]);
s[x][]+=s[tt[i]][];
s[x][]+=s[tt[i]][];
}
i=pre[i];
}
if (s[x][]) Flag[]=;
if (s[x][]) Flag[]=;
if (s[x][]>=) Flag[]=;
}
int main()
{
int test;
scanf("%d",&test);
while (test--)
{
scanf("%d%d",&n,&m);
dp=;
for (i=;i<=n;i++)
p[i]=vis[i]=v[i][]=v[i][]=s[i][]=s[i][]=;
Flag[]=Flag[]=;
for (i=;i<=m;i++)
{
flag[i]=;
scanf("%d%d",&a[i],&b[i]);
link(a[i],b[i],i);
link(b[i],a[i],i);
}
for (i=;i<=n;i++)
if (vis[i]==) dfs(i,);
for (i=;i<=m;i++)
if (!flag[i])
{
int c=lca(a[i],b[i]);
int dis=(deep[a[i]]+deep[b[i]]-*deep[c]+)%;
v[jump[c][]][dis]--;
v[c][dis]--;
v[a[i]][dis]++;
v[b[i]][dis]++;
}
for (i=;i<=n;i++)
if (jump[i][]==) gao(i);
if (Flag[])
printf("YES\n");else printf("NO\n");
if (Flag[])
printf("YES\n");else printf("NO\n");
}
}

C.Segment

  假设对于一个可行的方案,若Ai<Aj,且Bpi>Bpj,那么[Ai,Bpi]∩[Aj,Bpj]与[Ai,Bpj]∩[Aj,Bpi]是等价的,因此我们可以一直将这样的pi和pj进行交换,直到不存在这样的方案,也就是说对于所有的可行方案,经过这样的交换后,配对都会变成一样的,因此可以将A与B进行排序。若存在Ai>Bi则不存在可行方案,否则找一个最长的输出即可。

  代码

 #include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int N= ;
int n,m,i,a[N],b[N],f[N],j,flag,cnt,ans;
int main()
{
int test;
scanf("%d",&test);
while (test--)
{
ans=;cnt=;flag=;
scanf("%d%d",&n,&m);
for (i=;i<=n;i++) f[i]=;
for (i=;i<=m;i++)
scanf("%d",&a[i]);
for (i=;i<=m;i++)
scanf("%d",&b[i]);
sort(a+,a++m);
sort(b+,b++m);
for (i=;i<=m;i++)
{
for (j=a[i];j<=b[i];j++)
f[j]=;
if (a[i]>b[i])
{
flag=;break;
}
}
for (i=;i<=n;i++)
if (f[i]==) cnt++;else
{
if (cnt>ans) ans=cnt;cnt=;
}
if (cnt>ans) ans=cnt;
if (flag) printf("Stupid BrotherK!\n");
else
printf("%d.000000\n",ans);
}
}

D.Brackets

   题意是给一个括号序列,支持两种操作,第一种是修改一个位置的括号,第二种是查询区间[L,R]中,第k个未匹配括号是哪一个,输出下标。若无解输出-1

   首先考虑有无解的判断,若一个序列中消除了已匹配的括号,那么未匹配括号必定是这种形式)))....)))(((((....((,我们可以根据前缀和来判断有无解,做法如下:

  先将'(’视为1,')'视为-1,维护括号序列每个位置的的前缀和sum,那么在区间[L,R]中,未匹配括号的个数即为sum[L-1]+sum[R]-2*min(sum[i])(L<=i<=R),区间最小的前缀和可以用线段树维护一下。

   然后考虑有解情况,若k<=sum[L-1]-sum[i],则答案为区间[l,r]中最靠左边的前缀和为sum[L-1]-k的括号的位置。否则为区间中最靠右边的,且前缀和为min(sum[i])+(k-(sum[L-1]-min(sum[i])))的括号的位置+1。

用线段树维护一下前缀和最小值,即可进行上面解决方法的所有操作,复杂度O(nlogn)

  代码

 #include<cstdio>
#include<set>
#define fi first
#define sc second
using namespace std;
typedef pair<int,int> P;
const int N = ;
int v[N],e[N],n,m,i,o;
P s[N];
char ch[N];
P min(P a,P b)
{
if (a.fi==b.fi)
{
if (a.sc<b.sc) return a;return b;
}
if (a.fi<b.fi) return a;return b;
}
void clean(int x)
{
if (v[x])
{
s[x].fi+=v[x];
v[*x]+=v[x];
v[*x+]+=v[x];
v[x]=;
}
}
void gao(int x,int l,int r)
{
v[x]=;
if (r-l==)
{
s[x].fi=e[r];
s[x].sc=r;
}
else
{
int m=(l+r)>>;
gao(*x,l,m);
gao(*x+,m,r);
s[x]=min(s[*x],s[*x+]);
}
}
void change(int x,int a,int b,int l,int r,int c)
{
clean(x);
if ((a<=l)&&(r<=b))
{
v[x]+=c;
return;
}
int m=(l+r)>>;
if (a<m) change(*x,a,b,l,m,c);
if (m<b) change(*x+,a,b,m,r,c);
clean(*x);clean(*x+);
s[x]=min(s[*x],s[*x+]);
}
P query(int x,int a,int b,int l,int r)
{
clean(x);
if ((a<=l)&&(r<=b)) return s[x];
int m=(l+r)>>;
P tmp;tmp.fi=;
if (a<m) tmp=min(tmp,query(*x,a,b,l,m));
if (m<b) tmp=min(tmp,query(*x+,a,b,m,r));
return tmp;
}
int get(int x,int a,int b,int l,int r,int c,int typ)
{
clean(x);
if (s[x].fi>c) return ;
int m=(l+r)>>;
int ans=;
if (r-l==)
{
if (s[x].fi==c) return r;else return ;
}
if ((a<=l)&&(r<=b))
{
if (typ==)
{
ans=get(*x,a,b,l,m,c,typ);
if (ans) return ans;
ans=get(*x+,a,b,m,r,c,typ);
return ans;
}
else
{
ans=get(*x+,a,b,m,r,c,typ);
if (ans) return ans;
ans=get(*x,a,b,l,m,c,typ);
return ans;
}
}
if (typ==)
{
if (a<m) ans=get(*x,a,b,l,m,c,typ);
if (ans) return ans;
if (m<b) ans=get(*x+,a,b,m,r,c,typ);
return ans;
}
else
{
if (m<b) ans=get(*x+,a,b,m,r,c,typ);
if (ans) return ans;
if (a<m) ans=get(*x,a,b,l,m,c,typ);
return ans;
}
}
int main()
{
int test;
scanf("%d",&test);
while (test--)
{
scanf("%d%d",&n,&m);
for (i=;i<=n;i++)
scanf(" %c",&ch[i]);
for (i=;i<=n;i++)
if (ch[i]=='(') e[i+]=e[i]+;else e[i+]=e[i]-;
gao(,,n+);
for (i=;i<=m;i++)
{
int typ,a,b,c;
scanf("%d",&typ);
if (typ==)
{
scanf("%d",&a);
if (ch[a]=='(')
{
ch[a]=')';
a++;
change(,a-,n+,,n+,-);
}
else
{
ch[a]='(';
a++;
change(,a-,n+,,n+,);
}
}
else
{
scanf("%d%d%d",&a,&b,&c);
a++;b++;
P tmp=query(,a-,b,,n+); int p=,q=;
p=query(,a-,a-,,n+).fi;
q=query(,b-,b,,n+).fi; if (p-tmp.fi+q-tmp.fi<c)
printf("-1\n");
else
if (c<=p-tmp.fi)
printf("%d\n",get(,a-,n+,,n+,p-c,)-);
else
printf("%d\n",get(,,b,,n+,tmp.fi+c-(p-tmp.fi)-,));
}
}
}
}

E.Game

题意是有n个人站成环,有一个集合S,每次从集合S中随机选出一个数字s,然后依次报数,报道s的人从环中出去,问n轮后有哪些人有获胜的可能性。经典的约瑟夫问题,可以O(N^3)dp解决。

代码

 #include<cstdio>
const int N = ;
int n,m,i,j,k,t,a[N],f[N][N],ans;
int main()
{
int test;
scanf("%d",&test);
while (test--)
{
scanf("%d%d",&n,&m);
for (i=;i<=m;i++)
scanf("%d",&a[i]);
for (i=;i<=n;i++)
for (j=;j<=n;j++)
f[i][j]=;
f[][]=;
for (i=;i<=n;i++)
{
for (j=;j<=m;j++)
{
t=(a[j]-)%i;
for (k=;k<i;k++)
if (f[i-][k])
f[i][(t++k)%i]=;
}
}
ans=;
for (i=;i<n;i++)
if (f[n][i]) ans++;
printf("%d\n",ans);
int flag=;
for (i=;i<n;i++)
if (f[n][i])
{
if (flag) printf(" ");
flag=;
printf("%d",i+);
}
printf("\n");
}
}

  

F.

G.

H.Occupation

  题意是给一棵树,树上每个点都有一个权值,有三类操作,1.取一条路径上所有的没被取的点,2.如果x点被取了,则将其变为未取的状态,3.去以x为根的子树上所有没被取的点,每次操作后求出被取点的价值总和。

  裸的树链剖分。。。

  代码

 #include<cstdio>
const int N = ;
int dp,pre[N],p[N],tt[N],size[N],id[N],f[N],deep[N],go[N],L[N],R[N];
int cnt,gf[N],i,n,e[N],a,b,v[N],s[N],sum[N];
void link(int x,int y)
{
dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
}
void dfs1(int x,int y)
{
size[x]=;
int i=p[x];
while (i)
{
if (tt[i]!=y)
{
f[tt[i]]=x;
deep[tt[i]]=deep[x]+;
dfs1(tt[i],x);
size[x]+=size[tt[i]];
if (size[tt[i]]>size[go[x]]) go[x]=tt[i];
}
i=pre[i];
}
}
void dfs2(int x,int y)
{
L[x]=++cnt;
id[cnt]=x;
gf[x]=y;
if (go[x]) dfs2(go[x],y);
int i=p[x];
while (i)
{
if (deep[tt[i]]>deep[x])
if (tt[i]!=go[x])
dfs2(tt[i],tt[i]);
i=pre[i];
}
R[x]=cnt;
}
void clean(int x)
{
if (v[x])
{
v[x]=;
s[x]=sum[x];
v[*x]=;
v[*x+]=;
}
}
void change(int x,int a,int b,int l,int r,int c)
{
clean(x);
if ((a<=l)&&(r<=b))
{
if (c) v[x]=;else s[x]=;
return;
}
int m=(l+r)>>;
if (a<m) change(*x,a,b,l,m,c);
if (m<b) change(*x+,a,b,m,r,c);
clean(*x);clean(*x+);
s[x]=s[*x]+s[*x+];
}
void gao(int a,int b)
{
while ()
{
if (deep[gf[a]]<deep[gf[b]]) a^=b^=a^=b;
if (gf[a]==gf[b])
{
if (deep[a]<deep[b]) a^=b^=a^=b;
change(,L[b]-,L[a],,n,);
return;
}
else
{
change(,L[gf[a]]-,L[a],,n,);
a=f[gf[a]];
}
}
}
void get(int x,int l,int r)
{
v[x]=s[x]=;
if (r-l==)
{
sum[x]=e[id[r]];
return;
}
int m=(l+r)>>;
get(*x,l,m);
get(*x+,m,r);
sum[x]=sum[*x]+sum[*x+];
}
int main()
{
int test;
scanf("%d",&test);
while (test--)
{
scanf("%d",&n);dp=cnt=;
for (i=;i<=n;i++)
{
scanf("%d",&e[i]);
p[i]=go[i]=deep[i]=gf[i]=f[i]=;
}
for (i=;i<n;i++)
{
scanf("%d%d",&a,&b);
link(a,b);link(b,a);
}
dfs1(,);
dfs2(,);
get(,,n);
int m;
scanf("%d",&m);
for (i=;i<=m;i++)
{
int typ;
scanf("%d",&typ);
if (typ==)
{
scanf("%d%d",&a,&b);
gao(a,b);
}
else
{
scanf("%d",&a);
if (typ==)
change(,L[a]-,L[a],,n,);
else
change(,L[a]-,R[a],,n,);
}
clean();
printf("%d\n",s[]);
}
}
}

I.Exploration

  题意是给一张图,其中有一些边为双向,有一些为单向,问是否存在一个起点,其能走出一条路径,至少能到达一个起点以外的点,且最终能回到起点,注意路一旦经过,就会坍塌。

  可以先将双向边连接的点用并查集并起来,如果一个集合中的点不构成一颗树,则说明存在环,那么这个环就可以视为答案,输出YES,如果所有集合都是生成树,那么接着考虑有向边,如果有向边连接的两个点属于同一集合,则存在环经过该有向边,可以直接输出YES,否则则将两端点所在的集合连边,最后进行一边拓扑排序,判断是否存在环,如果存在环输出YES,否则输出NO

代码

 #include<cstdio>
#include<queue>
using namespace std;
const int N = ;
int f[N],n,m1,m2,l[N],r[N],i,a,b,id[N],cnt,rd[N];
int dp,pre[N],p[N],tt[N],vis[N];
queue<int> Q;
int gf(int x)
{
int t,p;
p=x;
while (p!=f[p]) p=f[p];
while (x!=p)
{
t=f[x];
f[x]=p;
x=t;
}
return p;
}
void link(int x,int y)
{
dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
}
int main()
{
int test;
scanf("%d",&test);
while (test--)
{
scanf("%d%d%d",&n,&m1,&m2);
for (i=;i<=m1;i++)
scanf("%d%d",&l[i],&r[i]);
for (i=;i<=m2;i++)
scanf("%d%d",&l[m1+i],&r[m1+i]);
dp=;
for (i=;i<=n;i++) f[i]=i,id[i]=rd[i]=p[i]=vis[i]=;
for (i=;i<=m1;i++)
{
if (l[i]==r[i]) continue;
a=gf(l[i]);b=gf(r[i]);
if (a==b) break;
f[a]=b;
}
if (i<=m1)
{
printf("YES\n");
continue;
}
cnt=;
for (i=;i<=n;i++)
{
if (id[gf(i)]==) id[gf(i)]=++cnt;
id[i]=id[gf(i)];
}
for (i=m1+;i<=m1+m2;i++)
{
if (l[i]==r[i]) continue;
if (id[l[i]]==id[r[i]]) break;
link(id[l[i]],id[r[i]]);
rd[id[r[i]]]++;
}
if(i<=m1+m2)
{
printf("YES\n");
continue;
}
for (i=;i<=cnt;i++)
if (rd[i]==) Q.push(i);
while (!Q.empty())
{
int x=Q.front();Q.pop();
i=p[x];
while (i)
{
rd[tt[i]]--;
if (!rd[tt[i]]) Q.push(tt[i]);
i=pre[i];
}
}
for (i=;i<=cnt;i++)
if (rd[i]) break;
if (i<=cnt) printf("YES\n");else printf("NO\n");
}
}

J.GCD

题意是给一些询问,每次询问区间[L,R]的gcd是多少,且得到的答案为w,问能否构造出一个使得所有询问都满足的答案,如果存在多个方案,输出一个序列和最小的方案。

一开始设序列所有数字为1,对于一个询问[L,R]我们可以把区间[L,R]中的数字ai变为lcm(ai,w),这样就可以构造出一个序列,最后用询问来验证一下这个序列是否合法,如果合法,那么该序列即为最小方案,若不合法即为无解。

  代码

 #include<cstdio>
const int N = ;
int n,m,i,j,l[N],r[N],w[N],test,tmp;
long long a[N];
long long gcd(long long a,long long b)
{
if (b==) return a;
return gcd(b,a%b);
}
int main()
{
scanf("%d",&test);
while (test--)
{
scanf("%d%d",&n,&m);
for (i=;i<=m;i++)
scanf("%d%d%d",&l[i],&r[i],&w[i]);
for (i=;i<=n;i++)
{
a[i]=;
for (j=;j<=m;j++)
if ((l[j]<=i)&&(i<=r[j]))
{
a[i]=(a[i]*w[j])/gcd(a[i],w[j]);
if (a[i]>) break;
}
if (a[i]>) break;
}
if (i<=n)
printf("Stupid BrotherK!\n");
else
{
for (i=;i<=m;i++)
{
tmp=;
for (j=l[i];j<=r[i];j++)
tmp=gcd(tmp,a[j]);
if (tmp!=w[i]) break;
}
if (i<=m) printf("Stupid BrotherK!\n");
else
{
for (i=;i<n;i++)
printf("%I64d ",a[i]);printf("%I64d\n",a[n]);
}
}
}
}

个人训练记录-赛码"bestcoder"杯中国大学生程序设计冠军赛的更多相关文章

  1. ACM 五一杭电赛码"BestCoder"杯中国大学生程序设计冠军赛小记

    对于这项曾经热爱的竞赛,不得不说这是我最后一年参加ACM比赛了,所以要珍惜每一次比赛的机会. 五一去杭电参加了赛码"BestCoder"杯中国大学生程序设计冠军赛,去的队伍包括了今 ...

  2. HDU 5215 BestCoder"杯中国大学生程序设计冠军赛” 边双连通分量取出子图+二分染色判图内奇偶环

    Cycle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Sub ...

  3. 赛码网算法: 军训队列( python实现 )

    军训队列 题目描述某大学开学进行军训队列训练,将学生从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列剩下的依次向前靠拢,再从头开始进行一至三报数,凡报到三的出 ...

  4. 赛码网算法: 上台阶 ( python3实现 、c实现)

    上台阶 题目描述 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?注:规定从一级到一级有0种走法. 输入输入数据首先包含一个整数n(1<=n<=1 ...

  5. 台州学院maximum cow训练记录

    前队名太过晦气,故启用最大牛 我们的组队大概就是18年初,组队阵容是17级生詹志龙.陶源和16级的黄睿博. 三人大学前均无接触过此类竞赛,队伍十分年轻.我可能是我们队最菜的,我只是知道的内容最多,靠我 ...

  6. 并查集+拓扑排序 赛码 1009 Exploration

    题目传送门 /* 题意:无向图和有向图的混合图判环: 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前, 两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为 ...

  7. 递推DP 赛码 1005 Game

    题目传送门 /* 递推DP:官方题解 令Fi,j代表剩下i个人时,若BrotherK的位置是1,那么位置为j的人是否可能获胜 转移的时候可以枚举当前轮指定的数是什么,那么就可以计算出当前位置j的人在剩 ...

  8. 数学 赛码 1010 GCD

    题目传送门 /* 数学:官方题解 首先,数组中每个元素至少是1 然后对于任意一个询问Li, Ri, Ansi, 说明Li ~ Ri中的元素必定是Ansi的倍数,那么只需将其与Ansi取最小公倍数即可 ...

  9. 贪心 赛码 1001 Movie

    题目传送门 /* 贪心:官方题解: 首先我们考虑如何选择最左边的一个区间 假设最左边的区间标号是i, 那选择的另外两个区间的左端点必定要大于Ri 若存在i之外的j, 满足Rj<Ri, 那么另外两 ...

随机推荐

  1. KVO 键值观察者

    KVO(键值观察者) //监听的创建 -(id)initChildren:(Person *)person { self = [super init]; if (self != nil) { //拥有 ...

  2. Spring MVC如何配置OpenSessionInViewInterceptor并结合Hibernate使用

    最近在使用Spring MVC开发,在使用Hibernate查询数据库的时候因为Session在DAO层被关闭导致延迟加载的属性在使用时报错,经过查询网上资料将解决方法整理如下: 我使用的是OpenS ...

  3. 在list_*页面显示出一级栏目下的所有二级栏目

    <ul class="nav nav-pills nav-stacked"> {dede:channelartlist typeid='1,1'} <div cl ...

  4. js中的数据类型

    JS中的数据类型: ——数字  (number)NaN ——字符串(string) ——布尔  (boolean)——函数  (function)     也是对象的一种 ——对象  (object) ...

  5. Android:Activity生命周期

    Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack). 栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新 ...

  6. python字符串前面加r

    在Python的string前面加上'r', 是为了告诉编译器这个string是个raw string,不要转意backslash '\' . 例如,\n 在raw string中,是两个字符,\和n ...

  7. ehcache memcache redis 三大缓存

    最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考!  Ehcache 在Java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS ...

  8. C fgetc

    格式:int fgetc(FILE *stream); 这个函数的返回值,是返回所读取的一个字节.如果读到文件末尾或者读取出错时返回EOF. 位于stdio.h中.从流中读取字符,即从stream所指 ...

  9. Java POI导入导出Excel

    1.异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的poi的相关jar ...

  10. Apache Storm源码阅读笔记

    欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比 ...