模拟69:

T1,稍数学,主要还是dp(转移莫名像背包???),当C开到n2时复杂度为n4,考场上想了半天优化结果发现n是100,n4可过

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 100050
#define mod 1000000007
using namespace std;
int n,c;
long long m;
int inc[N],inv[N];
int dp[][],f[][];
inline int qpow(int d,long long z)
{
int ret=;
for(;z;z>>=,d=1ll*d*d%mod)
if(z&)ret=1ll*ret*d%mod;
return ret;
}
inline int C(int n,int m){return 1ll*inc[n]*inv[m]%mod*inv[n-m]%mod;}
void init(int n)
{
inc[]=inv[]=;
for(int i=;i<=n;++i)inc[i]=1ll*inc[i-]*i%mod;
inv[n]=qpow(inc[n],mod-);
for(int i=n-;i;--i)inv[i]=1ll*inv[i+]*(i+)%mod;
}
int main()
{
cin>>n>>m>>c;init(n*n);
if(m==n){printf("%d\n",C(n*n,c));return ;}
long long t1=m/n,t2=m%n;
for(register int i=;i<=n;++i)
{
f[][i]=qpow(C(n,i),t1);
f[][i]=1ll*f[][i]*C(n,i)%mod;
}
dp[][]=;
for(int i=,z;i<=n;++i)
{
if(i<=t2)z=;
else z=;
for(int j=;j<=n;++j)
{
for(int k=;k+j<=c;++k)
{
dp[i][k+j]+=1ll*dp[i-][k]*f[z][j]%mod;
if(dp[i][k+j]>=mod)dp[i][k+j]-=mod;
}
}
}
printf("%d\n",dp[n][c]);
return ;
}

T2:稍语文,考场上读错题,结果炸成0分。。。正解是单调栈,由于过于简单,直接粘代码

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10000007
using namespace std;
const int inf=;
int a[N],dp[N],n,ans=;
int pos[N],dq[N],mi[N],ba;
inline int read()
{
int s=,b=;char c=getchar();
while(c>''||c<'')c=getchar();
while(c>=''&&c<='')s=s*+c-'',c=getchar();
return s;
}
int main()
{
n=read();if(!n){puts("");return ;}
for(register int i=;i<=n;++i)a[i]=read(),mi[i]=a[i],pos[i]=i;
mi[]=a[]=inf;ba=;pos[]=;
for(register int i=;i<=n;++i)
{
while(a[i]>=a[dq[ba]])
{
ans=max(ans,i-pos[dq[ba]]+);
if(mi[dq[ba]]<mi[dq[ba-]]){
mi[dq[ba-]]=mi[dq[ba]];
pos[dq[ba-]]=pos[dq[ba]];
}
--ba;
}
if(a[i]>=mi[dq[ba]])
{
ans=max(ans,i-pos[dq[ba]]+);
}
dq[++ba]=i;
}
printf("%d\n",ans);
return ;
}

