\documentclass{ctexart} \usepackage{graphicx} \usepackage{amsmath} \usepackage{geometry} \usepackage{lmodern} \usepackage{fontspec} \usepackage{pdfpages} \usepackage{listings} \geometry{a4paper,scale=0.75} \pagestyle{empty} \begin{document} \includepdf[pages=-]{4.pdf} \includepdf[pages=-]{省选基础算法.pdf} \includepdf[pages=-]{1.pdf} \includepdf[pages=-]{2.pdf} \includepdf[pages=-]{3.pdf} \section*{hxd's debug list} \begin{quotation} ACM本就逆风而行,在去机房的路上被风吹翻很正常。 \end{quotation} \begin{itemize} \item 线段树要开4倍内存 \item cin跑得超级慢 \item memset 比 for循环快得多 \begin{itemize} \item memset总是清空整个数组,有时候只清理要用到的部分用for也许更好。 \end{itemize} \item 有多组数据时要清空全局变量(以及各种队列) \item \texttt{std::accumulate} 的返回类型由第三个参数(初始值)决定。 \item 进bfs的时候要记得push初始状态。 / front后记得pop。 \item 检查输出编号是否在范围内(0)。 \item 检查不存在可行解时的输出(-1)。 \item cin不仅跑得慢,而且跑得超级无敌螺旋飞天香蕉船慢。 \item 当你怎么样都过不了的时候(显然不会TLE的东西TLE了或者RE),试试把数组开大十倍,有可能是题面打错了。 \item explicit specialization of 'template struct std::hash' outside its namespace must use a nested-name-specifier [-fpermissive]. for example: struct std::hash > but not struct hash > \item 看题目数据范围,或许会出现$r-l \leq 2$这样的东西。 \end{itemize} \includepdf[pages=-]{A_brief_introduction_to_pb_ds_for_ICPC.pdf} \includepdf[pages=-]{ICPC_Howtos_20190428.pdf} \section*{模拟退火} \begin{lstlisting} #include #include #include #include #include using namespace std; double y; double F(double x) { return 6 * pow(x, 7) + 8 * pow(x, 6) + 7 * pow(x, 3) + 5 * pow(x, 2) - y * x; } double Rand01() { return rand() / (double)RAND_MAX; } double Rand(double T) { int f = rand() & 1; return (f ? -1 : 1) * T * Rand01(); } int main() { srand(time(NULL)); int Case; scanf("%d", &Case); while (Case--) { scanf("%lf", &y); double T = 100, T_end = 1e-6, d = 0.85, ans = F(0); // T 初始温度,T_end 结束冷却温度,d 降温系数,ans 答案 double x_now = 0, x_next; while (T > T_end) { for (int i = 0; i < 2; i++) { x_next = x_now + Rand(T); //他手写的rand就是【-1,1】随机 取一个然后*t*(1 or -1) if (x_next < 0 || x_next > 100) continue; //不科学就continue double f_next = F(x_next), f_now = F(x_now); //计算现在与之前的值 double delta = f_next - f_now; //计算差值 cout << x_now << x_next << Rand01() << endl; if (delta < 0 || Rand01() < exp(-delta / T)) { // delta<0表示下一个解比当前解更优哇 // (函数值更小)或者是概率接受记死exp(-delta/T) x_now = x_next; //修改啊哈哈 ans = min(ans, f_next); //题目要求最小x是ans } } T *= d; //降温啦啦啦 } printf("%.4f\n", ans); } return 0; } \end{lstlisting} \begin{verbatim} #include using namespace std; const int maxn = 1e3 + 5; const double inf = 1e80; struct xd { double a, b, c, d; } xx[maxn]; int n; double l; struct Point { double x, y; }; double dis(Point x, Point y) { return sqrt((x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y)); } double cos(double a, double b, double c) { return (b * b + c * c - a * a) / (2 * b * c); } double dis(Point x, Point a, Point b) { double l1 = dis(x, a); double l2 = dis(x, b); double l3 = dis(a, b); if (cos(l1, l2, l3) < 0) return l2; if (cos(l2, l1, l3) < 0) return l1; double p = (l1 + l2 + l3) / 2; double area = sqrt(p * (p - l1) * (p - l2) * (p - l3)); return area * 2 / l3; } double dis(double x, Point a, Point b) { return dis({x, 0}, a, b); } double f(double x) { double mi = inf; for (int i = 1; i <= n; i++) { Point aa; aa.x = xx[i].a, aa.y = xx[i].b; Point bb; bb.x = xx[i].c, bb.y = xx[i].d; mi = min(mi, dis(x, aa, bb)); } return mi; } double rand01() { return rand() / (double)RAND_MAX; } double randnext(double T) { int sgn = rand() & 1; double haha = (sgn ? -1 : 1) * T * rand01(); return haha; } int p[15]; int mls = 15; int main() { int Tt; scanf("%d", &Tt); while (Tt--) { srand(time(NULL)); scanf("%d%lf", &n, &l); for (int i = 1; i <= n; i++) { scanf("%lf%lf%lf%lf", &xx[i].a, &xx[i].b, &xx[i].c, &xx[i].d); } for (int i = 0; i < mls; i++) p[i] = rand01() * l; double T = l, Tend = 1e-5, d = 0.95, ans = -1e100; double id = 0; double pos = 0; while (T > Tend) { for (int i = 0; i < mls; i++) { double inmin = -1e100; double pmin = p[i]; for (int i = 0; i < mls; i++) { double add = randnext(T); if (add + p[i] > l || add + p[i] < 0) continue; double tp = add + p[i]; double nexhi = f(tp); double delta = inmin - nexhi; if (delta < 0) { pmin = tp; inmin = nexhi; } } p[i] = pmin; if (inmin > ans) { ans = inmin; pos = pmin; } } T *= d; } cerr << pos << endl; printf("%.3lf\n", ans); } } \end{verbatim} \end{document}