P2765-魔术球问题
1 #include<bits/stdc++.h> 2 #define _for(i,a,b) for(register int i = (a);i < b;i ++) 3 #define _rep(i,a,b) for(register int i = (a);i > b;i --) 4 #define INF 0x3f3f3f3f 5 #define MOD 100000000 6 #define maxn 100003 7 #define pb push_back 8 #define debug() printf("Miku Check OK!\n") 9 typedef long long ll; 10 11 using namespace std; 12 typedef pair<int,int> P; 13 inline ll read() 14 { 15 ll ans = 0; 16 char ch = getchar(), last = ' '; 17 while(!isdigit(ch)) last = ch, ch = getchar(); 18 while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar(); 19 if(last == '-') ans = -ans; 20 return ans; 21 } 22 inline void write(ll x) 23 { 24 if(x < 0) x = -x, putchar('-'); 25 if(x >= 10) write(x / 10); 26 putchar(x % 10 + '0'); 27 } 28 int ver[maxn],Next[maxn],head[maxn],val[maxn]; 29 int d[maxn]; 30 int pillars,s,t,tot,maxflow; 31 const int N = 3000; 32 void add(int x,int y,int w) 33 { 34 ver[++tot] = y,Next[tot] = head[x],head[x] = tot,val[tot] = w; 35 } 36 bool bfs() 37 { 38 memset(d,0,sizeof(d)); 39 queue<int> q; 40 q.push(s); 41 d[s] = 1; 42 while(!q.empty()) 43 { 44 int x = q.front(); 45 q.pop(); 46 for(int i = head[x]; i; i = Next[i]) 47 if(val[i] && !d[ver[i]]) 48 { 49 q.push(ver[i]); 50 d[ver[i]] = d[x]+1; 51 if(ver[i]==t) 52 return true; 53 } 54 } 55 return false; 56 } 57 int dinic(int x,int flow) 58 { 59 if(x==t) return flow; 60 // k为子节点增量 61 int rest = flow, k; 62 for(int i = head[x]; i && rest; i = Next[i]) 63 { 64 if(val[i] && d[ver[i]] == d[x]+1) 65 { 66 k = dinic(ver[i],min(rest,val[i])); 67 if(!k) d[ver[i]] = 0; 68 val[i] -= k; 69 val[i^1] += k; 70 rest -= k; 71 } 72 } 73 return flow - rest; 74 } 75 vector<int> st; 76 int vvis[maxn]; 77 void go(int i,vector<int>& rnt) 78 { 79 rnt.pb(i); 80 int j = head[i]; 81 for(int j = head[i]; j ; j = Next[j]) 82 { 83 int y = ver[j]; 84 85 if(y>N && !vvis[y-N] && !val[j]) 86 { 87 vvis[y-N] = 1; 88 go(y-N,rnt); 89 return ; 90 } 91 } 92 } 93 int main() 94 { 95 pillars = read(); 96 tot = 1; 97 s = 0; 98 t = 2*N+1; 99 int ans = 0,balls = 0; 100 101 while("Hatsune Miku") 102 { 103 ans ++; 104 balls ++; 105 _for(i,1,balls) 106 if(sqrt(i+balls) == (int)sqrt(i+balls)) 107 { 108 add(i,balls+N,1); 109 add(balls+N,i,0); 110 } 111 add(0,balls,1); 112 add(balls,0,0); 113 add(balls+N,2*N+1,1); 114 add(2*N+1,balls+N,0); 115 int flow = 0; 116 while(bfs()) 117 while(flow = dinic(s,INF)) 118 ans -= flow; 119 if(ans > pillars) 120 break; 121 } 122 123 printf("%d\n",balls-1); 124 vvis[0] = 1;vvis[balls] = 1; 125 _for(i,1,balls) 126 for(int j = head[i+N]; j ; j = Next[j]) 127 if(ver[j]==2*N+1 && val[j]==1) 128 st.pb(i),vvis[i] = 1; 129 130 vector<int> tmp; 131 _for(i,0,st.size()) 132 { 133 vvis[st[i]] = 1,go(st[i],tmp); 134 _for(j,0,tmp.size()-1) 135 printf("%d ",tmp[j]); 136 printf("%d\n",tmp[tmp.size()-1]); 137 tmp.clear(); 138 } 139 140 return 0; 141 }