T3:稍原题,回滚莫队。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 100050
using namespace std;
inline int read()
{
int s=,b=;char c=getchar();
while(c>''||c<'')c=getchar();
while(c>=''&&c<='')s=s*+c-'',c=getchar();
return s;
}
int a[N],n,m,sq,fl[N],fr[N],pd[N],al;
inline int Max(int a,int b){if(a>b)return a;return b;}
inline int Min(int a,int b){if(a>b)return b;return a;}
int ans[N];
struct node{
int l,r,id;
friend bool operator <(const node &a,const node &b)
{
if(a.l/sq==b.l/sq)return a.r<b.r;
return a.l<b.l;
}
}q[N];
void add(int x)
{
pd[x]=;
if(pd[x-])
{
fl[x]=fl[x-];
fr[fl[x]]=x;
al=Max(al,x-fl[x]+);
}
if(pd[x+])
{
fr[x]=fr[x+];
fl[fr[x]]=fl[x];
fr[fl[x]]=fr[x];
al=Max(al,fr[x]-fl[x]+);
}
al=Max(al,fr[x]-fl[x]+);
}
void del(int x)
{
if(pd[x+])fl[fr[x]]=x+;
if(pd[x-])fr[fl[x]]=x-;
fl[x]=fr[x]=x;pd[x]=;
}
int main()
{
// freopen("da.in","r",stdin);freopen("my.out","w",stdout);
n=read();m=read();
sq=sqrt(n);
for(int i=;i<=n;++i)a[i]=read(),fl[i]=fr[i]=i;
for(int j=;j<=m;++j)q[j].l=read(),q[j].r=read(),q[j].id=j;
sort(q+,q+m+);
int l=sq,r=sq,ks=sq;--r;
for(int i=,lastal=;i<=m;++i)
{
// printf("i:%d tol:%d tor:%d\n",i,q[i].l,q[i].r);
if(q[i].l/sq>q[i-].l/sq)
{
for(int j=l;j<=r;++j)fl[a[j]]=fr[a[j]]=a[j],pd[a[j]]=;
al=lastal=;ks=l=r=(q[i].l/sq+)*sq;--r;
}
if(q[i].l/sq==q[i].r/sq)
{
al=;
for(int j=q[i].l;j<=q[i].r;++j)add(a[j]);
ans[q[i].id]=al;
for(int j=q[i].l;j<=q[i].r;++j)
fl[a[j]]=fr[a[j]]=a[j],pd[a[j]]=;
al=;
continue;
}
//puts("yes");
while(r<q[i].r)add(a[++r]);
// printf("al1:%d\n",al);
lastal=al;
while(l>q[i].l)add(a[--l]);
ans[q[i].id]=al;
// printf("al2:%d\n",al);
while(l<ks)del(a[l++]);
al=lastal;
}
for(int i=;i<=m;++i)
printf("%d\n",ans[i]);
return ;
}

模拟70:

T1:(由于此题已被各种方式*爆证明,直接粘)

 //数论,gcd,根号
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
long long n,ans;
long long p[],c[];
int tot;
inline void fen(long long n)
{
tot=;
for(register int i=;i<=sqrt(n);++i)
{
if(n%i)continue;
p[++tot]=i;c[tot]=;
while(n%i==)++c[tot],n/=i;
}
if(n!=)p[++tot]=n,c[tot]=; }
inline void getans(long long al)
{
if(n/al>al)return;
if(n-al<al)return;
ans+=n/al-;
}
void sear(int t,long long al)
{
if(t>tot){getans(al);return;}
const int m=(c[t]+)/;
for(int i=;i<=m;++i)al*=p[t];
sear(t+,al);
}
int main()
{
// freopen("da.in","r",stdin);
while()
{
scanf("%lld",&n);
if(!n)return ;
ans=;fen(n);
sear(,1ll);
ans*=;
cout<<ans<<endl;
}
}

T2:(由于数据过水,暴力可过),正解复杂度带根号,用链表维护不同数的数量。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<bitset>
#define N 40050
using namespace std;
int n,m;
int dp[N],ans,a[N];
bitset<N>pd;
inline int Min(const int a,const int b){if(a<b)return a;return b;}
int pre[N],las[N],num[N],ne[N],tot,tp,pos[N];
struct node{int pre,ne,val,rk;}q[N];
void work2()
{
int al=,ans=;
for(int i=;i<=n;++i)
{
// printf("i:%d\n",i);
dp[i]=dp[i-]+;
if(!pos[a[i]]){++tot;
q[tot].pre=tp;q[tot].rk=i;
q[tp].ne=tot;tp=tot;
pos[a[i]]=tot;
}
else
{
if(pos[a[i]]!=tp)
{
int t=pos[a[i]],tl=q[t].pre,tr=q[t].ne;
q[tl].ne=tr;q[tr].pre=tl;
q[t].rk=i;q[tp].ne=t;q[t].pre=tp;tp=t;
}
else
{
q[tp].rk=i;
}
for(int j=q[tp].pre,t=;j;j=q[j].pre,++t)
{
if(t*t>i)break;
dp[i]=Min(dp[i],dp[q[j].rk]+t*t);
}
}
}
printf("%d\n",dp[n]);
}
int main()
{
scanf("%d%d",&n,&m);ans=Min(n,m*m);
for(int i=;i<=n;++i)scanf("%d",&a[i]);
pd.reset();work2();
}

