首页 > 其他分享 >2023牛客+杭电补题和总结记录(后半)

2023牛客+杭电补题和总结记录(后半)

时间:2023-08-07 22:46:31浏览次数:42  
标签:node int 位置 杭电 牛客 补题 端点

前半继续写要被编辑器卡飞了,换个档

杭电第六场

\(1002.Pair\ Sum\ and\ Perfect\ Square\)
对于每个位置可以求出该位置的数和哪些位置的数能够组成完全平方数,因为原序列是排列,并且完全平方数个数不多,所以预处理的复杂度不高。(也可以在后续统计过程中处理)
处理出点对以后就变成了二维数点问题。我一开始把所有询问拆成两个端点排序,这样复杂度会基于 \(2*q\)。后来经大佬提点后领悟了,直接对右端点排序,从 \(1\) 处理到 \(n\) 的过程中只需要对于每个位置在树状数组中加进另一个数比自己小的点对,然后在查询时一样用右端点的查询减去左端点-1的查询。此时因为每个位置只有另一维比自己小的点对,矩形区域相减减去了下边多出来的部分,而左边的部分本来就是空的,这样保证了正确性。

Pair Sum and Perfect Square
#include
using namespace std;
const int N = 1e5 + 10;
int t, n, a[N], rec[N], m, ans[N], tree[N], vis[N];
struct node {
    int id, l, r;
}q[N];
inline bool cmp(node x, node y) {
    return x.r == y.r ? x.l < y.l : x.r < y.r;
}
inline void add(int x) {
    for (;x <= n;x += (x & -x))tree[x]++;
}
inline int query(int x) {
    int val = 0;
    for (;x;x -= (x & -x))val += tree[x];
    return val;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> t;
    while (t--) {
        cin >> n;
        for (int i = 1;i <= n;i++) {
            cin >> a[i];
            rec[a[i]] = i;
            tree[i] = 0;
            vis[i] = 0;
        }
        cin >> m;
        for (int i = 1;i <= m;i++) {
            ans[i] = 0;
            cin >> q[i].l >> q[i].r;
            q[i].id = i;
        }
        sort(q + 1, q + m + 1, cmp);
        int tag = 1;
        for (int i = 1;i <= n;i++) {
            for (int j = 1;j * j <= 2 * n;j++) {
                int y = j * j;
                if (y - a[i] > 0 && y - a[i] <= n && vis[rec[y - a[i]]]) {
                    add(rec[y - a[i]]);
                }
            }
            while (q[tag].r <= i && tag <= m) {
                ans[q[tag].id] = query(q[tag].r) - query(q[tag].l - 1);
                tag++;
            }
            vis[i] = 1;
        }
        for (int i = 1;i <= m;i++)cout << ans[i] << '\n';
    }
    return 0;
}

牛客第六场

标签:node,int,位置,杭电,牛客,补题,端点
From: https://www.cnblogs.com/chloris/p/17611098.html

相关文章

  • 牛客周赛 Round 6
    牛客周赛Round6A-游游的数字圈_牛客周赛Round6(nowcoder.com)枚举即可#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){ios::sync_with_stdio(false);cin.tie(nullptr);strings;cin>>s;intans=0;......
  • 记一场很厉害的牛客多校
    破防场。全是诈骗提。但是很有可以学的东西!\(I.\)给定\(n\)个01?串,?可以替换为0或1。称替换完的串集合为该串的生成串。问所有\(n\)个串的生成串集合的并的大小。长度不同的串分开处理。对于长度\(\le20\)的串,暴力枚举生成串,map去重。对于长度\(>20\)的......
  • 暑假补题记5
     题意:就是给你一个数列,让你找出可以组成等差数列的最多元素有多少个 正解: 题解:直接暴力,枚举d,然后二分查找,注意这里要枝剪,减去已经有的最大值就行了#include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<......
  • UNR #7 补题
    意识流题解。那些你不要的场上写了一个二分答案+栈模拟,实在是太蠢了!观察到每次一定会删一个奇数位的和一个偶数位的,最后只有一个奇数位的会保留下来,然后就完了。比特迷宫场上写了一个乱搞:每\(24\)个分一块,对于每块跑出一个最优解。然后把相差\(2^k\)的相同操作不断合并......
  • 2023年牛客多校第五场A
    1:题目链接https://ac.nowcoder.com/acm/contest/57359/A题意:给你一个数组,让你找出区间l,r之间满足l≤i<j<k≤r,ai=ak>aj的个数思路1:我们先找出当前位置x小于x的数有多少个例如:9854515158对应:0000102037你会发现假如有i,k,j满足,则个数为......
  • 2023牛客暑期多校训练营6 GEC
    2023牛客暑期多校训练营6G-Gcd题意:一开始给你一个集合\(S=\lbracex,y\rbrace(x\neqy)\)。然后你可以执行以下两个操作:1.从\(S\)中选择两个元素\(a,b(a\neqb)\),把\(a-b\)加入集合。2.从\(S\)选择2个元素是\(a,b(a\neqb)\),把\(gcd(|a|,|b|)\)加入集合里面。特别......
  • 牛客暑假多校 2023 第六场
    目录写在前面GECBA写在最后写在前面比赛地址:https://ac.nowcoder.com/acm/contest/57360。哈基米牛魔酬宾,哈比下,哈比下,奥利安费,阿米诺斯!以下按照个人向难度排序。G\(a-b\)相当于辗转相减,\(\gcd(|a|,|b|)\)和直接\(\gcd\)没什么区别。于是当\(z=0\)时,\(x,y\)中一......
  • 暑假集训D11 2023.8.4 补题
    题意给定一个数组\(a\).询问区间\([l,r]\)是否可以分成\(k\)段,每一段的和都是\(2\)的倍数(偶数)考虑前缀和\(sum\),如果\(sum[i]-sum[j-1]\)是偶数,那么\([j,i]\)一定是\(1\)个合法的区间.因此对于询问\(l,r\),可以统计前缀和的值为偶数的个数,......
  • 【题解】[2023牛客多校] Distance
    题目传送门:[2023牛客多校]Distance题意对于任意两个元素个数相同的set:A、B,每次可以执行以下两种操作之一:将A中的任意元素加一将B中的任意元素加一\(C(A,B)\)含义为将\(A、B\)改变为完全相同的set所需要花费的最小次数;初始给你两个set:\(S、T\),计算\(\sum_{A\subs......
  • 暑假集训D10 2023.8.3 补题
    D.DnDDice给出分别有不同个数的\(4,6,8,12,20\)面骰子,\(k\)面骰子的每个面的点数分别是\(1~k\).问用上所有骰子能组合出来的情况的概率从大到小排序,如果有相同的可能性的情况,按任意顺序即可.\(\operatorname{Solution}\)可以将骰子两两合并,合并后的骰子大小为\([m......