model
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了model相关的知识,希望对你有一定的参考价值。
1 /************************************************** 2 3 模版:01背包 4 题目:HDU2602 Bone Collector 5 6 **************************************************/ 7 8 #include<iostream> 9 #include<cstring> 10 #include<cstdio> 11 using namespace std; 12 const int maxn=1000+10; 13 #define Max(a, b) ((a)>(b)?(a):(b)) 14 15 int T, n, m, p[maxn], v[maxn], f[maxn]; 16 17 int main() 18 { 19 scanf("%d", &T); 20 while(T--) 21 { 22 memset(f, 0, sizeof f); 23 24 scanf("%d%d", &n, &m); 25 for(int i=1; i<=n; i++) scanf("%d", &p[i]); 26 for(int i=1; i<=n; i++) scanf("%d", &v[i]); 27 28 for(int i=1; i<=n; i++) 29 for(int j=m; j>=v[i]; j--) 30 f[j]=Max(f[j], f[j-v[i]]+p[i]); 31 printf("%d\n", f[m]); 32 } 33 return 0; 34 } 35 36 37 38 39 /************************************************** 40 41 模版:并查集 42 题目:POJ1182 食物链 43 44 **************************************************/ 45 46 #include<iostream> 47 #include<cstring> 48 #include<cstdio> 49 using namespace std; 50 const int maxn=50000+10; 51 52 int n, m, a[5], b[5], f[maxn*3], p[maxn*3]; 53 54 void Pre() 55 { 56 for(int i=1; i<=n; i++) p[i]=i, p[i+n]=i+n, p[i+n*2]=i+n*2; 57 for(int i=1; i<=n; i++) f[i]=i+n, f[i+n]=i+n*2, f[i+n*2]=i; 58 return ; 59 } 60 61 int Root(int x) 62 { 63 return (x==p[x])?(x):(p[x]=Root(p[x])); 64 } 65 66 int main() 67 { 68 scanf("%d%d", &n, &m); 69 Pre(); 70 71 int d, x, y, ans=0; 72 73 for(int i=1; i<=m; i++) 74 { 75 scanf("%d%d%d", &d, &x, &y); 76 77 if(x>n||y>n||(d==2&&x==y)) 78 { 79 ++ans; 80 continue; 81 } 82 83 a[0]=Root(x), a[1]=f[a[0]], a[2]=f[a[1]]; 84 b[0]=Root(y), b[1]=f[b[0]], b[2]=f[b[1]]; 85 86 bool flag=false; 87 for(int j=0; j<3&&!flag; j++) if(a[0]==b[j]) flag=true; 88 89 if(d==1) 90 { 91 if(flag) ans+=(a[0]!=b[0]); 92 else for(int j=0; j<3; j++) p[b[j]]=a[j]; 93 } 94 else 95 { 96 if(flag) ans+=(a[0]!=b[1]); 97 else for(int j=0; j<3; j++) p[b[j]]=a[(j+2)%3]; 98 } 99 100 } 101 102 printf("%d\n", ans); 103 return 0; 104 } 105 106 107 108 109 /************************************************** 110 111 模版:二分图最大匹配 112 题目:POJ1274 The Perfect Stall 113 114 **************************************************/ 115 116 #include<iostream> 117 #include<cstring> 118 #include<cstdio> 119 using namespace std; 120 const int maxn=200+10; 121 122 int n, m, ans, from[maxn]; 123 int cur, fir[maxn], ver[maxn*maxn], nxt[maxn*maxn]; 124 bool vis[maxn]; 125 126 void Add(int u, int v) 127 { 128 ver[++cur]=v, nxt[cur]=fir[u], fir[u]=cur; 129 return ; 130 } 131 132 bool Dfs(int u) 133 { 134 for(int i=fir[u], v; i; i=nxt[i]) 135 { 136 if(vis[v=ver[i]]) continue; 137 vis[v]=true; 138 139 if((!from[v=ver[i]])||Dfs(from[v])) 140 { 141 from[v]=u; 142 return true; 143 } 144 } 145 return false; 146 } 147 148 int main() 149 { 150 while(scanf("%d%d", &n, &m)!=EOF) 151 { 152 cur=0, ans=0; 153 memset(fir, 0, sizeof fir); 154 memset(from, 0, sizeof from); 155 156 for(int u=1, v, k; u<=n; u++) 157 { 158 scanf("%d", &k); 159 for(int i=1; i<=k; i++) 160 { 161 scanf("%d", &v); 162 Add(u, v); 163 } 164 } 165 166 for(int i=1; i<=n; i++) 167 { 168 memset(vis, 0, sizeof vis); 169 ans+=Dfs(i); 170 } 171 172 cout<<ans<<endl; 173 } 174 return 0; 175 } 176 177 178 179 180 /************************************************** 181 182 模版:二分图最佳匹配 183 题目:POJ2195 Going Home 184 185 **************************************************/ 186 187 #include<iostream> 188 #include<cstring> 189 #include<cstdio> 190 #define Min(a, b) ((a)<(b)?(a):(b)) 191 #define Abs(a) ((a)>0?(a):-(a)) 192 using namespace std; 193 const int maxn=100+10; 194 const int INF=0x7f7f7f7f; 195 196 int n, m, ch, cm; 197 int lx[maxn*maxn], ly[maxn], w[maxn*maxn][maxn], from[maxn], del; 198 bool vx[maxn*maxn], vy[maxn]; 199 struct node 200 { 201 int x, y; 202 node(int a=0, int b=0){ x=a, y=b; } 203 }ph[maxn], pm[maxn*maxn]; 204 205 int Dis(int a, int b) 206 { 207 return Abs(pm[a].x-ph[b].x)+Abs(pm[a].y-ph[b].y); 208 } 209 210 bool Dfs(int x) 211 { 212 vx[x]=true; 213 for(int y=1; y<=ch; y++) 214 { 215 if(vy[y]) continue; 216 217 int t=lx[x]+ly[y]-w[x][y]; 218 if(!t) 219 { 220 vy[y]=true; 221 if((!from[y])||Dfs(from[y])) 222 { 223 from[y]=x; 224 return true; 225 } 226 } 227 else if(del>t) del=t; 228 } 229 return false; 230 } 231 232 int KM() 233 { 234 for(int i=1; i<=cm; i++) 235 { 236 while(true) 237 { 238 memset(vx, 0, sizeof vx); 239 memset(vy, 0, sizeof vy); 240 del=INF; 241 if(Dfs(i)) break; 242 for(int j=1; j<=cm; j++) if(vx[j]) lx[j]-=del; 243 for(int j=1; j<=ch; j++) if(vy[j]) ly[j]+=del; 244 } 245 } 246 247 int ans=0; 248 for(int i=1; i<=ch; i++) if(from[i]) ans+=w[from[i]][i]; 249 return ans; 250 } 251 252 int main() 253 { 254 int T=0; 255 while(scanf("%d%d", &n, &m)!=EOF&&n+m) 256 { 257 ch=cm=0; 258 memset(ly, 0, sizeof ly); 259 memset(from, 0, sizeof from); 260 char s[maxn]; 261 262 for(int i=1; i<=n; i++) 263 { 264 scanf("%s", s+1); 265 for(int j=1; j<=m; j++) 266 { 267 if(s[j]==‘H‘) ph[++ch]=node(i, j); 268 else if(s[j]==‘m‘) pm[++cm]=node(i, j); 269 } 270 } 271 272 for(int i=1; i<=cm; i++) 273 { 274 lx[i]=-INF; 275 for(int j=1; j<=ch; j++) 276 { 277 w[i][j]=-Dis(i, j); 278 lx[i]=Min(lx[i], w[i][j]); 279 } 280 } 281 282 cout<<-KM()<<endl; 283 } 284 return 0; 285 } 286 287 288 289 290 /************************************************** 291 292 模版:二维树状数组 293 题目:CQBZ1909 二维区间的和 294 295 **************************************************/ 296 297 #include<iostream> 298 #include<cstdio> 299 #include<cstring> 300 #define lowbit(i) ((i)&(-i)) 301 using namespace std; 302 const int maxn=1500+10; 303 304 int n,a[maxn][maxn]; 305 306 void get_int(int &num) 307 { 308 char c; bool f=false; 309 for(; c=getchar(),c<‘0‘||c>‘9‘; (c==‘-‘)&&(f=true)); 310 for(num=c-48; c=getchar(),c>=‘0‘&&c<=‘9‘; num=num*10+c-48); 311 f&&(num=-num); 312 return ; 313 } 314 315 void Add(int x, int y, int t) 316 { 317 for(int i=x+1; i<=n; i+=lowbit(i)) 318 for(int j=y+1; j<=n; j+=lowbit(j)) 319 a[i][j]+=t; 320 return ; 321 } 322 323 int Sum(int x,int y) 324 { 325 int ans=0; 326 for(int i=x+1; i; i-=lowbit(i)) 327 for(int j=y+1; j; j-=lowbit(j)) 328 ans+=a[i][j]; 329 return ans; 330 } 331 332 int main() 333 { 334 int d, x1, y1, t, x2, y2; 335 336 scanf("%d%d", &d, &n); 337 while(scanf("%d",&d)&&d!=3) 338 { 339 if(d==1) 340 { 341 get_int(x1), get_int(y1), get_int(t); 342 Add(x1,y1,t); 343 } 344 else 345 { 346 get_int(x1), get_int(y1), get_int(x2), get_int(y2); 347 printf("%d\n", Sum(x2,y2)+ Sum(x1-1,y1-1)- Sum(x1-1,y2)- Sum(x2,y1-1)); 348 } 349 } 350 return 0; 351 } 352 353 354 355 356 /************************************************** 357 358 模版:高精度 359 题目:高精度加减乘除 360 361 **************************************************/ 362 363 #include<iostream> 364 #include<fstream> 365 #include<cstring> 366 #include<cstdio> 367 using namespace std; 368 typedef long long lint; 369 const int MAXN=5010; 370 struct node 371 { 372 long long n[MAXN],lim; 373 node(){ memset(n,0,sizeof(n));n[0]=1LL;lim=10000LL; } 374 bool operator <(node a) const 375 { 376 if(n[0]!=a.n[0]) return n[0]<a.n[0]; 377 for(int i=n[0];i>=1;i--) 378 if(n[i]!=a.n[i]) return n[i]<a.n[i]; 379 return false; 380 } 381 bool operator >(node a) const 382 { 383 if(n[0]!=a.n[0]) return n[0]>a.n[0]; 384 for(int i=n[0];i>=1;i--) 385 if(n[i]!=a.n[i]) return n[i]>a.n[i]; 386 return false; 387 } 388 bool operator ==(node a) const 389 { 390 if(n[0]!=a.n[0]) return false; 391 for(int i=1;i<=n[0];i++) 392 if(n[i]!=a.n[i]) return false; 393 return true; 394 } 395 void operator +=(lint a) 396 { 397 n[1]+=a; 398 for(int i=1;i<=n[0];i++) 399 { 400 n[i+1]+=(n[i]/lim); 401 n[i]%=lim; 402 if(i==n[0]&&n[i+1]) ++n[0]; 403 } 404 } 405 node operator +(lint a) 406 { 407 node t=*this; 408 t+=a; 409 return t; 410 } 411 void operator +=(node a) 412 { 413 n[0]=max(n[0],a.n[0]); 414 for(int i=1;i<=n[0];i++) n[i]+=a.n[i]; 415 for(int i=1;i<=n[0];i++) 416 { 417 n[i+1]+=(n[i]/lim); 418 n[i]%=lim; 419 if(i==n[0]&&n[i+1]) ++n[0]; 420 } 421 } 422 node operator +(node a) 423 { 424 node t=*this; 425 t+=a; 426 return t; 427 } 428 void operator -=(lint a) 429 { 430 n[1]-=a; 431 for(int i=1;n[i]<0&&i<n[0];i++) 432 while(n[i]<0) n[i]+=lim,n[i+1]-=1; 433 for(;!n[n[0]]&&n[0]>1;--n[0]); 434 } 435 node operator -(lint a) 436 { 437 node t=*this; 438 t-=a; 439 return t; 440 } 441 void operator -=(node a) 442 { 443 for(int i=1;i<=n[0];i++) 444 { 445 if(n[i]<a.n[i]) n[i]+=lim,n[i+1]-=1; 446 n[i]-=a.n[i]; 447 } 448 for(;!n[n[0]]&&n[0]>1;--n[0]); 449 } 450 node operator -(node a) 451 { 452 node t=*this; 453 t-=a; 454 return t; 455 } 456 void operator *=(lint a) 457 { 458 for(int i=1;i<=n[0];i++) n[i]*=a; 459 for(int i=1;i<=n[0];i++) 460 { 461 n[i+1]+=(n[i]/lim); 462 n[i]%=lim; 463 if(i==n[0]&&n[i+1]) ++n[0]; 464 } 465 } 466 node operator *(lint a) 467 { 468 node t=*this; 469 t*=a; 470 return t; 471 } 472 void operator *=(node a) 473 { 474 node c; 475 c.n[0]=n[0]+a.n[0]-1; 476 for(int i=1;i<=n[0];i++) 477 for(int j=1;j<=a.n[0];j++) 478 c.n[i+j-1]+=n[i]*a.n[j]; 479 for(int i=1;i<=c.n[0];i++) 480 { 481 c.n[i+1]+=(c.n[i]/以上是关于model的主要内容,如果未能解决你的问题,请参考以下文章