T3:(由于出题人咕咕咕,咕掉了)已更

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 2000
using namespace std;
const int dx[]={-,,,,-,-,,};
const int dy[]={,-,,,-,,-,};
int n,ok,kkk;
int tp,bt,le,ri,tox,toy,tag;
int ans[N][N];
int zt[][][][][][];
inline int poss(int x){return (x-)/+;}
inline void getne(int x,int y)
{
if(poss(x)==&&poss(y)!=){tox=x;toy=y-;tag=;return;}
if(poss(y)*==n){tox=x-;toy=y;tag=;return;}
if(poss(x)==)
{
if(n==){
if(poss(y)&){tox=x;toy=y+;tag=;return;}
else{tox=x-;toy=y;tag=;return;}
} if(poss(y)&){tox=x+;toy=y;tag=;return;}
else{
if(poss(y)==n/){tox=x-;toy=;tag=;return;}
else{tox=x;toy=y+;tag=;return;}
}
}
if(poss(x)==n/){
if(poss(y)&){tox=x;toy=y+;tag=;return;}
else{tox=x-;toy=y;tag=;return;}
}
else{
if(poss(y)&){tox=x+;toy=y;tag=;return;}
else{tox=x-;toy=y;tag=;return;}
}
} inline void getne2(int x,int y)
{
if(poss(x)==&&poss(y)!=){tox=x;toy=y-;tag=;return;}
if(poss(y)==n/||poss(y)==n/-)
{
if(poss(y)==n/)
{
if(poss(x)&){tox=x-;toy=y;tag=;return;}
else{tox=x;toy=y-;tag=;return;}
}
else
{
if(poss(x)==){tox=x-;toy=y+;tag=;return;}
if(poss(x)&){tox=x;toy=y+;tag=;return;}
else{tox=x-;toy=y;tag=;return;}
}
}
if(poss(y)*==n){tox=x-;toy=y;tag=;return;}
if(poss(x)==)
{
if(n==){
if(poss(y)&){tox=x;toy=y+;tag=;return;}
else{tox=x-;toy=y;tag=;return;}
} if(poss(y)&){tox=x+;toy=y;tag=;return;}
else{
if(poss(y)==n/){tox=x-;toy=;tag=;return;}
else{tox=x;toy=y+;tag=;return;}
}
}
if(poss(x)==n/){
if(poss(y)&){tox=x;toy=y+;tag=;return;}
else{tox=x-;toy=y;tag=;return;}
}
else{
if(poss(y)&){tox=x+;toy=y;tag=;return;}
else{tox=x-;toy=y;tag=;return;}
}
}
void sear(int x,int y,int al)
{ if(al==n*n-)return;
if(n&)getne2(x,y);
else getne(x,y); x=tox;y=toy; if(n&)getne2(tox,toy);
else getne(tox,toy); int bx,by;bx=poss(x)*-;by=poss(y)*-;
switch(tag)
{
case :{tox=bx;toy=by+;break;}
case :{tox=bx+;toy=by;break;}
case :{tox=bx+;toy=by+;break;}
case :{tox=bx+;toy=by+;break;}
case :{tox=bx;toy=by+;break;}
}
if(tox==x&&toy==y)--toy;
for(int i=bx;i<=bx+;++i)
for(int j=by;j<=by+;++j)
ans[i][j]=zt[x-bx+][y-by+][tox-bx+][toy-by+][i-bx+][j-by+]+al;
al+=;
sear(tox,toy,al);
}
void dfs(int f1,int f2,int t1,int t2,int x,int y,int p)
{
zt[f1][f2][t1][t2][x][y]=p;
if(p==){
if(x==t1&&y==t2){ok=;return;}
zt[f1][f2][t1][t2][x][y]=;
return; }
if(x==t1&&y==t2){
zt[f1][f2][t1][t2][x][y]=;
return;
}
for(register int j=;j<=;++j)
{
if(x+dx[j]<=||x+dx[j]>||y+dy[j]<=||y+dy[j]>||zt[f1][f2][t1][t2][x+dx[j]][y+dy[j]])continue;
dfs(f1,f2,t1,t2,x+dx[j],y+dy[j],p+);if(ok)return;
}
zt[f1][f2][t1][t2][x][y]=;
}
void pr(int x,int y,int xx,int yy)
{
for(int i=;i<=;++i){
for(int j=;j<=;++j)
printf("%3d ",zt[x][y][xx][yy][i][j]);
puts("");
}
}
void prans()
{
for(int i=;i<=n;++i){
for(int j=;j<=n;++j)
printf("%3d ",ans[i][j]);
puts("");
}
}
int main()
{
cin>>n;kkk=*+;
for(int i=;i<=;++i)
for(int j=;j<=;++j)
for(int k=;k<=;++k)
for(int o=;o<=;++o)
{if(k==i&&o==j)continue;ok=;dfs(i,j,k,o,i,j,);}
for(int i=;i<=;++i)
for(int j=;j<=;++j)
ans[i][j]=zt[][][][][i][j];
ans[][]=n*n;
if(n==){prans();return ;}
sear(,,);prans();
}

