zoukankan      html  css  js  c++  java
  • 省选模拟38 题解

    A. Inverse

    似乎这类问题的套路都是考虑每一个点对。

    然后考虑一个 dp 。

    设 $f_{k,i,j}$ 表示考虑后 $k$ 轮,最终 $i$ 在 $j$ 左面的方案数。

    对于每个 dp 值可以简单枚举翻转区间, $O(n^2)$ 转移。

    然后发现这个玩意可以优化,如果枚举翻转区间的左端点,那么问题是前缀和。

    然后发现现在的问题仍然是前缀和。

    所以对 dp 数组作两次前缀和就完事了。

    考场上看到这个 $n^2$ 的转移就人傻了,没有仔细去想这个式子。

    当发现可以搞个前缀和优化的时候时间已经不多了,所以有些遗憾。

    B. Subsequence

    观察样例可知一个结论,在 $i-1$ 的选择中出现的,在 $i$ 的选择中也会出现。

    所以可以考虑每步贪心选择当前最优。

    当选择了一个权值,贡献是前缀加当前点权值,后缀加自己点权值。

    可以把后缀加的部分视作斜率,于是得到一个简单的根号算法维护重构凸包的算法。

    因为评测机开了 noilinux,所以这个算法没戏。

    我还是太天真了,没有想象到 noilinux 的威力,所以挂成了暴力分。

    正解是一个平衡树维护差分 dp 数组的东西,两个月前打过。

    大概思想就是在平衡树上二分找到合适的位置,然后后缀加当前权值操作。

    C. Convex

    计算几何知识还是太差了。

    求多边形面积不一定非要选多边形上的点,选择原点然后跑叉积可能会大大减轻计算的难度。

    对于绝对值跑个类似旋转卡壳的东西就可以直接维护和。

    然后发现问题分两个部分,一部分形如 $sum limits_{i=l}^r (r-i)*v_i$。

    发现这个玩意作两遍前缀和,然后和前缀和搭配着用就可以解决了。

    另一部分形如 $sum limits_{i=l}^r A imes B_i$,其中 $A,B_i$ 为向量。

    解决这个问题的办法是对 $B_i$ 直接做个前缀和,化开叉积的式子就可以验证是正确的。

  • 相关阅读:
    C语言内存调试技巧—C语言最大难点揭秘
    include .h 以及.cpp的记录
    VS2010中<无法打开包括文件:“iostream.h”:>错误解决方法
    #include<iostream>与#include<iostream.h>的区别
    VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
    【Oracle】Oracle日期格式详解
    【EasyUI】 日期格式化
    【TortoiseGit】TortoiseGit将本地库push到远端
    【Tomcat】解决Eclipse无法添加Tomcat Service问题
    【Tomcat】配置Tomcat
  • 原文地址:https://www.cnblogs.com/skyh/p/12423166.html
Copyright © 2011-2022 走看看