T1 T1其实就是类似强联通的东西On访问所有的点,从大到小访问以缺点最大的编号的点#include<map> #include<queue> #include<cmath> #include<cctype> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define qread(x) x=read() #define mes(x,y) memset(x,y,sizeof(x)) #define mpy(x,y) memcpy(x,y,sizeof(x)) #define Maxn 100000 #define INF 2147483647 inline int read(){ char ch=getchar(); int f=1,x=0; while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();} return x*f; } struct Edge{ int x,y,next; }a[Maxn+1];int len,first[Maxn+1]; void ins(int x,int y){ len++; a[len].x=x;a[len].y=y; a[len].next=first[x];first[x]=len; } int dfn[Maxn+1]; bool v[Maxn+1]; void dfs(int x){ for(int k=first[x];k>0;k=a[k].next){ int y=a[k].y; if(v[y]==false){ v[y]=true; dfn[y]=dfn[x]; dfs(y); } } } int n,m,x,y; int main(){ qread(n);qread(m); len=0;mes(first,0); for(int i=1;i<=m;i++){ qread(x);qread(y); ins(y,x); } mes(v,false); for(int i=n;i>=1;i--){ if(v[i]==false){ v[i]=true; dfn[i]=i; dfs(i); } } for(int i=1;i<n;i++)printf("%d ",dfn[i]);printf("%d\n",dfn[n]); }T2 T2其实就是二分求解最小答案,然后枚举判断答案是否正确#include<map> #include<queue> #include<cmath> #include<cctype> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define qread(x) x=read() #define mes(x,y) memset(x,y,sizeof(x)) #define mpy(x,y) memcpy(x,y,sizeof(x)) #define Maxn 100000 #define INF 2147483647 inline int read(){ char ch=getchar(); int f=1,x=0; while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();} return x*f; } int n,a[Maxn+1],f[Maxn+1],d[Maxn+1],ans,l,r,k,mid; int main(){ freopen("incr.in","r",stdin); freopen("incr.out","w",stdout); qread(n); for(int i=1;i<=n;i++)qread(a[i]),a[i]-=i; mes(d,63);d[0]=-INF; ans=0; for(int i=1;i<=n;i++){ l=1,r=ans,k=0; while(l<=r){ mid=(l+r)/2; if(a[i]>=d[mid]){ k=mid; l=mid+1; } else r=mid-1; } k++; d[k]=std::min(d[k],a[i]); ans=std::max(ans,k); } printf("%d",n-ans); }T3 T3就是找规律嘛1 1 1 1 4 1 1 11 11 1 1 26 66 26 1 //第五个第二个(倒数第4个)=(第四个第二个+第四个倒数第4个+1)*2然后就被某个厉害的人找出了正解,6666#include<map> #include<queue> #include<cmath> #include<cctype> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define qread(x) x=read() #define mes(x,y) memset(x,y,sizeof(x)) #define mpy(x,y) memcpy(x,y,sizeof(x)) #define Maxn 100 #define INF 2147483647 inline int read(){ char ch=getchar(); int f=1,x=0; while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();} return x*f; } int n,k; struct Hint{ int a[10*Maxn+1],len; Hint(){ len=0;mes(a,0); } }f[Maxn+1][Maxn+1]; Hint jiafa(Hint n1,Hint n2){ Hint no; no.len=std::max(n1.len,n2.len); for(int i=1;i<=no.len;i++)no.a[i]=n1.a[i]+n2.a[i]; for(int i=1;i<=no.len;i++){ no.a[i+1]+=no.a[i]/10; no.a[i]%=10; } int i=no.len; while(no.a[i+1]>0){ i++; no.a[i+1]+=no.a[i]/10; no.a[i]%=10; } no.len=i; return no; } Hint chengfa(int x,Hint n1){ Hint no; no.len=n1.len; for(int i=1;i<=no.len;i++)no.a[i]=n1.a[i]*x; for(int i=1;i<=no.len;i++){ no.a[i+1]+=no.a[i]/10; no.a[i]%=10; } int i=no.len; while(no.a[i+1]>0){ i++; no.a[i+1]+=no.a[i]/10; no.a[i]%=10; } no.len=i; return no; } int main(){ freopen("permutation.in","r",stdin); freopen("permutation.out","w",stdout); qread(n);qread(k); Hint s;s.len=1;s.a[1]=1; for(int i=1;i<=n;i++)f[i][1]=s,f[i][i]=s; for(int i=3;i<=n;i++){ for(int j=2;j<=i/2;j++)f[i][j]=jiafa(chengfa(j,f[i-1][j]),chengfa((i-j+1),f[i-1][j-1])); if(i%2==1)f[i][i/2+1]=chengfa(i+1,f[i-1][i/2]); for(int j=1;j<=(i-2)/2;j++)f[i][i-j]=f[i][j+1]; } for(int i=f[n][k+1].len;i>=1;i--)printf("%d",f[n][k+1].a[i]);printf("\n"); return 0; }
查看原文:http://hz2016.cn/blog/?p=117
【训练】2017-11-7早
最新推荐文章于 2021-03-27 10:32:32 发布