模拟71

T1:正解为meet in the mid,但用乱搞加剪枝可过

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int mod=;
const int N=(<<)+;
struct hash_map{
int a[N],tot;
int he[mod];
int ne[N];
int val[N];
int to[N];
inline void add(int x,int t)
{
int k=x%mod;
to[++tot]=t;val[tot]=x;
ne[tot]=he[k];he[k]=tot;
}
int operator [](int x)
{
int k=x%mod;
for(int i=he[k];i;i=ne[i])
if(val[i]==x)return to[i];
return ;
}
}h;
int n,tot,ans,b[N];
vector<int>v[N];
int bin[N];
int a[];
inline int count(int x)
{
int ret=;
for(int i=;i<n;++i)
if(x&bin[i])++ret;
return ret;
}
int main()
{
scanf("%d",&n);for(int i=;i<=n;++i)bin[i]=<<i;
int p=;
for(int i=;i<n;++i)scanf("%d",&a[i]);
int gc=a[];
for(int i=;i<n;++i)gc=__gcd(gc,a[i]);
for(int j=;j<n;++j)a[j]/=gc,p+=a[j];
p=(p+)>>;
const int ma=<<n;
for(register int i=,al,t;i<ma;++i)
{
al=;
for(register int j=;j<n;++j)
if(i&bin[j])al+=a[j];
b[i]=al;
if(al&)
{
if(al<=p)
{
if(!h[al])h.add(al,++tot);
v[h[al]].push_back(i);
}
continue;
}
else
{
t=al>>;
if(h[t])
{
t=h[t];
if(bin[count(i)]<v[t].size())
{
t=al>>;
for(register int j=i;j;j=(j-)&i)
if(b[j]==t){++ans;break;}
}
else
{
for(register int j=;j<v[t].size();++j)
if((v[t][j]&i)==v[t][j]){++ans;break;}
}
}
if(al<=p)
{
if(h[al]==)h.add(al,++tot);
v[h[al]].push_back(i);
}
}
}
cout<<ans<<endl;
}

打爆毛一琛轻轻松松

T2:我以前做过一个很SAO的题,叫做SAO,然后这题转化一下题意就和SAO很像,反正巨恶心,考场上凭借做过SAO拿到70。

关于SAO的blogs:https://www.cnblogs.com/loadingkkk/p/11220717.html

转化题意考虑一开始有一个1到n的序列,要把它通过一个1到n-1的序列转换成目标序列,考虑构造这个n-1的序列发现从目标序列一直跳(int i=n;i!=1;i=p[i])可以把顺序找出来

dp数组是定义在1~n-1的序列上的,然后dp[i][j]定义为考虑到序列上从i到n-1,i在构造的序列中的排名为j的方案数,dp时维护前缀和即可。

 #include<iostream>
#include<cstdio>
#define N 5050
using namespace std;
const int mod=;
int n,a[N],ans,dp[N][N],pd[N];
int main()
{
scanf("%d",&n);for(int i=;i<=n;++i)scanf("%d",&a[i]),++a[i];
if(a[n]==n){puts("");return ;}
int pre=a[n];
for(int j=n;j>=;--j)if(pre==j){pd[j]=;pre=a[pre];}
dp[n-][]=;
for(int i=n-,al;i;--i){al=n-i-;
if(pd[i+])for(int o=,tt=;o<=al+;++o){dp[i][o]=tt;tt+=dp[i+][o];if(tt>=mod)tt-=mod;}
else for(int o=al,tt=;o;--o){tt+=dp[i+][o];if(tt>=mod)tt-=mod;dp[i][o]=tt;}
}
for(int i=;i<=n-;++i){ans+=dp[][i];if(ans>=mod)ans-=mod;}
cout<<ans<<endl;
}

