首页 > 其他分享 >10.16 补题记录

10.16 补题记录

时间:2024-10-16 19:59:00浏览次数:1  
标签:std 一个点 记录 int read 补题 lll return 10.16

https://codeforces.com/gym/105386/problem/E
E题:要求gcd最大值然后可以改变一次数组使选中的那一节增大k,然后我们一开始想dp[i][0/1][0/1]来维护前i个里这个数加k/不加k,以及之前加k/不加k,看起来非常的完美吧 然后wa15了,是因为我们每次只记录了一个点的一种值 但是一个点有可能会有好几个值,然后就要震惊了gcd数值的个数只和你数值里的最大值有关 然后大概的数量关系是log(MA)然后我们这里最大值就1e18大概就18个完全够我们for一下 所以我们可以优化一层n只需要既然上一个点的所有gcd可能值在此基础上转移就不会爆
void solve() {
int n, k;
std::cin >> n >> k;
std::vectora(n + 1), pa(n + 2), sa(n + 2);

for (int i = 1; i <= n; ++i) {
    std::cin >> a[i];
    pa[i] = std::gcd(pa[i - 1], a[i]);
}

std::vector<int>b(n + 1);
for (int i = 1; i <= n; ++i) {
    b[i] = a[i] + k;
}

for (int i = n; i; --i) {
    sa[i] = std::gcd(sa[i + 1], a[i]);
}

int ans = pa[n];

std::set<int>st[2];
for (int r = 1; r <= n; ++r) //你遍历到一个r要么是他是开头又是结尾(对应int t 的特判) 要么他前一个也变了(对应下面那个循环lst)
{
    int now = r & 1, lst = now ^ 1;
    //now是0时lst就是1 反正相反
    for (auto& x : st[lst]) 
    {
        int t = std::gcd(x, b[r]);//从前一个变了转移过来
        st[now].insert(t);//保存了把当前r这个点替换了的gcd
    }

    int t = std::gcd(pa[r - 1], b[r]);//这里表示只有r这一个点替换的gcd
    st[now].insert(t);

    st[lst].clear();//每次把这个清空了下一次就直接用了 因为这里的now 和 lst是交替的 因为这一次的now就是下一次的lst

    for (auto& x : st[now]) {
        int w = std::gcd(x, sa[r + 1]);
        ans = std::max(ans, w);//统计一下最后的答案 就是再gcd上后面那一段
    }

}

std::cout << ans << "\n";

}

https://codeforces.com/gym/105386/problem/M
M题:看起来挺好想的 就是很难写 就算是我们先找到里第一个点最远的合法点 然后不断枚举下一个点作为开头 这个时候另外一个点只会不断逆时针转 不可能倒回去 就是这个计算和判断很难写 会想到很复杂 好吧可能是高中忘光光的缘故吧看了题解感觉是学过的 但是全部忘记啦!!!但是下次先把这些公式单独写出来就会变得好清晰
// 叉乘(https://www.cnblogs.com/gxcdream/p/7597865.html)
lll cross(P a, P b)//两个向量
{
return a.x * b.y - a.y * b.x; // 计算新加点是否在左边界与圆心连线的另一侧(>0表示a向量在b的左边)同时如果把ab移到统一起点或者终点的话 这个值还表示这个三角形的面积的两倍
}

// 点积
lll mul(P a, P b)//得到的结果反应出两个向量的夹角(<0就是钝角)
{
return a.x * b.x + a.y * b.y;
}

// 点平方和
lll mul(P a)
{
return a.x * a.x + a.y * a.y;
}

// 计算矢量
P del(P a, P b)
{
return {a.x - b.x, a.y - b.y};
}

void solve()
{
int n;
read(n);

P C;
read(C.x);
read(C.y);

lll R;
read(R);

vector<P> a(n);
for (int i = 0; i < n; i++)
{
    read(a[i].x);
    read(a[i].y);
}
lll ans = 0;
lll S = 0;
for (int l = 0, r = l + 1; l < n; l++)
{
    while (1)
    {
        // 处理首尾循环
        int rr = r % n + 1;
        // 计算新加点是否在左边界与圆心连线的另一侧
        lll s = cross(del(a[rr], a[l]), del(C, a[l]));
        // 如果在另一侧,说明新加边与圆相交或凸包包含了圆,移动l
        if (s <= 0)
            break;
        // s同时也是新加边与圆心构成的三角形的面积的两倍,利用s=len*d计算边与圆心的距离
        // 如果距离小于R,说明新加边与圆相交,移动l
        if (s * s < mul(del(a[rr], a[l])) * R * R)//(mul(del(a[rr], a[l])) * R)是垂直与R的
            break;
        // 利用叉乘公式计算凸包新增加的三角形面积
        S += cross(del(a[r], a[l]), del(a[rr], a[l]));
        // 移动r
        r = rr;
    }
    ans = max(ans, S);
    // 处理首尾循环
    int ll = l % n + 1;
    // 减去左边界的三角形面积
    S -= cross(del(a[r], a[l]), del(a[r], a[ll]));
}
write(ans);
putchar('\n');

}

