#include <ios> #include <vector> using namespace std; int a,b,c,d,e,f,l,k,p,w,n; int mapa[3001],wej[3001],gdzie[3001],odw[3001]; vector <pair <int, int>> wyn[3001]; int dp[3001][3001],chkwej[3001]; void sw(int i, int j){ odw[i]=odw[j]=w; swap(wej[i], wej[j]); gdzie[wej[i]]=i; gdzie[wej[j]]=j; wyn[w].push_back({i, j}); } int main(){ scanf("%d", &n); /* bajo jajo bajo jajo bajo jajo bajo jajo bajo jajo bajo jajo bajo jajo for (b=0; b<=3000; ++b) dp[0][b]=dp[1][b]=1000000000; dp[1][0]=0; dp[1][1]=1; for (a=2; a<=n; ++a){ printf("dl: %d\n", a); for (b=0; b<a-1; ++b) { // zakladamy chyba poprawnie, ze zablokowane sa kolo siebie dp[a][b]=1000000000; for (c=1; c<=a; ++c){ // ale moze nie??????? bo wtedy je porozdzielamy??? if (max(dp[c][1], dp[a-c][b+1])<dp[a][b]){ //printf(" %d:%d", c, max(dp[c][1], dp[a-c][b+1])); l=c; dp[a][b]=min(dp[a][b], max(dp[c][1], dp[a-c][b+1])); } } printf(" blk: %d wyn: %d opt c: %d\n", b, dp[a][b], l); } dp[a][a]=dp[a][a-1]=1+dp[a][0]; printf(" blk: %d wyn: %d\n", a-1, dp[a][a-1]); printf(" blk: %d wyn: %d\n", a, dp[a][a]); for (b=a+1; b<=3000; ++b) dp[a][b]=1000000000; } return 0;*/ for (a=1; a<=n; ++a){ scanf("%d", &wej[a]); mapa[wej[a]]=1; } for (a=1; a<=3000; ++a) if (mapa[a]) mapa[a]=++f; for (a=1; a<=n; ++a){ chkwej[a]=wej[a]=mapa[wej[a]]; gdzie[wej[a]]=a; } // teraz tworzymy spojne for (w=1; w<=n; ++w){ f=0; for (a=1; a<=n; ++a) if (wej[a]!=a) f=1; else odw[a]=w; if (!f) break; for (a=1; a<=n; ++a) if (odw[a]<w&&odw[gdzie[a]]<w){ b=gdzie[a]; sw(a, gdzie[a]); while (wej[b]!=b&&wej[b]!=gdzie[b]&&odw[wej[b]]<w&&odw[gdzie[b]]<w){ c=gdzie[b]; sw(wej[b], gdzie[b]); b=c; } } } printf("%d", --w); for (a=1; a<=w; ++a){ printf("\n%d\n", (int)wyn[a].size()<<1); for (b=0; b<(int)wyn[a].size(); ++b){ printf("%d ", wyn[a][b].first); swap(chkwej[wyn[a][b].first], chkwej[wyn[a][b].second]); } for (b=(int)wyn[a].size()-1; b>=0; --b) printf("%d ", wyn[a][b].second); } for (a=1; a<=n; ++a) if (a!=chkwej[a]){ printf("[%d]: %d\n", a, chkwej[a]); return 69; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | #include <ios> #include <vector> using namespace std; int a,b,c,d,e,f,l,k,p,w,n; int mapa[3001],wej[3001],gdzie[3001],odw[3001]; vector <pair <int, int>> wyn[3001]; int dp[3001][3001],chkwej[3001]; void sw(int i, int j){ odw[i]=odw[j]=w; swap(wej[i], wej[j]); gdzie[wej[i]]=i; gdzie[wej[j]]=j; wyn[w].push_back({i, j}); } int main(){ scanf("%d", &n); /* bajo jajo bajo jajo bajo jajo bajo jajo bajo jajo bajo jajo bajo jajo for (b=0; b<=3000; ++b) dp[0][b]=dp[1][b]=1000000000; dp[1][0]=0; dp[1][1]=1; for (a=2; a<=n; ++a){ printf("dl: %d\n", a); for (b=0; b<a-1; ++b) { // zakladamy chyba poprawnie, ze zablokowane sa kolo siebie dp[a][b]=1000000000; for (c=1; c<=a; ++c){ // ale moze nie??????? bo wtedy je porozdzielamy??? if (max(dp[c][1], dp[a-c][b+1])<dp[a][b]){ //printf(" %d:%d", c, max(dp[c][1], dp[a-c][b+1])); l=c; dp[a][b]=min(dp[a][b], max(dp[c][1], dp[a-c][b+1])); } } printf(" blk: %d wyn: %d opt c: %d\n", b, dp[a][b], l); } dp[a][a]=dp[a][a-1]=1+dp[a][0]; printf(" blk: %d wyn: %d\n", a-1, dp[a][a-1]); printf(" blk: %d wyn: %d\n", a, dp[a][a]); for (b=a+1; b<=3000; ++b) dp[a][b]=1000000000; } return 0;*/ for (a=1; a<=n; ++a){ scanf("%d", &wej[a]); mapa[wej[a]]=1; } for (a=1; a<=3000; ++a) if (mapa[a]) mapa[a]=++f; for (a=1; a<=n; ++a){ chkwej[a]=wej[a]=mapa[wej[a]]; gdzie[wej[a]]=a; } // teraz tworzymy spojne for (w=1; w<=n; ++w){ f=0; for (a=1; a<=n; ++a) if (wej[a]!=a) f=1; else odw[a]=w; if (!f) break; for (a=1; a<=n; ++a) if (odw[a]<w&&odw[gdzie[a]]<w){ b=gdzie[a]; sw(a, gdzie[a]); while (wej[b]!=b&&wej[b]!=gdzie[b]&&odw[wej[b]]<w&&odw[gdzie[b]]<w){ c=gdzie[b]; sw(wej[b], gdzie[b]); b=c; } } } printf("%d", --w); for (a=1; a<=w; ++a){ printf("\n%d\n", (int)wyn[a].size()<<1); for (b=0; b<(int)wyn[a].size(); ++b){ printf("%d ", wyn[a][b].first); swap(chkwej[wyn[a][b].first], chkwej[wyn[a][b].second]); } for (b=(int)wyn[a].size()-1; b>=0; --b) printf("%d ", wyn[a][b].second); } for (a=1; a<=n; ++a) if (a!=chkwej[a]){ printf("[%d]: %d\n", a, chkwej[a]); return 69; } } |