T3:这是一个复杂度和证明都很玄学的算法(......剪枝完暴力搜)

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#define N 10050
using namespace std;
int n,a[N],p,k,ans;
inline bool judge(const int x,const int ans)
{
const int mod=p;
register int ret=,al=;
for(register int i=,to;i<=n;++i)
{
to=a[i]+x;if(to>=mod)to-=mod;
if(to>ans)return false;
if(al+to>ans){
al=;++ret;
if(ret>k)return false;
}
al+=to;
}
return true;
}
void work(const int x)
{
int l=,r=ans,mid;
while(l+<r)
{
mid=l+r>>;
if(judge(x,mid))r=mid;
else l=mid;
}
ans=r;
}
int main()
{
scanf("%d%d%d",&n,&p,&k);
for(int i=;i<=n;++i)scanf("%d",&a[i]),ans+=a[i];
for(int i=,ma;i<p;i+=p-ma)
{
if(judge(i,ans))work(i);
ma=;
for(int j=,to;j<=n;++j)
{
to=a[j]+i;if(to>=p)to-=p;
if(to>ma)ma=to;
}
}
cout<<ans<<endl;
}

模拟72:

T1:水,dp or 卡特兰

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod=;
int n,m,dp[][][],mu,al,ans;
char s[];
int main()
{
scanf("%d%d%s",&n,&m,s+);
for(int i=;i<=m;++i){
if(s[i]=='(')++al;
else
{
if(al)--al;
else ++mu;
}
}
if(mu>n-m||al>n-m){puts("");return ;}
if(n==m)
{
if(!mu&&!al){puts("");return ;}
else {puts("");return ;}
}
dp[][][]=;dp[][][]=;
if(!mu)
{
dp[][al+][]=;
if(al)dp[][al-][]=;
}
for(register int i=;i<=n-m;++i)
{
dp[i][][]=dp[i-][][];dp[i][][]=dp[i-][][];
for(int j=;j<=i;++j)
{
dp[i][j][]=dp[i-][j-][]+dp[i-][j+][];
if(dp[i][j][]>=mod)dp[i][j][]-=mod;
dp[i][j][]=dp[i-][j-][]+dp[i-][j+][];
if(dp[i][j][]>=mod)dp[i][j][]-=mod;
}
for(int j=i+;j<=n-m;++j)
{
dp[i][j][]=dp[i-][j-][]+dp[i-][j+][];
if(dp[i][j][]>=mod)dp[i][j][]-=mod;
}
for(int j=mu;j-mu+al<=n-m;++j)
{
dp[i][j-mu+al+][]+=dp[i-][j][];
if(dp[i][j-mu+al+][]>=mod)dp[i][j-mu+al+][]-=mod;
if(j-mu+al->=)
{
dp[i][j-mu+al-][]+=dp[i-][j][];
if(dp[i][j-mu+al-][]>=mod)dp[i][j-mu+al-][]-=mod;
}
}
}
ans=dp[n-m][][];
if(!al)
{
ans+=dp[n-m][mu][];
if(ans>=mod)ans-=mod;
}
cout<<ans<<endl;
return ;
}

T2:主要在于dp状态设定,转移很简单

