预计分数 70 + 30 + 60
实际分数 50 + 0 + 60
感觉这套题不错
做题顺序竟然是 T3 T2 T1
通读全篇
感觉T3的30分暴力是送分的,就先写了T3的暴力,然后看数据,模数相同,然后想到用链表可以轻松过60分,lgj竟然用的是莫对%%%%%
T3的30分是一个裸地爆搜,甚至任何剪枝都不需要,轻松些了出来,然而是可以过第一个样例的,第二个样例并没有使,然而0分,
原因是:读题不认真,没有看到各个数字可以重复,然后就GG
T1没有任何思路,然后看到部分分的特征乱搞了50分
总结:读题要认真,多读几遍,不要读错任何条件,要不然就是00000
T1 ci相同,按照高度排序,枚举从每个点开始跳
跳楼的集合 话费有一个 C 的和,与跳楼顺序无关
从低往高 或者 从高往低
从低往高排序,按照高度
hi < h (i+1)
枚举最高的楼和最低的楼
i, j
i + 1, j - 1;
h
没有影响
正解:
f[i][j] 在第i栋楼,已经跳了j栋楼的最小花费
从低的楼到高的楼
f[k][j+1] = min{f[k][j+1], f[i][j] + c[k] + h[k] - h[i]};
找到f[i][j]fit
T2
a1 < a2 < a3 < a4
b1 < b2 < b3 < b4 ...
a1 + a2 = b1
a1 + a3 = b2
a2 + a3 = x;
calc a1 a2 a3
求出后删掉
确定 a2 + a3
枚举 a2 + a3 = b 里面的那个数
找一个数在一个数组中出现过
T3
数据结构题
链表
比较好理解
100 %
对p分块
大于10000时数据没有意义
% 后相同
0, 1, 2, 3,.... p - 1;
总空间 p*n TLE
不能对all p预处理
只对 1 <=p <= 100; 预处理,相同于60%
p > 100;
不预处理
每次询问
l, r, p, v;
%p = v
v + k * p;有贡献
k最多到100
v + kp <= 10000;
k<= 100;
枚举这100个数
f[1000][1000]
直接将数值加入数组
先不%p
将两种不同的p分别进行暴力
T1
//std #include <algorithm> #include <cstdio> const int N = 105; struct Building{ int h, c; bool operator<(const Building &x)const{ return h < x.h; } }; Building B[N]; int n, f[N][N]; int main() { freopen("meet.in", "r", stdin); freopen("meet.out", "w", stdout); scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", &B[i].c); for (int i = 0; i < n; ++i) scanf("%d", &B[i].h); int T; scanf("%d", &T); std::sort(B, B + n); int ans = 0; for (int i = 0; i < n; ++i) if ((f[1][i] = B[i].c) <= T) ans = 1; for (int i = 2; i <= n; ++i) for (int j = 0, minv = T + 1; j < n; ++j) { if ((f[i][j] = minv + B[j].h + B[j].c) <= T) ans = i; minv = std::min(minv, f[i - 1][j] - B[j].h); } printf("%d ", ans); return 0; }
T2
//30 暴力 #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <map> #define LL long long using namespace std; const int N = 10; int c[N], a[N], imp[20], n; bool vis[N]; int answer, js, sb; struct Node{ int ans[N]; }Ans[N]; map <LL, bool> mp; inline int read() { int x = 0, f = 1; char c = getchar(); while(c < '0' || c > '9'){if(c == '-') f = -1; c = getchar();} while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f; } bool pd() { int tot = 0; for(int i = 1; i < n; i ++) for(int j = i + 1; j <= n; j ++) imp[++ tot] = a[i] + a[j]; sort(imp + 1, imp + sb + 1); for(int i = 1; i <= sb; i ++) if(c[i] != imp[i]) return 0; return 1; } void dfs(int step) { if(step == n + 1) { if(pd()) { int tmp[10]; for(int i = 1; i <= n; i ++) tmp[i] = a[i]; sort(tmp + 1, tmp + n + 1); LL impo = 0; for(int i = 1; i <= n; i ++) impo = impo * 10 + tmp[i]; if(!mp[impo] && impo) { answer ++; for(int i = 1; i <= n; i ++) Ans[answer].ans[i] = tmp[i]; mp[impo] = 1; } } return ; } for(int i = 1; i <= 10; i ++) { if( i >= step) { a[++ js] = i; dfs(step + 1); js --; } } } inline bool cmp(Node a, Node b) { for(int i = 1; i <= n; i ++) if(a.ans[i] > b.ans[i]) return 1; return 0; } int main() { n = read(); double nn = (double) n; double n2 = (nn - 1) / 2; double impe = nn * n2; sb = (int)impe; for(int i = 1; i <= sb; i ++) c[i] = read(); sort(c + 1, c + sb + 1); dfs(1); sort(Ans + 1, Ans + answer + 1, cmp); printf("%d ", answer); for(int i = 1; i <= answer; i ++) { for(int j = 1; j <= n; j ++) printf("%d ", Ans[i].ans[j]); printf(" "); } return 0; } /* 4 3 5 4 7 6 5 */
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; const int maxn=310; int n,m,res[maxn],ans[maxn][maxn],z[maxn*maxn],cnt; bool use[maxn*maxn]; void check(int p) { memset(use,false,sizeof(use)); if ((z[1]+z[2]+z[p])&1) return; res[1]=(z[1]+z[2]+z[p])/2-z[p]; res[2]=z[1]-res[1]; res[3]=z[2]-res[1]; use[1]=use[2]=use[p]=true; for (int a=4,b=3;a<=n;a++) { while (b<=m && use[b]) b++; if (b>m) return; res[a]=z[b]-res[1]; use[b]=true; for (int c=2;c<a;c++) { if (res[c]>res[a]) return; int v=res[c]+res[a]; int p=lower_bound(z+1,z+m+1,v)-z; if (z[p]!=v) return; int px=p; while (px && z[px]==z[p]) px--; px++; while (px<=m && z[px]==z[p] && use[px]) px++; if (z[px]!=z[p] || use[px]) return; p=px; use[p]=true; } } cnt++; for (int a=1;a<=n;a++) ans[cnt][a]=res[a]; } int main() { freopen("city.in","r",stdin); freopen("city.out","w",stdout); scanf("%d",&n); m=n*(n-1)/2; for (int a=1;a<=m;a++) scanf("%d",&z[a]); sort(z+1,z+m+1); for (int a=3;a<=m;) { check(a); int b=a; while (b<=m && z[b]==z[a]) b++; a=b; } printf("%d ",cnt); for (int a=1;a<=cnt;a++) for (int b=1;b<=n;b++) { printf("%d",ans[a][b]); if (b==n) printf(" "); else printf(" "); } return 0; }
T3
//60分暴力 #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int N = 1e5 + 10; int f[N], head[N]; int a[N]; int n, m, now = 1; inline int read() { int x = 0, f = 1; char c = getchar(); while(c < '0' || c > '9'){if(c == '-') f = -1; c = getchar();} while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f; } struct Node{ int u, v, nxt; }E[N]; void add(int u, int v) { E[now].u = u; E[now].v = v; E[now].nxt = head[u]; head[u] = now ++; } int main() { freopen("light.in", "r", stdin); freopen("light.out", "w", stdout); n = read(); m = read(); for(int i = 1; i <= n; i ++) a[i] = read(); if(n <= 1000 && m <= 1000) { for(int i = 1; i <= m; i ++) { int l = read(); int r = read(); int lgj = read(); int v = read(); int answer = 0; for(int j = l; j <= r; j ++) if(a[j] % lgj == v) answer ++; printf("%d ", answer); } return 0; } for(int i = 0; i <= 10000; i ++) head[i] = -1; int impl = read(); int impr = read(); int implgj = read(); int impv = read(); for(int i = 1; i <= n; i ++) a[i] %= implgj; for(int i = 1; i <= n; i ++) add(a[i], i); int ls = 0; for(int i = head[impv]; ~ i; i = E[i].nxt) { int v = E[i].v; if(v >= impl && v <= impr) ls ++; } printf("%d ", ls); for(int i = 2; i <= m; i ++) { int l = read(); int r = read(); int my = read(); int u = read(); int answer = 0; for(int j = head[u]; ~ j; j = E[j].nxt) { int v = E[j].v; if(v >= l && v <= r) answer ++; } printf("%d ", answer); } return 0; } /* 5 2 1 5 2 3 7 1 3 2 1 2 5 3 0 */
//std #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 100009; const int maxv = 10000; const int bsz = 100; const int maxb = 103; int n, m; int a[maxn], vb[maxb][maxb], ve[maxb][maxb]; int xb[maxn], xe[maxn]; int i_buf[maxn * maxb * 2], tib; void pre() { memset(ve, 0, sizeof(ve)); memset(xe, 0, sizeof(xe)); for (int i = 1; i <= n; ++ i) ++ xe[a[i]]; for (int i = 0; i <= maxv; ++ i) { xb[i] = tib; tib += xe[i]; xe[i] = xb[i]; } for (int i = 1; i <= n; ++ i) i_buf[xe[a[i]] ++] = i; for (int m = 1; m <= bsz; ++ m) { for (int i = 1; i <= n; ++ i) ++ ve[m][a[i] % m]; for (int i = 0; i < m; ++ i) { vb[m][i] = tib; tib += ve[m][i]; ve[m][i] = vb[m][i]; } for (int i = 1; i <= n; ++ i) i_buf[ve[m][a[i] % m] ++] = i; } } int queryb(int l0, int r0, int p, int k) { if (vb[p][k] == ve[p][k]) return 0; int *x1 = lower_bound(i_buf + vb[p][k], i_buf + ve[p][k], l0); int *x2 = upper_bound(i_buf + vb[p][k], i_buf + ve[p][k], r0); return x2 - x1; } int querys(int v, int l0, int r0) { if (xb[v] == xe[v]) return 0; int *x1 = lower_bound(i_buf + xb[v], i_buf + xe[v], l0); int *x2 = upper_bound(i_buf + xb[v], i_buf + xe[v], r0); return x2 - x1; } int querya(int l0, int r0, int p, int k) { int ans = 0; for (int i = k; i <= maxv; i += p) ans += querys(i, l0, r0); return ans; } int main() { freopen("light.in", "r", stdin); freopen("light.out", "w", stdout); scanf("%d%d", &n, &m); tib = 0; for (int i = 1; i <= n; ++ i) scanf("%d", a + i); pre(); while (m --) { int l, r, p, k; scanf("%d%d%d%d", &l, &r, &p, &k); if (p <= bsz) printf("%d ", queryb(l, r, p, k)); else printf("%d ", querya(l, r, p, k)); } }