2016长乐夏令营 Day4
2016-07-13 16:22
344 查看
T1:
模拟。。开一排const char
T2:
可以发现,无论这两个函数按什么顺序复合,始终是2^k*x + 2^k-1的形式,而k <= 30W,枚举一遍取最优即可
T3:
先BFS算出每个人跑向各个洞口所需的时间设为t,把每个洞口拆成T个点,每个人向对应洞口的第t到T个点连边,最后一遍最大流即可
现场没写出来,写的时候每个人没有连t+1到T的点
T4:
最小生成树+LCA,模板题
写的时候存边的数组没乘2。。。为了长乐的老爷机没有用vector的后果
模拟。。开一排const char
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<stack> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; const char n0[5][3] = {' ','-',' ','|',' ','|',' ',' ',' ','|',' ','|',' ','-',' '}; const char n1[5][3] = {' ',' ',' ',' ',' ','|',' ',' ',' ',' ',' ','|',' ',' ',' '}; const char n2[5][3] = {' ','-',' ',' ',' ','|',' ','-',' ','|',' ',' ',' ','-',' '}; const char n3[5][3] = {' ','-',' ',' ',' ','|',' ','-',' ',' ',' ','|',' ','-',' '}; const char n4[5][3] = {' ',' ',' ','|',' ','|',' ','-',' ',' ',' ','|',' ',' ',' '}; const char n5[5][3] = {' ','-',' ','|',' ',' ',' ','-',' ',' ',' ','|',' ','-',' '}; const char n6[5][3] = {' ','-',' ','|',' ',' ',' ','-',' ','|',' ','|',' ','-',' '}; const char n7[5][3] = {' ','-',' ',' ',' ','|',' ',' ',' ',' ',' ','|',' ',' ',' '}; const char n8[5][3] = {' ','-',' ','|',' ','|',' ','-',' ','|',' ','|',' ','-',' '}; const char n9[5][3] = {' ','-',' ','|',' ','|',' ','-',' ',' ',' ','|',' ','-',' '}; char ch[200]; int k,s; void Work(int i,int t) { if (t == 0) { printf("%c",n0[i][0]); for (int l = 0; l < k; l++) printf("%c",n0[i][1]); printf("%c",n0[i][2]); } else if (t == 1) { printf("%c",n1[i][0]); for (int l = 0; l < k; l++) printf("%c",n1[i][1]); printf("%c",n1[i][2]); } else if (t == 2) { printf("%c",n2[i][0]); for (int l = 0; l < k; l++) printf("%c",n2[i][1]); printf("%c",n2[i][2]); } else if (t == 3) { printf("%c",n3[i][0]); for (int l = 0; l < k; l++) printf("%c",n3[i][1]); printf("%c",n3[i][2]); } else if (t == 4) { printf("%c",n4[i][0]); for (int l = 0; l < k; l++) printf("%c",n4[i][1]); printf("%c",n4[i][2]); } else if (t == 5) { printf("%c",n5[i][0]); for (int l = 0; l < k; l++) printf("%c",n5[i][1]); printf("%c",n5[i][2]); } else if (t == 6) { printf("%c",n6[i][0]); for (int l = 0; l < k; l++) printf("%c",n6[i][1]); printf("%c",n6[i][2]); } else if (t == 7) { printf("%c",n7[i][0]); for (int l = 0; l < k; l++) printf("%c",n7[i][1]); printf("%c",n7[i][2]); } else if (t == 8) { printf("%c",n8[i][0]); for (int l = 0; l < k; l++) printf("%c",n8[i][1]); printf("%c",n8[i][2]); } else if (t == 9) { printf("%c",n9[i][0]); for (int l = 0; l < k; l++) printf("%c",n9[i][1]); printf("%c",n9[i][2]); } for (int l = 0; l < s; l++) printf(" "); } int main() { #ifdef DMC freopen("DMC.txt","r",stdin); freopen("test.txt","w",stdout); #else freopen("adraw.in","r",stdin); freopen("adraw.out","w",stdout); #endif cin >> k >> s; scanf("%s",ch); int len = strlen(ch); for (int i = 0; i < 5; i++) { if (i % 2 == 0) { for (int j = 0; j < len; j++) { int t = ch[j] - '0'; Work(i,t); } printf("\n"); } else for (int l = 0; l < k; l++) { for (int j = 0; j < len; j++) { int t = ch[j] - '0'; Work(i,t); } printf("\n"); } } return 0; }
T2:
可以发现,无论这两个函数按什么顺序复合,始终是2^k*x + 2^k-1的形式,而k <= 30W,枚举一遍取最优即可
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<stack> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; typedef long long LL; const LL mo = 1000000007LL; const int maxn = 1E5 + 10; LL n,k1[maxn],b1[maxn],k2[maxn],b2[maxn]; int f[maxn*3],bo[maxn*3]; int main() { #ifdef DMC freopen("DMC.txt","r",stdin); #else freopen("number.in","r",stdin); freopen("number.out","w",stdout); #endif cin >> n; bo[0] = bo[2] = 1; f[2] = 1; for (int i = 3; i <= 300000; i++) { f[i] = ~0U>>1; if (bo[i-2]) bo[i] = 1,f[i] = min(f[i],f[i-2]+1); if (bo[i-3]) bo[i] = 1,f[i] = min(f[i],f[i-3]+1); } int ans = ~0U>>1; LL mi = 2; for (int i = 2; i <= 300000; i++) { mi = mi*2LL%mo; LL now = (n*mi%mo + mi-1LL+mo)%mo; if (now % mo == 0) ans = min(ans,f[i]); } cout << ans; return 0; }
T3:
先BFS算出每个人跑向各个洞口所需的时间设为t,把每个洞口拆成T个点,每个人向对应洞口的第t到T个点连边,最后一遍最大流即可
现场没写出来,写的时候每个人没有连t+1到T的点
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<stack> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; const int maxn = 200; const int maxm = 3E6 + 30; const int cx[4] = {0,1,0,-1}; const int cy[4] = {1,0,-1,0}; struct P{ int x,y; P(int _x = 0,int _y = 0){x = _x; y = _y;} }; struct E{ int to,cap,flow,from; E(int _to = 0,int _cap = 0,int _flow = 0,int _from = 0){to = _to; cap = _cap; flow = _flow; from = _from;} }edgs[maxm*2]; char p[20][20]; int ans,n,m,t,h,d,dis[20][20],ti[maxn][maxn],hx[maxn],hy[maxn],dx[maxn],dy[maxn] ,cur,tot,tail[maxm],dn[maxn][maxn],L[maxm],last[maxm]; bool vis[maxm]; queue <int> q; void Add(int x,int y,int w) { edgs[cur] = E(y,w,0,tail[x]); tail[x] = cur++; edgs[cur] = E(x,0,0,tail[y]); tail[y] = cur++; } bool BFS() { for (int i = 0; i <= tot; i++) L[i] = 0; q.push(0); L[0] = 1; while (!q.empty()) { int k = q.front(); q.pop(); for (int i = tail[k]; i != -1; i = edgs[i].from) { if (edgs[i].flow == edgs[i].cap || L[edgs[i].to]) continue; L[edgs[i].to] = L[k] + 1; q.push(edgs[i].to); } } return L[tot]; } int Dicnic(int x,int a) { if (!a || x == tot) return a; int flow = 0; for (int &i = last[x]; i != -1; i = edgs[i].from) { if (L[edgs[i].to] - L[x] != 1) continue; if (edgs[i].cap == edgs[i].flow) continue; int f = Dicnic(edgs[i].to,min(a,edgs[i].cap - edgs[i].flow)); if (f) { a -= f; flow += f; edgs[i].flow += f; edgs[i^1].flow -= f; if (!a) return flow; } } return flow; } int main() { #ifdef DMC freopen("DMC.txt","r",stdin); #else freopen("escape.in","r",stdin); freopen("escape.out","w",stdout); #endif for (int i = 0; i <= 300000; i++) tail[i] = -1; cin >> n >> m >> t; for (int i = 0; i < n; i++) { scanf("%s",p[i]); for (int j = 0; j< m; j++) { if (p[i][j] == 'O') { ++d; dx[d] = i; dy[d] = j; } if (p[i][j] == 'P') { ++h; hx[h] = i; hy[h] = j; Add(0,h,1); } } } tot = h; for (int i = 1; i <= d; i++) for (int j = 1; j <= t; j++) dn[i][j] = ++tot; ++tot; for (int i = 1; i <= d; i++) for (int j = 1; j <= t; j++) Add(dn[i][j],tot,1); for (int i = 1; i <= h; i++) { for (int x = 0; x < n; x++) for (int y = 0; y < m; y++) dis[x][y] = ~0U>>1; dis[hx[i]][hy[i]] = 0; queue <P> Q; Q.push(P(hx[i],hy[i])); while (!Q.empty()) { P k = Q.front(); Q.pop(); for (int j = 0; j < 4; j++) { int xx = k.x + cx[j]; int yy = k.y + cy[j]; if (xx < 0 || xx == n || yy < 0 || yy == m) continue; if (dis[xx][yy] != ~0U>>1 || p[xx][yy] == '*') continue; dis[xx][yy] = dis[k.x][k.y] + 1; Q.push(P(xx,yy)); } } for (int j = 1; j <= d; j++) if (dis[dx[j]][dy[j]] < ~0U>>1) for (int l = dis[dx[j]][dy[j]]; l <= t; l++) Add(i,dn[j][l],1); } while (BFS()) { for (int i = 0; i <= tot; i++) last[i] = tail[i]; ans += Dicnic(0,~0U>>1); } cout << ans; return 0; }
T4:
最小生成树+LCA,模板题
写的时候存边的数组没乘2。。。为了长乐的老爷机没有用vector的后果
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<stack> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; const int maxn = 3E4 + 10; struct E{ int x,y,w; bool operator < (const E &b) const { return w < b.w; } E(int _x = 0,int _y = 0,int _w = 0){x = _x; y = _y; w = _w;} }edgs[maxn*10]; int cur,ans,n,m,f[maxn],fa[maxn][20],cost[maxn][20], tail[maxn],to[maxn],v[maxn],from[maxn],L[maxn]; int fat(int x) { return x == f[x]?x:f[x] = fat(f[x]); } void Add(int x,int y,int w) { from[++cur] = tail[x]; to[cur] = y; v[cur] = w; tail[x] = cur; from[++cur] = tail[y]; to[cur] = x; v[cur] = w; tail[y] = cur; } void dfs(int x) { for (int i = 1; i < 20; i++) { fa[x][i] = fa[fa[x][i-1]][i-1]; cost[x][i] = max(cost[x][i-1],cost[fa[x][i-1]][i-1]); } for (int i = tail[x]; i; i = from[i]) { if (L[to[i]]) continue; L[to[i]] = L[x] + 1; fa[to[i]][0] = x; cost[to[i]][0] = v[i]; dfs(to[i]); } } void LCA(int p,int q) { if (L[p] < L[q]) swap(p,q); int Log; for (Log = 0; L[p] - (1<<Log) >= 1; Log++); --Log; for (int j = Log; j >= 0; j--) if (L[p] - (1<<j) >= L[q]) { ans = max(ans,cost[p][j]); p = fa[p][j]; } if (p == q) return; for (int j = Log; j >= 0; j--) if (fa[p][j] != fa[q][j]) { ans = max(ans,cost[p][j]); ans = max(ans,cost[q][j]); p = fa[p][j]; q = fa[q][j]; } ans = max(ans,cost[q][0]); ans = max(ans,cost[p][0]); } int main() { #ifdef DMC freopen("DMC.txt","r",stdin); #else freopen("cost.in","r",stdin); freopen("cost.out","w",stdout); #endif cin >> n >> m; for (int i = 1; i <= n; i++) f[i] = i; for (int i = 0; i < m; i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); edgs[i] = E(x,y,z); } sort(edgs,edgs + m); for (int i = 0; i < m; i++) { int fx = fat(edgs[i].x); int fy = fat(edgs[i].y); if (fx != fy) { f[fx] = fy; Add(edgs[i].x,edgs[i].y,edgs[i].w); } } L[1] = 1; dfs(1); int t; cin >> t; while (t--) { int x,y; scanf("%d%d",&x,&y); ans = 0; LCA(x,y); printf("%d\n",ans); } return 0; }
相关文章推荐
- WDS+MDT部署Windows7操作系统2—;导入启动映像和安装映像
- WDS+MDT部署Windows7操作系统3—ADK安装和MDT
- easy ui 行内编辑数据并保存
- WDS+MDT部署Windows7操作系统4—建立部署共享
- WDS+MDT部署Windows7操作系统5—导入操作系统wim文件
- [组合计数] BZOJ 3505 [Cqoi2014]数三角形
- Qt学习之路(52): 拖放技术之一
- Android自定义开关(可滑动,点击)
- HDU4497GCD and LCM ——算数基本定理
- WDS+MDT部署Windows7操作系统6—创建任务序列
- iOS应用内支付(IAP)详解
- 用C#用C#实现窗体在规定时间弹出,例如:10:00.弹出后关闭。并在5分钟后再次弹出。5次后停止。最好有具体代码实现窗体在规定时间弹出,例如:10:00.弹出后关闭。并在5分钟后再次弹出。5次后停止。最好有具体代码
- C#多线程学习之(五)使用定时器进行多线程的自动管理
- iOS 第三方框架大全
- WDS+MDT部署Windows7操作系统—部署操作系统
- Server 2012 R2 RMS文档管理系统
- JZOJ1421. 二叉树
- 批量导出AD账号
- 2015年河北省成人高校招生考试准考证打印及查询
- MDT客户端PXE不能启动