设dp[i][j][2][k]表示进行了i次操作,当前数二进制表示下后8位为j,第九位为0/1,第九位往前连续k位相同的概率

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#define N 5050
using namespace std;
const double di=0.01;
int n,m,sta,t,cnt;
long long x;
double dp[][<<][][];
double ans,p,q;
int bin[];
int main()
{
for(int i=;i<=;++i)bin[i]=<<i;
scanf("%lld%d%lf",&x,&n,&p);p*=0.01;q=1.0-p;
for(int i=;i<;++i)sta|=x&bin[i];
t=(x>>)&;cnt=;
for(int i=;i<=;++i)
{
if(((x>>i)&)==t)++cnt;
else break;
}
const int ma=<<;
dp[][sta][t][cnt]=;
for(int i=;i<n;++i){
for(int j=;j<ma;++j){
for(int k=;k<=n+;++k){
if(j&bin[])dp[i+][(j<<)^bin[]][][]+=dp[i][j][][k]*p;
else dp[i+][(j<<)][][k+]+=dp[i][j][][k]*p;
if(j==)dp[i+][][][]+=dp[i][j][][k]*q;
else dp[i+][j+][][k]+=dp[i][j][][k]*q;
if(j&bin[])dp[i+][(j<<)^bin[]][][k+]+=dp[i][j][][k]*p;
else dp[i+][(j<<)][][]+=dp[i][j][][k]*p;
if(j==)dp[i+][][][k]+=dp[i][j][][k]*q;
else dp[i+][j+][][k]+=dp[i][j][][k]*q;
}
}
}
for(int j=,d,x;j<ma;++j)
{
x=j;d=;
while(!(x&))x>>=,++d;
for(int k=;k<=n+;++k)ans+=(dp[n][j][][k]+dp[n][j][][k])*d;
}
for(int k=;k<=n+;++k)
{
ans+=dp[n][][][k]*;
ans+=dp[n][][][k]*(+k);
}
printf("%.10lf\n",ans);
}

T3:

