8.20
This commit is contained in:
parent
5289827262
commit
cead523ff0
|
@ -1,3 +1,4 @@
|
||||||
|
//https://blog.csdn.net/anvt77205/article/details/102208781
|
||||||
#include<cstdio>
|
#include<cstdio>
|
||||||
#include<string.h>
|
#include<string.h>
|
||||||
#include<algorithm>
|
#include<algorithm>
|
||||||
|
@ -15,8 +16,6 @@ int id;
|
||||||
int nid[N];
|
int nid[N];
|
||||||
int now;
|
int now;
|
||||||
bool no[N];
|
bool no[N];
|
||||||
int ans[N];
|
|
||||||
int len;
|
|
||||||
void add(int u,int v)
|
void add(int u,int v)
|
||||||
{
|
{
|
||||||
to[++cnt]=v;
|
to[++cnt]=v;
|
||||||
|
@ -29,14 +28,14 @@ void initialise(int n)
|
||||||
tot=0;
|
tot=0;
|
||||||
top=0;
|
top=0;
|
||||||
id=0;
|
id=0;
|
||||||
len=0;
|
|
||||||
memset(b,0,sizeof(bool)*(n+1));
|
memset(b,0,sizeof(bool)*(n+1));
|
||||||
memset(no,0,sizeof(bool)*(n+1));
|
memset(no,0,sizeof(bool)*(n+1));
|
||||||
memset(h,0,sizeof(int)*(n+1));
|
memset(h,0,sizeof(int)*(n+1));
|
||||||
|
memset(dfn,0,sizeof(int)*(n+1));//WA ¸ù¾ÝËüÅжÏÓÐÎÞ¾¹ý
|
||||||
}
|
}
|
||||||
void tarjan(int u)
|
void tarjan(int u)
|
||||||
{
|
{
|
||||||
// printf("%d ",u);
|
// printf("%d:",u);
|
||||||
int v;
|
int v;
|
||||||
dfn[u]=++tot;
|
dfn[u]=++tot;
|
||||||
low[u]=tot;
|
low[u]=tot;
|
||||||
|
@ -45,12 +44,13 @@ void tarjan(int u)
|
||||||
for(int i=h[u]; i; i=ne[i])
|
for(int i=h[u]; i; i=ne[i])
|
||||||
{
|
{
|
||||||
v=to[i];
|
v=to[i];
|
||||||
|
// printf("%d ",v);
|
||||||
if(!dfn[v])
|
if(!dfn[v])
|
||||||
{
|
{
|
||||||
tarjan(v);
|
tarjan(v);
|
||||||
low[u]=low[u]<low[v]? low[u]:low[v];
|
low[u]=low[u]<low[v]? low[u]:low[v];
|
||||||
}
|
}
|
||||||
else
|
else if(b[v])
|
||||||
{
|
{
|
||||||
low[u]=low[u]<dfn[v]? low[u]:dfn[v];
|
low[u]=low[u]<dfn[v]? low[u]:dfn[v];
|
||||||
}
|
}
|
||||||
|
@ -58,16 +58,28 @@ void tarjan(int u)
|
||||||
if(low[u]==dfn[u])
|
if(low[u]==dfn[u])
|
||||||
{
|
{
|
||||||
id++;
|
id++;
|
||||||
now=s[top];
|
do
|
||||||
while(dfn[now]!=low[now])
|
|
||||||
{
|
{
|
||||||
nid[now]=id;
|
nid[s[top]]=id;
|
||||||
now=s[--top];
|
b[s[top]]=0;
|
||||||
b[now]=0;
|
|
||||||
}
|
}
|
||||||
b[u]=0;
|
while(s[top--]!=u&&top>0);
|
||||||
nid[u]=id;
|
// printf("\n\n");
|
||||||
}
|
}
|
||||||
|
// if(low[u]==dfn[u])
|
||||||
|
// {
|
||||||
|
// id++;
|
||||||
|
// now=s[top];
|
||||||
|
// while(dfn[now]!=low[now])
|
||||||
|
// {
|
||||||
|
// nid[now]=id;
|
||||||
|
// now=s[--top];
|
||||||
|
// b[now]=0;
|
||||||
|
// }
|
||||||
|
// top--;
|
||||||
|
// b[u]=0;
|
||||||
|
// nid[u]=id;
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
@ -82,9 +94,13 @@ int main()
|
||||||
add(u,v);
|
add(u,v);
|
||||||
}
|
}
|
||||||
//一开始放在前面,忽略了没有边的情况
|
//一开始放在前面,忽略了没有边的情况
|
||||||
for(int i=1;i<=n;i++)
|
for(int i=1; i<=n; i++)
|
||||||
{
|
{
|
||||||
add(0,i);
|
add(0,i);
|
||||||
|
// if(!dfn[i])
|
||||||
|
// {
|
||||||
|
// tarjan(i);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
tarjan(0);
|
tarjan(0);
|
||||||
for(int i=1; i<=n; i++)
|
for(int i=1; i<=n; i++)
|
||||||
|
@ -94,12 +110,17 @@ int main()
|
||||||
v=to[j];
|
v=to[j];
|
||||||
if(nid[v]!=nid[i])
|
if(nid[v]!=nid[i])
|
||||||
{
|
{
|
||||||
|
// printf("no:(%d,%d) ",i,v);
|
||||||
no[nid[i]]=1;
|
no[nid[i]]=1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// for(int j=1; j<=n; j++)
|
||||||
|
// {
|
||||||
|
// printf("nid[%d]=%d:%d ",j,nid[j],no[nid[j]]);
|
||||||
|
// }
|
||||||
|
// printf("\n");
|
||||||
for(int j=1; j<=n; j++)
|
for(int j=1; j<=n; j++)
|
||||||
{
|
{
|
||||||
if(!no[nid[j]])
|
if(!no[nid[j]])
|
|
@ -0,0 +1,93 @@
|
||||||
|
// ´Þ¶«Ðñ 46ms
|
||||||
|
#include<cstdio>
|
||||||
|
using namespace std;
|
||||||
|
struct edge
|
||||||
|
{
|
||||||
|
int to,nxt;
|
||||||
|
};
|
||||||
|
int fmin(int a,int b)
|
||||||
|
{
|
||||||
|
return a<b? a:b;
|
||||||
|
}
|
||||||
|
edge a[10000010];
|
||||||
|
int n,e,cnt,head[50010],belong[50010],out[50010];
|
||||||
|
int stack[50010],s_head,dnf[50010],low[50010],visit,newp;
|
||||||
|
int vis[50010];
|
||||||
|
void add(int x,int y)
|
||||||
|
{
|
||||||
|
a[++cnt].to=y;
|
||||||
|
a[cnt].nxt=head[x];
|
||||||
|
head[x]=cnt;
|
||||||
|
}
|
||||||
|
void tarjan(int now)
|
||||||
|
{
|
||||||
|
int tx,ty;
|
||||||
|
dnf[now]=low[now]=++visit;
|
||||||
|
stack[++s_head]=now;
|
||||||
|
vis[now]=1;
|
||||||
|
for(tx=head[now]; tx; tx=a[tx].nxt)
|
||||||
|
{
|
||||||
|
ty=a[tx].to;
|
||||||
|
if(vis[ty]==0)
|
||||||
|
{
|
||||||
|
tarjan(ty);
|
||||||
|
low[now]=fmin(low[now],low[ty]);
|
||||||
|
}
|
||||||
|
if(vis[now]==1)
|
||||||
|
{
|
||||||
|
low[now]=fmin(low[now],low[ty]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(low[now]==dnf[now])
|
||||||
|
{
|
||||||
|
newp++;
|
||||||
|
while(stack[s_head]!=now)
|
||||||
|
{
|
||||||
|
vis[stack[s_head]]=2;
|
||||||
|
belong[stack[s_head--]]=newp;
|
||||||
|
}
|
||||||
|
vis[stack[s_head]]=2;
|
||||||
|
belong[stack[s_head--]]=newp;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void work(int now)
|
||||||
|
{
|
||||||
|
int tx,ty;
|
||||||
|
for(tx=head[now]; tx; tx=a[tx].nxt)
|
||||||
|
{
|
||||||
|
ty=a[tx].to;
|
||||||
|
if(belong[now]!=belong[ty]) out[belong[now]]++;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// freopen("1.txt","r",stdin);
|
||||||
|
// freopen("2.txt","w",stdout);
|
||||||
|
int tx,ty;
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
scanf("%d",&n);
|
||||||
|
if(n==0) break;
|
||||||
|
scanf("%d",&e);
|
||||||
|
for(int i=1; i<=e; i++)
|
||||||
|
{
|
||||||
|
scanf("%d%d",&tx,&ty);
|
||||||
|
add(tx,ty);
|
||||||
|
}
|
||||||
|
for(int i=1; i<=n; i++)
|
||||||
|
{
|
||||||
|
if(vis[i]==0) tarjan(i);
|
||||||
|
}
|
||||||
|
for(int i=1; i<=n; i++) work(i);
|
||||||
|
for(int i=1; i<=n; i++)
|
||||||
|
{
|
||||||
|
if(out[belong[i]]==0) printf("%d ",i);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
for(int i=1; i<=n; i++) head[i]=belong[i]=out[i]=vis[i]=0;
|
||||||
|
cnt=newp=visit=0;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,156 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<string.h>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<vector>
|
||||||
|
using namespace std;
|
||||||
|
const int N=1e5+5,NN=3e5+5;
|
||||||
|
int n,e;
|
||||||
|
int to[NN],ne[NN];
|
||||||
|
int h[N];
|
||||||
|
int dfn[N],low[N];
|
||||||
|
bool b[N];
|
||||||
|
int s[N];//stack
|
||||||
|
int cnt;
|
||||||
|
int tot,top;
|
||||||
|
int id;
|
||||||
|
int nid[N];
|
||||||
|
int now;
|
||||||
|
bool no[N];
|
||||||
|
int fa[N];
|
||||||
|
vector<int> tfa[N];
|
||||||
|
void add(int u,int v)
|
||||||
|
{
|
||||||
|
to[++cnt]=v;
|
||||||
|
ne[cnt]=h[u];
|
||||||
|
h[u]=cnt;
|
||||||
|
}
|
||||||
|
void initialise(int n)
|
||||||
|
{
|
||||||
|
cnt=0;
|
||||||
|
tot=0;
|
||||||
|
top=0;
|
||||||
|
id=n;
|
||||||
|
memset(b,0,sizeof(bool)*(n+1));
|
||||||
|
memset(no,0,sizeof(bool)*(n+1));
|
||||||
|
memset(h,0,sizeof(int)*(n+1));
|
||||||
|
memset(dfn,0,sizeof(int)*(n+1));//WA 根据它判断有无经过
|
||||||
|
}
|
||||||
|
void tarjan(int u)
|
||||||
|
{
|
||||||
|
// printf("%d:",u);
|
||||||
|
int v;
|
||||||
|
dfn[u]=++tot;
|
||||||
|
low[u]=tot;
|
||||||
|
s[++top]=u;
|
||||||
|
b[u]=1;
|
||||||
|
for(int i=h[u]; i; i=ne[i])
|
||||||
|
{
|
||||||
|
v=to[i];
|
||||||
|
// printf("%d ",v);
|
||||||
|
if(!dfn[v])
|
||||||
|
{
|
||||||
|
tarjan(v);
|
||||||
|
low[u]=low[u]<low[v]? low[u]:low[v];
|
||||||
|
}
|
||||||
|
else if(b[v])
|
||||||
|
{
|
||||||
|
low[u]=low[u]<dfn[v]? low[u]:dfn[v];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(low[u]==dfn[u])
|
||||||
|
{
|
||||||
|
id++;
|
||||||
|
// printf("(%d):",id);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// printf("%d ",s[top]);
|
||||||
|
nid[s[top]]=id;
|
||||||
|
b[s[top]]=0;
|
||||||
|
}
|
||||||
|
while(s[top--]!=u&&top>0);
|
||||||
|
// printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void dfs(int u,int fat)
|
||||||
|
{
|
||||||
|
for(int i=h[u]; i; i=ne[i])
|
||||||
|
{
|
||||||
|
int v=to[i];
|
||||||
|
tfa[v].push_back(fat);
|
||||||
|
dfs(v,fat);//这句居然没写
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int u,v;
|
||||||
|
// while(~scanf("%d",&n)&&n)
|
||||||
|
// {
|
||||||
|
scanf("%d",&n);
|
||||||
|
initialise(n);
|
||||||
|
scanf("%d",&e);
|
||||||
|
for(int i=1; i<=e; i++)
|
||||||
|
{
|
||||||
|
scanf("%d%d",&u,&v);
|
||||||
|
add(u,v);
|
||||||
|
}
|
||||||
|
//一开始放在前面,忽略了没有边的情况
|
||||||
|
for(int i=1; i<=n; i++)
|
||||||
|
{
|
||||||
|
// add(0,i);
|
||||||
|
if(!dfn[i])
|
||||||
|
{
|
||||||
|
tarjan(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// tarjan(0);
|
||||||
|
int l=cnt+1;
|
||||||
|
for(int i=1; i<=n; i++)
|
||||||
|
{
|
||||||
|
for(int j=h[i]; j; j=ne[j])
|
||||||
|
{
|
||||||
|
v=to[j];
|
||||||
|
if(nid[v]!=nid[i])
|
||||||
|
{
|
||||||
|
add(nid[i],nid[v]);
|
||||||
|
fa[nid[v]]++;
|
||||||
|
// printf("(%d)to(%d)%d\n",nid[i],nid[v],fa[nid[v]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int ans=0;
|
||||||
|
for(int i=n+1; i<=id; i++)
|
||||||
|
{
|
||||||
|
// printf("(%d)",i);
|
||||||
|
if(fa[i]==0 )
|
||||||
|
{
|
||||||
|
ans++;
|
||||||
|
dfs(i,i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// printf("%d ",ans);
|
||||||
|
bool des=0;
|
||||||
|
for(int i=n+1; i<=id; i++)
|
||||||
|
{
|
||||||
|
if(fa[i]==0 )
|
||||||
|
{
|
||||||
|
int j=h[i];//i ->u
|
||||||
|
for(; j; j=ne[j])
|
||||||
|
{
|
||||||
|
v=to[j];
|
||||||
|
// printf("%d to %d:%d\n",i,v,tfa[v].size());
|
||||||
|
if(tfa[v].size()==1)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!j)
|
||||||
|
{
|
||||||
|
des=1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("%.6lf",1.0-(ans-des)*1.0/n);
|
||||||
|
// }
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
#include<stdio.h>
|
||||||
|
#include<string.h>
|
||||||
|
#include<stdlib.h>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<iostream>
|
||||||
|
#include<vector>
|
||||||
|
#include<queue>
|
||||||
|
using namespace std;
|
||||||
|
#define MAXN 100001
|
||||||
|
#define MAXM 300001
|
||||||
|
struct people
|
||||||
|
{
|
||||||
|
int to,next,from;
|
||||||
|
};
|
||||||
|
people a[MAXM];
|
||||||
|
int N,M,last[MAXN],step=0,tot1=0,tot=0,LOW[MAXN],DFN[MAXN],stack[MAXN],ans=0;
|
||||||
|
int belong[MAXN],indegree[MAXN],IN,OUT,ans1=0,size1[MAXN],ans2=0;
|
||||||
|
bool instack[MAXN];
|
||||||
|
void add(int x,int y)
|
||||||
|
{
|
||||||
|
a[++tot].to=y;
|
||||||
|
a[tot].from=x;
|
||||||
|
a[tot].next=last[x];
|
||||||
|
last[x]=tot;
|
||||||
|
}
|
||||||
|
void Tarjan(int now)
|
||||||
|
{
|
||||||
|
DFN[now]=LOW[now]=++step;
|
||||||
|
stack[++tot1]=now;
|
||||||
|
instack[now]=true;
|
||||||
|
for(int i=last[now]; i; i=a[i].next)
|
||||||
|
{
|
||||||
|
int now_to=a[i].to;
|
||||||
|
if(!DFN[now_to])
|
||||||
|
{
|
||||||
|
Tarjan(now_to);
|
||||||
|
LOW[now]=min(LOW[now_to],LOW[now]);
|
||||||
|
}
|
||||||
|
else if(instack[now_to])
|
||||||
|
LOW[now]=min(DFN[now_to],LOW[now]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DFN[now]==LOW[now])
|
||||||
|
{
|
||||||
|
int now_out;
|
||||||
|
ans++;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
now_out=stack[tot1--];
|
||||||
|
instack[now_out]=false;
|
||||||
|
belong[now_out]=ans;
|
||||||
|
size1[ans]++;
|
||||||
|
}
|
||||||
|
while(now_out!=now);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// freopen("input.in","r",stdin);
|
||||||
|
// freopen("output.out","w",stdout);
|
||||||
|
memset(belong,0,sizeof(belong));
|
||||||
|
memset(DFN,0,sizeof(DFN));
|
||||||
|
memset(LOW,0,sizeof(LOW));
|
||||||
|
memset(last,0,sizeof(last));
|
||||||
|
memset(instack,false,sizeof(instack));
|
||||||
|
scanf("%d%d",&N,&M);
|
||||||
|
for(int i=1; i<=M; i++)
|
||||||
|
{
|
||||||
|
int A,B;
|
||||||
|
scanf("%d%d",&A,&B);
|
||||||
|
add(A,B);
|
||||||
|
}
|
||||||
|
for(int i=1; i<=N; i++)
|
||||||
|
if(!DFN[i])
|
||||||
|
Tarjan(i);
|
||||||
|
for(int i=1; i<=tot; i++)
|
||||||
|
{
|
||||||
|
if(belong[a[i].to]!=belong[a[i].from])
|
||||||
|
indegree[belong[a[i].to]]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i=1; i<=ans; i++)
|
||||||
|
if(!indegree[i])
|
||||||
|
ans1++;
|
||||||
|
if(ans1>1)
|
||||||
|
for(int i=1; i<=ans; i++)
|
||||||
|
if(!indegree[i] && size1[i]==1)
|
||||||
|
{
|
||||||
|
ans1--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
printf("%.6lf\n",1-(double)ans1/N);
|
||||||
|
//system("pause");
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
[top];
|
||||||
|
while(now!=u)
|
||||||
|
{
|
||||||
|
nid[now]=id;
|
||||||
|
now=s[--top];
|
||||||
|
b[now]=0;
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,33 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<algorithm>
|
||||||
|
#include <cmath>
|
||||||
|
using namespace std;
|
||||||
|
const int N=1e5+5;
|
||||||
|
void init(int n)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int t;
|
||||||
|
int t1=0;
|
||||||
|
int n;
|
||||||
|
scanf("%d",&t);
|
||||||
|
while(t--)
|
||||||
|
{
|
||||||
|
scanf("%d",&n);
|
||||||
|
init(n);
|
||||||
|
for(int i=1;i<=n; i++)
|
||||||
|
{
|
||||||
|
for(int j=1;j<=n;j++)
|
||||||
|
{
|
||||||
|
int z=(i&j)+(i|j);
|
||||||
|
printf("%d,%d:%d\n",i,j,z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("Case %d: %d\n",++t1,n);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,183 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<algorithm>
|
||||||
|
#include <cmath>
|
||||||
|
#include<cstring>
|
||||||
|
using namespace std;
|
||||||
|
const int N=1e6+5;
|
||||||
|
char s[N],sub[N];
|
||||||
|
int a[11]= {0};
|
||||||
|
int l[N];
|
||||||
|
int su[N];
|
||||||
|
int cnt;
|
||||||
|
int sublen;
|
||||||
|
int len;
|
||||||
|
//void init(int n)
|
||||||
|
//{
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
void ce()
|
||||||
|
{
|
||||||
|
printf("\n(%d)\n",len) ;
|
||||||
|
for(int i=0; i<10; i++)
|
||||||
|
{
|
||||||
|
printf("%d(%d) ",i,a[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
for(int i=1; i<=cnt; i++)
|
||||||
|
{
|
||||||
|
printf("%d",l[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool cmp(int b)
|
||||||
|
{
|
||||||
|
for(int i=0; i<sublen; i++)
|
||||||
|
{
|
||||||
|
if(su[i]>l[i+b])
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if(su[i]<l[i+b])
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
//void useless()
|
||||||
|
//{
|
||||||
|
// cnt=1;
|
||||||
|
// for(int i=0; i<=9; i++)
|
||||||
|
// {
|
||||||
|
// while(a[i])
|
||||||
|
// {
|
||||||
|
// a[i]--;
|
||||||
|
// l[++cnt]=i;
|
||||||
|
//// break;//wrong
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// for(int i=0; i<sublen; i++)
|
||||||
|
// {
|
||||||
|
// l[cnt+1+i]=su[i];
|
||||||
|
// }
|
||||||
|
// int i;
|
||||||
|
// for(i=1; i<=cnt; i++)
|
||||||
|
// {
|
||||||
|
// if(cmp(i))
|
||||||
|
// {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// printf("%d",l[i]);
|
||||||
|
// }
|
||||||
|
// printf("%s",sub);
|
||||||
|
// for(; i<=cnt; i++)
|
||||||
|
// {
|
||||||
|
// printf("%d",l[i]);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
int wei(int n)
|
||||||
|
{
|
||||||
|
int sum=0;
|
||||||
|
int len=n;
|
||||||
|
while(len>0)
|
||||||
|
{
|
||||||
|
sum++;
|
||||||
|
len/=10;
|
||||||
|
}
|
||||||
|
int len2=n-sum;
|
||||||
|
int sum2=0;
|
||||||
|
while(len2>0)
|
||||||
|
{
|
||||||
|
sum2++;
|
||||||
|
len2/=10;
|
||||||
|
}
|
||||||
|
if(sum==sum2)
|
||||||
|
{
|
||||||
|
return n-sum;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return n-sum+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool ling()
|
||||||
|
{
|
||||||
|
for(int i=1;i<sublen;i++)
|
||||||
|
{
|
||||||
|
if(su[i]>0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
scanf("%s%s",&s,&sub);
|
||||||
|
len=strlen(s);
|
||||||
|
for(int i=0; i<len; i++)
|
||||||
|
{
|
||||||
|
a[s[i]-'0']++;
|
||||||
|
}
|
||||||
|
len=wei(len);
|
||||||
|
int y=len;
|
||||||
|
while(y>0)
|
||||||
|
{
|
||||||
|
a[y%10]--;
|
||||||
|
y/=10;
|
||||||
|
}
|
||||||
|
sublen=strlen(sub);
|
||||||
|
bool fir=1;
|
||||||
|
for(int i=0; i<sublen; i++)
|
||||||
|
{
|
||||||
|
su[i]=sub[i]-'0';
|
||||||
|
a[su[i]]--;
|
||||||
|
}
|
||||||
|
int now=0;
|
||||||
|
while(su[0]==su[now]&&now<sublen-2)
|
||||||
|
{
|
||||||
|
now++;
|
||||||
|
if(su[0]!=su[now])
|
||||||
|
{
|
||||||
|
fir=su[now]<su[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool vis=0;
|
||||||
|
if(a[0]||su[0]==0)
|
||||||
|
for(int i=1; i<=9; i++)
|
||||||
|
{
|
||||||
|
if(a[i])
|
||||||
|
{
|
||||||
|
if(su[0]!=0&&su[0]<=i&&(su[0]<i||ling()))//i->a[i]
|
||||||
|
{
|
||||||
|
vis=1;
|
||||||
|
printf("%s",sub);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
a[i]--;
|
||||||
|
printf("%d",i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i=0; i<=9; i++)
|
||||||
|
{
|
||||||
|
if(!vis&&su[0]==i&&fir)
|
||||||
|
{
|
||||||
|
printf("%s",sub);
|
||||||
|
}
|
||||||
|
while(a[i])
|
||||||
|
{
|
||||||
|
printf("%d",i);
|
||||||
|
a[i]--;
|
||||||
|
}
|
||||||
|
if(!vis&&su[0]==i&&!fir)
|
||||||
|
{
|
||||||
|
printf("%s",sub);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ce();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<vector>
|
||||||
|
using namespace std;
|
||||||
|
const int N=2e5+5,inf=0x3f3f3f3f;
|
||||||
|
int w[N],to[N],ne[N],h[N];
|
||||||
|
int cnt=0;
|
||||||
|
int n;
|
||||||
|
struct Node
|
||||||
|
{
|
||||||
|
int fa;
|
||||||
|
int sum;
|
||||||
|
int max;
|
||||||
|
int min;
|
||||||
|
int len;
|
||||||
|
// vector<int> son;
|
||||||
|
} a[N];
|
||||||
|
void add(int u,int v,int w1)
|
||||||
|
{
|
||||||
|
a[v].fa=u;
|
||||||
|
w[++cnt]=w1;
|
||||||
|
to[cnt]=v;
|
||||||
|
ne[cnt]=h[u];
|
||||||
|
h[u]=cnt;
|
||||||
|
}
|
||||||
|
void dfs(int u)
|
||||||
|
{
|
||||||
|
int v,vmax;
|
||||||
|
a[u].max=0;
|
||||||
|
a[u].min=inf;
|
||||||
|
a[u].len=0;
|
||||||
|
for(int i=h[u]; i; i=ne[i])
|
||||||
|
{
|
||||||
|
v=to[i];
|
||||||
|
dfs(v);
|
||||||
|
a[u].sum+=a[v].sum+w[i]*(a[v].len+1);
|
||||||
|
vmax=a[v].max+w[i];
|
||||||
|
a[u].max=a[u].max>vmax? a[u].max:vmax;
|
||||||
|
a[u].min=a[u].min<w[i]? a[u].min:w[i];
|
||||||
|
a[u].len+=a[v].len+1;
|
||||||
|
}
|
||||||
|
if(a[u].min==inf)
|
||||||
|
{
|
||||||
|
a[u].min=0;
|
||||||
|
}
|
||||||
|
// if(a[u].len==0)
|
||||||
|
// {
|
||||||
|
// a[u].len=1;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
void ce()
|
||||||
|
{
|
||||||
|
for(int i=1; i<=n; i++)
|
||||||
|
{
|
||||||
|
printf("%d:%d %d %d %d %d\n",i,a[i].fa ,a[i].max,a[i].min,a[i].sum,a[i].len );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int u,v,w1;
|
||||||
|
scanf("%d",&n);
|
||||||
|
for(int i=2; i<=n; i++)
|
||||||
|
{
|
||||||
|
scanf("%d%d",&u,&w1);
|
||||||
|
add(u,i,w1);
|
||||||
|
}
|
||||||
|
dfs(1);
|
||||||
|
ce();
|
||||||
|
}
|
Loading…
Reference in New Issue