标签:std,一个点,记录,int,read,补题,lll,return,10.16
From: https://www.cnblogs.com/d-p-n-i-/p/18470799

相关文章

  • 10.16 模拟赛
    炼石计划9月29日NOIP模拟赛#5【补题】-比赛-梦熊联盟(mna.wang)复盘T1有80的暴力。想了一会正解但不会做于是放弃了。T2。怎么这么像双栈排序?操作3是什么鬼?\(n\le5\)爆搜不会打?不管了先跳了。T3。一眼蒙德里安的梦想+矩阵加速。复杂度未知,说不定是正解,不......
  • 【CTF-SHOW】Web入门 Web27-身份证日期爆破 【关于bp intruder使用--详记录】
    1.点进去是一个登录系统,有录取名单和学籍信息发现通过姓名和身份证号可以进行录取查询,推测录取查询可能得到学生对应学号和密码,但是身份证号中的出生日期部分未知,所以可以进行爆破2.打开bp抓包这里注意抓的是学院录取查询系统发送POST类型进行查询的包,第一遍抓不到很正......
  • Linux命令(10.16)
    linux命令ifconfig查看IP地址serviceiptablesstop关闭防火墙serviceiptablesstart开启防火墙serviceiptablesrestart重启防火墙serviceiptablesstatus查看防火墙状态ssh+ip地址链接虚拟机su切换用户名su+root切换超级用户cat/etc......
  • 24.10.16
    A算一个区间选两端点的贡献,可以二分出从哪里往左,哪里往右,然后前缀和后缀和搞一下。然后得到了\(O(n^2k)\)的做法。然后猜一下决策单调性,打表发现每一层真的有决策单调性。然后人类智慧维护决策点每次往后取随机数\(\bmod200\)个更新决策点就过了。然后经典二分+单调队列......
  • 10.16
    好的,让我们逐句解析这段代码,并分析其总体功能。逐句解析#include<bits/stdc++.h>usingnamespacestd;引入标准库,bits/stdc++.h是一个包含常用C++标头文件的头文件,简化了包含过程。constintmod=1e9+7;定义常量mod,值为(10^9+7),用于取模运算,防止大数溢出。......
  • 10.16测试分类
    软件测试之测试分类一、按开发阶段划分1、单元测试2、集成测试3、系统测试4、验收测试二、按查看代码划分1、黑盒测试定义:黑盒测试也是功能测试,测试中把被测试的软件当成一个黑盒子,不关心盒子的内部结构是什么,只关心软件的输入数据和输出数据比如:计算器当作黑盒子:输入1+......
  • 10.16
    一.单选题(共8题,16分)1. (单选题,2分) 下列传统并行计算框架,说法错误的是哪一项? A刀片服务器、高速网、SAN,价格贵,扩展性差上B共享式(共享内存/共享存储),容错性好C编程难度高D实时、细粒度计算、计算密集型2. (单选题,2分) 下列关于MapReduce模......
  • git 修改之前提交记录的某几次记录的账号和邮箱
    修改Git提交记录的作者名和邮箱最近在使用Git时,遇到了一个需求:修改某些提交记录中的提交名和邮箱。由于提交时误用了错误的姓名和邮箱,历史记录中的几次提交需要更新。发现使用gitrebase结合gitcommit--amend是一种比较优雅的方式,可以灵活修改历史记录中的提交名和邮箱......
  • 10.16
    A判断完是决策单调性之后决定回来写(埋下伏笔),B的题面不好看直接跳了,发现C是小清新数据结构,一个小时内会了,又断断续续写了三个小时,最后剩20min急忙码完A的暴力。60+0+90鉴定为菜就多练。A.共享单车决策单调性板题,\(O(n^2k)\)暴力,打个表,发现决策单调性,套上来就行了。B.......
  • 10.16
    java完成栈回文操作importjava.util.Stack;importjava.util.Scanner;publicclassMain{publicstaticbooleanisPalindrome(Stringstr){//使用栈存储字符串的字符Stack<Character>stack=newStack<>();//将字符串的每个字符压入栈中for(char......