在一个有障碍点的 n 行 m 列的网格图中,我们用 (x,y) 来表示第 x 行第 y 列的格子。如果该网格图中的回路满足下面两个条件:
不经过任何一个障碍点
回路不自交
则我们称该回路为合法的简单回路。
现在有 Q 个询问,每次询问有多少条合法的简单回路经过了 (x,y) 与 (x+1,y) 之间的边。
标签:
T1--------------------------------------------------------------------------------------------
应该是插头DP,表示不会打,暴力搞搞30分
CODE:
#include <iostream> #include <cstdio> #include <cstring> #define REP(i, s, n) for(int i = s; i <= n; i ++) #define REP_(i, s, n) for(int i = n; i >= s; i --) #define MAX_N 10000 + 10 #define mod 1000000000 + 7 using namespace std; int n, m, k, q; int map[MAX_N][MAX_N]; int main(){ scanf("%d%d%d", &n, &m, &k); int x, y; memset(map, 0, sizeof(map)); REP(i, 1, k){ scanf("%d%d", &x, &y); map[y][x] = 1; } REP(i, 1, m) map[i][0] = map[i][n + 1] = 1; if(m == 1){ scanf("%d", &q); while(q --){ int x, y; scanf("%d%d", &x, &y); printf("0\n"); } } else if(m == 2){ scanf("%d", &q); while(q --){ int x, y; scanf("%d%d", &y, &x); int tmp = y, l, r; while((!map[1][tmp]) && (!map[2][tmp])) tmp --; l = y - tmp; tmp = y + 1; while((!map[1][tmp]) && (!map[2][tmp])) tmp ++; r = tmp - (y + 1); cout << l * r << endl; } } return 0; }
T2----------------------------------------------------------------------------------------------------------------------------------------------
比赛时打的是20分的暴力,结果得了40。。。
CODE:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define REP(i, s, n) for(int i = s; i <= n; i ++) #define REP_(i, s, n) for(int i = n; i >= s; i --) #define MAX_N 65536 + 10 using namespace std; int n, m; double a, b; struct node{ double X, Y, Z; }P[MAX_N]; double last_res = 0.1; double F(double x) { double l = -1e9, r = 1e9; while (l + 1e-9 < r) { double mid = (l + r) / 2; if (a * mid - b * sin(mid) < x) l = mid; else r = mid; } return (l - 1) / last_res; } double dis(double x1, double y1, double z1, double x2, double y2, double z2){ return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2); } int main(){ scanf("%d%d%lf%lf", &n, &m, &a, &b); REP(i, 1, n){ cin >> P[i].X >> P[i].Y >> P[i].Z; } last_res = 0.1; int c; double x, y, z, r; while(m --){ scanf("%d", &c); if(c == 0){ scanf("%lf%lf%lf%lf", &r, &x, &y, &z); r = F(r); x = F(x); y = F(y); z = F(z); int i = (int)(r + 0.5); P[i].X = x; P[i].Y = y; P[i].Z = z; } else if(c == 1){ scanf("%lf%lf%lf%lf", &x, &y, &z, &r); r = F(r); x = F(x); y = F(y); z = F(z); REP_(i, 1, n){ if (abs(r * r - dis(x, y, z, P[i].X, P[i].Y, P[i].Z)) < 1e-5){ printf("%d\n", i); last_res = i; break; } } } } return 0; }
T3-----------------------------------------------------------------------------------------------------------------------------------------------
稳定婚姻(其实就是贪心)
CODE:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #define REP(i, s, n) for(int i = s; i <= n; i ++) #define REP_(i, s, n) for(int i = n; i >= s; i --) #define MAX_N 200 + 10 #define MAX_M 400 + 10 using namespace std; int n, m, B[MAX_N][MAX_M], G[MAX_N][MAX_N], N[MAX_N]; int M[MAX_N], num[MAX_N]; queue<int> q; int main(){ int T; scanf("%d", &T); while(T --){ scanf("%d%d", &n, &m); REP(i, 1, n) REP(j, 1, m){ scanf("%d", &B[i][j]); G[i][B[i][j]] = j; } REP(i, 1, n) q.push(i); REP(i, 1, n) num[i] = 1; memset(N, 0, sizeof(N)); while(!q.empty()){ int p = q.front(); q.pop(); for(;;num[p] ++){ if(B[p][num[p]]){ int p1 = B[p][num[p]], p2 = N[p1]; if(p2 == 0 || G[p2][p1] < G[p][p1]){ N[p1] = p; if(p2) q.push(p2); num[p] ++; break; } } } } REP(i, 1, n) M[N[i]] = i; REP(i, 1, n) printf("%d ", M[i]); printf("\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/ALXPCUN/p/4569483.html