【NOI赛前训练】——专项测试1·网络流
T1:
题目大意:
给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列变为不下降数列的最小花费。
题解:
第一部分(上下界最小费用可行流):
设$h_0=-inf,h_{n+1}=inf$,令$a$为$h$的差分数组,即$a_i=h_{i}-h_{i-1}$。考虑当对于区间$[l,r]$操作时(比如+1),相当于$a_{r+1}$减少1,$a_{l}$增加1。若将$a$数组看做点集,这个变化相当于从$r+1$到$l$的一条流量为$1$的有向边,反之(-1)亦然。
显然问题相当于把$a$数组元素均变为 不为0。那么我们由S向$a_{i}>0$的位置连$flow=[0,a_{i}],cost=0$的边,表示${i}$可以减少流量上下界,对于$a_{i}<0$的位置,我们至少要使其增加$-a_i$所以我们向$T$连$flow=[-a_i,inf],cost=0$的边。对于每个操作我们由于可无限使用我们就给所有合法位置连$flow=[0,inf],cost=c_{i}$的边,然后我们可以跑一个上下界解决问题。
等等,这样的确解决了问题,不过我们观察一下这个图,会发现上下界源点只连向了$T$,而上下界汇点只被那些$a_{i}<0$的点连接到。
我们把这个图转化一下,会发现对于上面的建图方式,我们只把$a_{i}<0$的边建成$flow=-a_i,cost=0$的边即可,根本不需要跑上下界。这就是另外一种思考方式。
第二部分(最小费用最大流):
我们考虑那些$a_{i}<0$的点变为$0$一定比使其变为任一整数更优秀,同时这也是我们的判断有没有解的依据。
所以我们就直接由$a_{i}<0$的点连向$T$的边为$flow=-a_i,cost=0$即可,如果所有连向$T$的边都流满,说明有解,同时由于上述性质,一定是最优解。
不过这两个时间复杂度并没有太大区别。
代码:
#include "bits/stdc++.h" using namespace std; #define inf 0x3f3f3f3f inline int read() {
int s=,k=;char ch=getchar ();
while (ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while (ch>&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
} const int N=1e3+; struct edges {
int v,cap,cost;edges *pair,*last;
}edge[N*N],*head[N];int cnt; inline void push(int u,int v,int cap,int cost) {
edge[++cnt]=(edges){v,cap,cost,edge+cnt+,head[u]},head[u]=edge+cnt;
edge[++cnt]=(edges){u,,-cost,edge+cnt-,head[v]},head[v]=edge+cnt;
} int S,T,ss,tt,n,fl,m;
int piS,vis[N];
long long cost; inline int aug(int x,int w) {
if (x==T) return cost+=1ll*piS*w,fl+=w,w;
vis[x]=true;
int ret=;
for (edges *i=head[x];i;i=i->last)
if (i->cap&&!i->cost&&!vis[i->v]) {
int flow=aug(i->v,min(i->cap,w));
i->cap-=flow,i->pair->cap+=flow,ret+=flow,w-=flow;
if (!w) break;
}
return ret;
} inline bool modlabel() {
static int d[N];
memset(d,0x3f,sizeof d);d[T]=;
static deque<int> q;q.push_back(T);
int dt;
while (!q.empty()) {
int x=q.front();q.pop_front();
for (edges *i=head[x];i;i=i->last)
if (i->pair->cap&&(dt=d[x]-i->cost)<d[i->v])
(d[i->v]=dt)<=d[q.size()?q.front():]
?q.push_front(i->v):q.push_back(i->v);
}
for (int i=S;i<=T;++i)
for (edges *j=head[i];j;j=j->last)
j->cost+=d[j->v]-d[i];
piS+=d[S];
return d[S]<inf;
} inline void solve() {
piS = cost = ;
while(modlabel())
do memset(vis,,sizeof vis);
while(aug(S, inf));
} int h[N],a[N],c[N],l[N],typ[N];
int f[N],g[N]; int main(){
n=read(),m=read();
for (int i=;i<=n;++i)
h[i]=read();
for (int i=n;i>;--i)
h[i]=h[i]-h[i-];
h[]=inf,h[n+]=inf;
ss=n+,tt=ss+,T=tt+;
char opt[];
for (int i=;i<=m;++i) {
scanf("%s",opt),l[i]=read(),c[i]=read();
typ[i]=opt[]=='+';
}
++n;
for (int i=;i<=n;++i)
if (h[i] > )
push(ss,i,h[i],);
else if(h[i]<) push(i,tt,inf,),a[i]=-h[i],a[tt]+=h[i],push(i,T,a[i],);
push(tt,ss,inf,);
push(S,tt,-a[tt],);
memset(f,0x3f,sizeof(f));
f[]=;
memcpy(g,f,sizeof g);
for (int j=;j<=m;++j)
for (int k=l[j];k<=n;k+=l[j])
if(typ[j])
for (int i=n-;i>=l[j];--i)
f[i]=min(f[i],f[i-l[j]]+c[j]);
else
for (int i=n-;i>=l[j];--i)
g[i]=min(g[i],g[i-l[j]]+c[j]);
// puts()
for (int j=;j<=m;++j)
if (typ[j]){
if (f[l[j]]==c[j])
for (int i=l[j]+;i<=n;++i)
push(i,i-l[j],inf,c[j]);
}else
if (g[l[j]]==c[j])
for (int i=;i+l[j]<=n;++i)
push(i,i+l[j],inf,c[j]);
solve();
if (fl==-a[tt])
printf("%lld\n",cost);
else puts("-1");
}
上下界
#include "bits/stdc++.h" using namespace std; #define inf 0x3f3f3f3f inline int read() {
int s=,k=;char ch=getchar ();
while (ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while (ch>&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
} const int N=1e3+; struct edges {
int v,cap,cost;edges *pair,*last;
}edge[N*N],*head[N];int cnt; inline void push(int u,int v,int cap,int cost) {
edge[++cnt]=(edges){v,cap,cost,edge+cnt+,head[u]},head[u]=edge+cnt;
edge[++cnt]=(edges){u,,-cost,edge+cnt-,head[v]},head[v]=edge+cnt;
} int S,T,ss,tt,n,fl,m;
int piS,vis[N];
long long cost; inline int aug(int x,int w) {
if (x==T) return cost+=1ll*piS*w,fl+=w,w;
vis[x]=true;
int ret=;
for (edges *i=head[x];i;i=i->last)
if (i->cap&&!i->cost&&!vis[i->v]) {
int flow=aug(i->v,min(i->cap,w));
i->cap-=flow,i->pair->cap+=flow,ret+=flow,w-=flow;
if (!w) break;
}
return ret;
} inline bool modlabel() {
static int d[N];
memset(d,0x3f,sizeof d);d[T]=;
static deque<int> q;q.push_back(T);
int dt;
while (!q.empty()) {
int x=q.front();q.pop_front();
for (edges *i=head[x];i;i=i->last)
if (i->pair->cap&&(dt=d[x]-i->cost)<d[i->v])
(d[i->v]=dt)<=d[q.size()?q.front():]
?q.push_front(i->v):q.push_back(i->v);
}
for (int i=S;i<=T;++i)
for (edges *j=head[i];j;j=j->last)
j->cost+=d[j->v]-d[i];
piS+=d[S];
return d[S]<inf;
} inline void solve() {
piS = cost = ;
while(modlabel())
do memset(vis,,sizeof vis);
while(aug(S, inf));
} int h[N],a[N],c[N],l[N],typ[N];
int f[N],g[N]; int main(){
n=read(),m=read();
for (int i=;i<=n;++i)
h[i]=read();
for (int i=n;i>;--i)
h[i]=h[i]-h[i-];
h[]=inf,h[n+]=inf;
// ss=n+2,tt=ss+1,T=tt+1;
char opt[];
for (int i=;i<=m;++i) {
scanf("%s",opt),l[i]=read(),c[i]=read();
typ[i]=opt[]=='+';
}
++n;T=n+;
for (int i=;i<=n;++i)
if (h[i] > )
push(S,i,h[i],);
else if(h[i]<) push(i,T,-h[i],),a[tt]+=h[i];//,push(i,T,a[i],0);
// push(tt,ss,inf,0);
// push(S,tt,-a[tt],0);
memset(f,0x3f,sizeof(f));
f[]=;
memcpy(g,f,sizeof g);
for (int j=;j<=m;++j)
for (int k=l[j];k<=n;k+=l[j])
if(typ[j])
for (int i=n-;i>=l[j];--i)
f[i]=min(f[i],f[i-l[j]]+c[j]);
else
for (int i=n-;i>=l[j];--i)
g[i]=min(g[i],g[i-l[j]]+c[j]);
for (int j=;j<=m;++j)
if (typ[j]){
if (f[l[j]]==c[j])
for (int i=l[j]+;i<=n;++i)
push(i,i-l[j],inf,c[j]);
}else
if (g[l[j]]==c[j])
for (int i=;i+l[j]<=n;++i)
push(i,i+l[j],inf,c[j]);
solve();
// printf("%d %d\n",fl);
if (fl==-a[tt])
printf("%lld\n",cost);
else puts("-1");
}
最大流
T2:
题目大意:
emmm,由于并没在网上找到这题,题意我就不发了,仅供自己记忆233。
题解:
这是一道及其简单的模拟网络流最小割的静态仙人掌。(完全不需要题意……各位就知道了)
没什么好说的……
tajan缩点,树剖+线段树维护,以及8k代码。没了。
代码:
#include "bits/stdc++.h" inline int read(){
int s=,k=;char ch=getchar();
while (ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while (ch>&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
} using namespace std; #define inf 0x7fffffff const int N=5e5+,M=1e6+; struct node {
int a,b,w,id;
}line[N]; struct edges{
int v,w;edges *last;node *id;
}edge[N<<],*head[N];int cnt=; inline void push(int u,int v,int w){
edge[++cnt]=(edges) {v,w,head[u]},head[u]=edge+cnt;
} int bccno[N],bcc_cnt,low[N],dfn[N],idx,stk[N],top,size[N],aa[N];
bool vis[N],used[N]; inline void tarjan(int x,int fa) {
low[x]=dfn[x]=++idx;
stk[++top]=x;
for (edges *i=head[x];i;i=i->last) if(i->v!=fa) {
if(!dfn[i->v])
tarjan(i->v,x),
low[x]=min(low[x],low[i->v]);
else low[x]=min(low[x],dfn[i->v]);
}
if(dfn[fa]<low[x]) {
bcc_cnt++;int t;
do t=stk[top--],bccno[t]=bcc_cnt,++size[bcc_cnt];while (t!=x);
}
} struct Tree {
int val;
Tree *lc,*rc;
inline void update() {
val=min(lc->val,rc->val);
}
}tree[N<<];int cnt_tree; struct Segment{
Tree *root; inline void build(Tree *&u,int l,int r) {
if(!u) u=tree+cnt_tree,cnt_tree++;
if(l==r) return void(u->val=aa[l]);
int mid=l+r>>;
build(u->lc,l,mid);
build(u->rc,mid+,r);
u->update();
} inline void change(Tree *u,int l,int r,int x,int val){
if(l==r) return void(u->val=val);
int mid=l+r>>;
if (x>mid) change(u->rc,mid+,r,x,val);
else change(u->lc,l,mid,x,val);
u->update();
} inline int query(Tree *u,int l,int r,int x,int y) {
if (x>y) return inf;
if(x<=l&&r<=y) return u->val;
int mid=l+r>>,ret=0x7fffffff;
if (y>mid) ret=query(u->rc,mid+,r,x,y);
if(x<=mid) ret=min(ret,query(u->lc,l,mid,x,y));
return ret;
}
}seg[N],rt,sft; int n,m,pos[N];
vector<int> bcc[N],val[N]; inline void dfs(int x) {
vis[x]=true;
bcc[bccno[x]].push_back(x);
pos[x]=bcc[bccno[x]].size();
for (edges *i=head[x];i;i=i->last) {
if (!vis[i->v]&&bccno[x]==bccno[i->v]){
i->id->id=pos[x],val[bccno[x]].push_back(i->w),used[i-edge]=used[(i-edge)^]=true;
dfs(i->v);
}
}
if(pos[x]==size[bccno[x]])
for (edges *i=head[x];i;i=i->last) if (!used[i-edge]&&bcc[bccno[x]][]==i->v)
i->id->id=pos[x],val[bccno[x]].push_back(i->w);
} int heavy[N],sz[N],fat[N],gra[N],deep[N],tid[N],rid[N],up[N],down[N],upb[N]; inline void dfs(int x,int fa){
sz[x]=;
for (edges *i=head[x];i;i=i->last) if(i->v!=fa){
deep[i->v]=deep[x]+,dfs(i->v,x);
sz[x]+=sz[i->v];
if (sz[heavy[x]]<sz[i->v])
heavy[x]=i->v;
}
fat[x]=fa;
} inline void dfs(int x,int fa,int gr) {
gra[x]=gr;
tid[x]=++tid[];
rid[tid[]]=x; if (heavy[x]) {
dfs(heavy[x],x,gr);
for (edges *i=head[x];i;i=i->last) if (i->v!=fa&&i->v!=heavy[x])
dfs(i->v,x,i->v);
for (edges *i=head[x];i;i=i->last) if (i->v!=fa)
aa[tid[i->v]]=i->w;
}
} inline int query(int x,int l,int r){
if (l==r) return inf;
if (l>r) swap(l,r);
return seg[x].query(seg[x].root,,size[x],l,r-)+
min(seg[x].query(seg[x].root,,size[x],r,n),
seg[x].query(seg[x].root,,size[x],,l-)) ;
} inline void sdfs(int x) {
for (edges *i=head[x];i;i=i->last) if(i->v!=fat[x]){
up[i->v]=deep[bccno[i->id->a]]>deep[bccno[i->id->b]]?i->id->a:i->id->b;
upb[i->v]=i->id->a^i->id->b^up[i->v];
sdfs(i->v);
if (i->v==heavy[x])
down[x]=deep[bccno[i->id->a]]<deep[bccno[i->id->b]]?i->id->a:i->id->b;
if (i->v==heavy[x]&&fat[x]) {
int l=pos[up[x]],r=pos[down[x]];
aa[tid[x]]=query(x,l,r);
}
}
} inline void change(int id,int f) {
int a=line[id].a,b=line[id].b;
if (bccno[a]^bccno[b]) {
a=bccno[a],b=bccno[b];
if (deep[a]<deep[b]) swap(a,b);
rt.change(rt.root,,bcc_cnt,tid[a],f);
}else {
b=bccno[a];
seg[b].change(seg[b].root,,size[b],line[id].id,f);
if (up[b]&&down[b]) {
int l=pos[up[b]],r=pos[down[b]],val=query(b,l,r);
sft.change(sft.root,,bcc_cnt,tid[b],val);
}
}
} inline int query (int x,int y){
int ret=inf;
if (bccno[x]==bccno[y]) {
int l=pos[x],r=pos[y];
return query(bccno[x],l,r);
}
int a=x,b=y;
x=bccno[x],y=bccno[y];
while (gra[x]!=gra[y]) {
if (deep[gra[x]]<deep[gra[y]]) swap(x,y),swap(a,b);
ret=min(ret,rt.query(rt.root,,bcc_cnt,tid[gra[x]],tid[x]));
int l,r;
l=pos[a],r=pos[up[x]];
ret=min(ret,query(x,l,r));
a=upb[gra[x]];
if (gra[fat[x]]==gra[x]) {
x=fat[x];
ret=min(ret,sft.query(sft.root,,bcc_cnt,tid[gra[x]],tid[x]));
}
x=fat[gra[x]];
}
if (deep[x]>deep[y]) swap(x,y),swap(a,b);
if (x^y) {
ret=min(ret,rt.query(rt.root,,bcc_cnt,tid[x]+,tid[y]));
int l=pos[b],r=pos[up[y]];
ret=min(ret,query(y,l,r));
ret=min(ret,sft.query(sft.root,,bcc_cnt,tid[x]+,tid[y]-));
l=pos[a],r=pos[down[x]];
ret=min(ret,query(x,l,r));
}else
ret=min(ret,query(x,pos[a],pos[b]));
return ret;
} int main(){
n=read(),m=read();
for (int i=;i<=m;++i) {
int a=read(),b=read(),w=read();
line[i]=(node){a,b,w};
push(a,b,w),push(b,a,w);
edge[cnt].id=edge[cnt-].id=line+i;
}
tarjan(,);
for (int i=;i<=n;++i)
if(!vis[i]) dfs(i); for (int i=;i<=bcc_cnt;++i) {
if (size[i]==) val[i].push_back(inf);
for (int j=;j<=size[i];++j)
aa[j]=val[i][j-];
seg[i].build(seg[i].root,,size[i]);
}
memset(head,,sizeof(head));
cnt=;
for (int i=;i<=m;++i) {
int a,b,w=line[i].w;
if ((a=bccno[line[i].a])!=(b=bccno[line[i].b]))
push(a,b,w),push(b,a,w),edge[cnt].id=edge[cnt-].id=line+i;
}
dfs(,);
dfs(,,);
aa[]=;
rt.build(rt.root,,bcc_cnt);
memset(aa,,sizeof aa); int Q=read(),typ,a,b;
sdfs();
sft.build(sft.root,,bcc_cnt);
while (Q--) {
typ=read(),a=read(),b=read();
if (typ) change(a,b);
else printf("%d\n",query(a,b));
}
}
生平第一棵仙人掌
T3
题目大意:
$n*n$的棋盘,有一些位置可以放棋子,有一些已经放了棋子,有一些什么都没有,也不能放,要求放置以后满足:第i行和第i列的棋子数相同,同时每行的棋子数占总数比例小于$\frac{A}{B}$。求最多可以放多少,无解则输出$impossible$。
题解:
Orz一发大佬——传送门。
先把整张图放满,题目就转化为最少删多少点就合法。
我们用$numx$来记录每行可以放的和已经放棋子总数,$numy$记录每列。从$S$向第i行连流量为$numx_i$的0费用边,从第j列向$T$连流量为$numy_j$的边。先不考虑怎么构建中间的图,在不考虑$\frac{A}{B}$的情况,我们需要判断流量合法的,我们可以让到$T$的边都满流意味着选了和没选的可以构成全集。
我们对于可以放棋子的地方$(x,y)$,由第$x$行到第$y$列连$flow=1,cost=1$的边,表示将这个点删去的所需价值。
考虑后一个限制。
我们可以枚举每一行最多放置的棋子个数$f$,然后我们从第$i$行向第$i$列连一条$flow=f,cost=0$的边。表示第i行选了最多保留$f$个棋子,第$i$列保留棋子等同于这条边的流量,因为其他连向第$i$列的边都是要费用的,对第$i$行来讲其他的出边也是要费用的,而那些要费用的边就是删去的集合。
然后判断一下当前解是否合法即可。
代码:
#include "bits/stdc++.h" using namespace std; #define inf 0x3f3f3f3f inline int read() {
int s=,k=;char ch=getchar ();
while (ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while (ch>&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
} const int N=; struct edges {
int v,cap,cost;edges *pair,*last;
}edge[N*N],*head[N];int cnt; inline void push(int u,int v,int cap,int cost) {
edge[++cnt]=(edges){v,cap,cost,edge+cnt+,head[u]},head[u]=edge+cnt;
edge[++cnt]=(edges){u,,-cost,edge+cnt-,head[v]},head[v]=edge+cnt;
} int S,T,n,fl,ans;
int piS,vis[N];
int cost; inline int aug(int x,int w) {
if (x==T) return cost+=1ll*piS*w,fl+=w,w;
vis[x]=true;
int ret=;
for (edges *i=head[x];i;i=i->last)
if (i->cap&&!i->cost&&!vis[i->v]) {
int flow=aug(i->v,min(i->cap,w));
i->cap-=flow,i->pair->cap+=flow,ret+=flow,w-=flow;
if (!w) break;
}
return ret;
} inline bool modlabel() {
static int d[N];
memset(d,0x3f,sizeof d);d[T]=;
static deque<int> q;q.push_back(T);
int dt;
while (!q.empty()) {
int x=q.front();q.pop_front();
for (edges *i=head[x];i;i=i->last)
if (i->pair->cap&&(dt=d[x]-i->cost)<d[i->v])
(d[i->v]=dt)<=d[q.size()?q.front():]
?q.push_front(i->v):q.push_back(i->v);
}
for (int i=S;i<=T;++i)
for (edges *j=head[i];j;j=j->last)
j->cost+=d[j->v]-d[i];
piS+=d[S];
return d[S]<inf;
} inline void solve() {
piS = cost = ;
while(modlabel())
do memset(vis,,sizeof vis);
while(aug(S, inf));
} char mp[N][N];
int numx[N],numy[N],A,B; int main() {
n=read(),A=read(),B=read();
T=n<<|;
int used=,sum=;
ans=-;
for (int i=;i<=n;++i) {
scanf("%s",mp[i]+);
for (int j=;j<=n;++j)
if(mp[i][j]=='C'||mp[i][j]=='.') {
++sum,++numx[i],++numy[j];
used+=mp[i][j]=='C';
}
}
for (int flow=;flow<=n;++flow) {
memset(head,,sizeof head);
cnt=;fl=;
for (int i=;i<=n;++i) {
push(S,i,numx[i],);
push(i+n,T,numy[i],);
push(i,i+n,flow,);
for (int j=;j<=n;++j)
if(mp[i][j]=='.')
push(i,j+n,,);
}
solve();
if (fl==sum&&flow*B<=(sum-cost)*A)
ans=max(ans,sum-cost);
}
if (ans==-) puts("impossible");
else printf("%d\n",ans-used);
}
t3
【NOI赛前训练】——专项测试1·网络流的更多相关文章
- [NOI赛前训练]——专项测试3·数学
由于并不想写T1和T2的题解……所有只有T3的题解了. T3 由于内部题就只写题解了. 好吧,我是一点都不想写…… 说一下这zz题解哪里写错了吧…… ……不想写…… 就说一个吧…… $n-\frac{ ...
- Caffe初试(二)windows下的cafee训练和测试mnist数据集
一.mnist数据集 mnist是一个手写数字数据库,由Google实验室的Corinna Cortes和纽约大学柯朗研究院的Yann LeCun等人建立,它有60000个训练样本集和10000个测试 ...
- caffe学习系列(2):训练和测试自己的图片
参考:http://www.cnblogs.com/denny402/p/5083300.html 上述主要介绍的是从自己的原始图片转为lmdb数据,再到训练.测试的整个流程(另外可参考薛开宇的笔记) ...
- windows+caffe(四)——创建模型并编写配置文件+训练和测试
1.模型就用程序自带的caffenet模型,位置在 models/bvlc_reference_caffenet/文件夹下, 将需要的两个配置文件,复制到myfile文件夹内 2. 修改solver. ...
- Caffe学习系列(12):训练和测试自己的图片
学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试模型的整个流程. 一.准备数据 有条件的同学,可以去 ...
- 【转】微信小程序专项测试
微信小程序专项测试 by 云层 原文地址: http://mp.weixin.qq.com/s?__biz=MzA4NDIzNTIzNA==&mid=2654370226&idx=1& ...
- 不要怂,就是GAN (生成式对抗网络) (四):训练和测试 GAN
在 /home/your_name/TensorFlow/DCGAN/ 下新建文件 train.py,同时新建文件夹 logs 和文件夹 samples,前者用来保存训练过程中的日志和模型,后者用来保 ...
- app专项测试自动化测试方法思路与实现
秉着个人意愿打算把python+rf接口自动进行彻底结束再做些其它方面的输出~但事与愿违,但领导目前注重先把专项测试方面完成,借此,先暂停python+rf(主要是与Jenkins集成+导入DB+微信 ...
- 转 Caffe学习系列(12):训练和测试自己的图片
学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试模型的整个流程. 一.准备数据 有条件的同学,可以去 ...
随机推荐
- 《深入理解JAVA虚拟机》笔记1
java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...
- 运行Applet程序
[操作方法1:]① 编辑源程序welcome.java.② 编译程序 javac welcome.java③ 将Applet嵌入HTML网页.方法是,用记事本创建一个文件,文件内容如下:<app ...
- 如何用Go语言实现汉诺塔算法
package main import ( "fmt" ) func print(n int,x rune,y rune)(){ fmt.Printf("moving d ...
- IDEA 下新建 Hibernate 项目
Hibernate 概述 什么是 Hibernate 一个 Java 领域的持久化框架 一个 Java 领域的ORM 框架 什么是持久化 持久化是指把对象永久保存到数据库中 持久化包括和数据库相关的各 ...
- unity零基础开始学习做游戏(三)鼠标输入,来个虚拟摇杆怎么样?
-------小基原创,转载请给我一个面子 现在移动游戏越来越火,大家都拿手机平板玩游戏,没有键盘和手柄输入,所以就不得不看看虚拟摇杆怎么搞?(小基对于没有实体反馈不是很喜欢呢) 首先要清楚,鼠标操作 ...
- Windows 10创意者更新ISO发布!官方下载
http://news.mydrivers.com/1/526/526719.htm 去年7月份,微软面向Windows 10推出了“周年更新”,让系统变得更加稳定好用.今天,Windows 10迎来 ...
- Android Studio 2.3 instant run与miui冲突问题的解决
Android Studio最近发布的2.3版本,由于这个版本改进后的Instant Run功能和很多国内ROM存在兼容问题,所以导致不得不做一些妥协策略,具体在小米Rom上,就是把小米rom的调试定 ...
- 前端Mahsup异步依赖方式不能做业务数据依赖
很久之前流行mashup方式做内容集成,之前为了IP定位的方便,引用了第三方的IP定位JS,然后根据其内容与服务器同步地址数据并写入Cookie,可是这种方式一旦,第三方的库反应缓慢时,就会出现大问题 ...
- App免费推广途径概要
说在前面的话:免费其实挺花功夫的,所有的营销的前提是产品和服务是值得推荐的. 1.技术操作维度:ASO,SEO, ASO简单介绍:http://baike.baidu.com/subview/1368 ...
- Ubuntu 16.04开启SSH服务
安装: sudo apt-get install openssh-server 启动: sudo service ssh start 查询服务启动状态: sudo ps -e | grep ssh 或 ...