先考虑连通图的情况。
首先如果原图不是二分图,显然无解。因为对于一个长度大于3的奇环,如果合并环上任意两个不相邻的点,一定会生成一个更小的奇环,最终会剩下一个三元环,无法继续合并。
对于任意联通的二分图,我们可以选定一个点s ,然后将所有与s距离相同的点合并。由于原图是二分图,所有与距离相同的点必然在同一侧,也就一定不相邻,这样就可以构造出一条链。因此只需要找出两个点,使得它们间的最短路径最长。显然这样构造是最优的。
考虑有多个连通分量的情况,我们对于每一个连通分量都构造了一条链,而对于任意两条链,我们显然可以通过一次合并操作将它们并成一条,长度为它们的长度之和。因此,答案就是所有连通块的直径之和。
使用 BFS 求出最短路,时间复杂度为n2

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#define N 5050
using namespace std;
int n,m,ok=;
int he[N],ne[],to[],tot;
void addedge(int x,int y){to[++tot]=y;ne[tot]=he[x];he[x]=tot;}
int f[N],ans[N];
int dfn[N],low[N],ys[N],cut[N],cnt,rt,kx,bl[N];
vector<int>scc[N];
stack<int>st;
//
int dis[][];
queue<int>q;
void dijiesitela(const int g)
{
dis[g][g]=;int x,y;
q.push(g);
while(!q.empty())
{
x=q.front();q.pop();
for(int i=he[x];i;i=ne[i])
{
y=to[i];
if(dis[g][y])continue;
dis[g][y]=dis[g][x]+;
q.push(y);
}
}
}
void tarjan(int g,int fa)
{
f[g]=rt;
for(int i=he[g],y;i;i=ne[i])
{
y=to[i];if(y==fa)continue;
if(ys[y]){if(ys[y]==ys[g]){ok=;return;}}
else{ys[y]=ys[g]^;tarjan(y,g);}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(register int i=,x,y;i<=m;++i)
{
scanf("%d%d",&x,&y);
addedge(x,y);addedge(y,x);
}
for(int i=;i<=n;++i)
dijiesitela(i);
for(int i=;i<=n;++i)
if(!f[i]){
ys[i]=;rt=i;tarjan(i,);
if(!ok){puts("-1");return ;}
}
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
if(f[j]==f[i])ans[f[j]]=max(ans[f[j]],dis[i][j]-);
int alans=;
for(int i=;i<=n;++i)alans+=ans[i];
cout<<alans<<endl;
}

CSPS模拟69-72的更多相关文章

  1. CSPS模拟 69

    $C_n^0=1$ $C_n^0=1$ $C_n^0=1$ 我怎么又双叒叕犯这种错误了啊 (咳檀) T1 WA0,大神题,不会做! T2 就是要找一个最长区间,满足左端点是区间最小值,右端点是区间最大 ...

  2. [CSP-S模拟测试72]题解

    A.简单的序列 遇到括号匹配,先将左右括号转化为1和-1. 那么一个括号序列合法的必要条件:总和为0且所有时刻前缀和$\ge 0$. 用dp预处理出长度为$i$,总和为$j$的括号序列数量.那么如果p ...

  3. 反省——关于csp-s模拟50

    本人于搜索csp-s模拟49题解时,有意识地点开了一篇关于csp-s模拟50T2的题解,并知道了题解是二维前缀和以及四维偏序. 更重要的是,那篇博客说有解法二,叫二维莫队. 于是我上网搜索二维莫队,结 ...

  4. 20220925 - CSP-S 模拟赛 #2

    20220925 - CSP-S 模拟赛 #2 时间记录 \(8:00-8:20\) 浏览题面 \(8:20-8:45\) T1 想到了分块计算,但是在手推样例的过程中,发现样例的数据并不能真正构成一 ...

  5. csp-s模拟测试99

    csp-s模拟测试99 九九归一直接爆炸. $T1$一眼板子. $T2$一眼语文题(语文的唯一一次$120+$是给模拟出来的可知我的语文能力). $T3$一眼普及题. ?? Hours Later 板 ...

  6. csp-s模拟测试98

    csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...

  7. csp-s模拟测试97

    csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 00 ...

  8. csp-s模拟测试96

    csp-s模拟测试96 $T1$一眼慢速乘,$T2$稍证一手最优性尝试用神奇数据结构优化,无果,弃.$T3$暴力+信仰. 100 03:16:38 95 03:16:56 35 03:17:10 23 ...

  9. csp-s模拟测试95

    csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...

随机推荐

  1. Codeforces 1249 E. By Elevator or Stairs?

    传送门 首先显然下楼的操作一定是不优的,所以只要考虑上楼 设 $f[i]$ 表示到第 $i$ 层时需要的最少时间 那么首先考虑走楼梯,有转移,$f[i]=f[i-1]+a[i-1]$ 然后考虑坐电梯有 ...

  2. .Net Core Swagger:Actions require an explicit HttpMethod binding for Swagger 2.0

    添加完Swagger包引用后运行报错:Actions require an explicit HttpMethod binding for Swagger 2.0 第一时间想到了父类控制器 没有添加 ...

  3. PHP数字转大写

    最近在研究算法,发现了一个数字转大写的算法挺有意思,分享给大家看看: function get_amount($num){        $c1 = "零壹贰叁肆伍陆柒捌玖";   ...

  4. 一个因MySQL大小写敏感导致的问题

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 00 MYSQL对大小写敏感 见字如面,见标题知内容.你有遇到过因为MYSQL对大小写敏感而被坑的体验吗? 之前看过阿里巴 ...

  5. Mysql、Navicat Premium 12连接

    1.配置MySQL80的环境 安装好MySQL,为MySQL配置环境变量.MySQL默认安装在C:\Program Files下. 1)新建MYSQL_HOME变量,并配置:C:\Program Fi ...

  6. JDBC 学习复习8 C3P0数据源使用

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. c3p0与dbcp区别 dbcp ...

  7. opencv-04--图像金字塔

    图像金字塔被广泛应用于各种视觉应用中.图像金字塔是一个图像集合,集合中图像都源于同一个原始图像,而且是通过对原始图像连续降采样获得,直到达到某个中止条件才停止降采样.(当然,降为一个像素肯定是中止条件 ...

  8. MySQL5.7.28免安装版配置

    下载 安装配置 问题及解决方案 一.下载 找到你要的版本点击“looking for the latest GA version?”切换,我这个安装的是5.7.28,然后往下拉: 找到免安装的压缩包: ...

  9. Mac上搭建Web服务器--Apache

    局域网搭建 Web 服务器测试环境,因为Mac OS X 自带了 Apache 和 PHP 环境,我们只需要简单的启动它就行了. 1.命令:sudo apachectl start Apache服务器 ...

  10. mysql的unsigned属性负值报错和为0情况及mysql的严格模式

    最近发现在进行线程操作时,发现数据库的unsigned字段减为负数时并未报错而是变为0,因此去寻找解决方案,发现这和我的sql_mode有关. sql_mode MySQL服务器可以以不同的SQL模式 ...