首页 > 其他分享 >2023年牛客多校第五场A

2023年牛客多校第五场A

时间:2023-08-05 17:34:07浏览次数:47  
标签:cnt int 第五场 sum pos 多校 牛客 edge pan

1:题目链接

https://ac.nowcoder.com/acm/contest/57359/A

题意:

给你一个数组,让你找出区间l,r之间满足 l ≤ i < j < k ≤ r, ai = ak > aj 的个数

思路

1:我们先找出当前位置x小于x的数有多少个
例如:9 8 5 4 5 1 5 1 5 8
对应:0 0 0 0 1 0 2 0 3 7
你会发现假如有i,k,j满足,则个数为c[k]-c[i];
这一部分通过树状数组实现

2:找区间满足,通过莫队,其实就是莫队的板子

代码:

点击查看代码
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N = 5e6,md = 1e9+7,B = 700;


struct NOW{
    int l;
    int r;
    int site;
}edge[N];
int a[N],ans[N],cnt[N],sum,pan[N];
int n,m,x;
int b[N],c[N];
bool cmp(NOW w,NOW s)
{
    int xx = w.l/B,yy = s.l/B;
    if(xx != yy)
    return xx < yy;
    else
    {
        if(xx%2)
        return w.r < s.r;
        else
        return w.r > s.r;
    }
}
void add(int u)
{
    sum += abs(pan[a[u]] - cnt[a[u]]*b[u]);//当前加入的
    cnt[a[u]]++;//计算看是否重复出现
    pan[a[u]]+=b[u];
}
void sub(int u)
{
    sum -= abs(pan[a[u]] - cnt[a[u]]*b[u]);
    cnt[a[u]]--;
    pan[a[u]]-=b[u];
}
void modify(int x)
{
    for(;x<=N;)
    {
        c[x]++;
        x += (x&-x);
    }
}
int query(int x)
{
    int res = 0;
    for(;x;)
    {
        res += c[x];
        x-= (x&-x);
    }
    return res;
}
void solve()
{
	cin >> n >> m;
	for(int i = 1;i <= n;i ++)//找前面有多少个小于当前的数
    {
        cin >> a[i];
        b[i] = query(a[i]-1);
        modify(a[i]);
    }
	for(int i = 1;i <= m;i ++)
	{
	    int l,r;
	    cin >> l >> r;
	    edge[i] = {l,r,i};
	}
	sort(edge+1,edge+m+1,cmp);//莫队
	int res = 0,pos = 1;
	for(int i = 1;i <= m;i ++)
	{
	    while(res < edge[i].r) res++,add(res);
	    while(res > edge[i].r) sub(res),res--;
	    while(pos < edge[i].l) sub(pos),pos++;
	    while(pos > edge[i].l) pos--,add(pos);
	    ans[edge[i].site] = sum;
	}
	for(int i = 1;i <= m;i ++)
	{
	   cout << ans[i] << '\n';
	}
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t = 1;
	while(t--)
	{
		solve();
	}
}

标签:cnt,int,第五场,sum,pos,多校,牛客,edge,pan
From: https://www.cnblogs.com/ljmxmu/p/17608276.html

相关文章

  • 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|)\)加入集合里面。特别......
  • HDU 暑假多校 2023 第六场
    目录写在前面733673417345733773397338写在最后写在前面补题地址:https://acm.hdu.edu.cn/listproblem.php?vol=64,题号7336~7346。哈哈,单刷5题,我是只会做套路题的飞舞。Boc'z那个单曲太牛逼了,最喜欢的一首,但是live上唱的这首是真难绷。以下按个人向难度排序。7336显然......
  • 牛客暑假多校 2023 第六场
    目录写在前面GECBA写在最后写在前面比赛地址:https://ac.nowcoder.com/acm/contest/57360。哈基米牛魔酬宾,哈比下,哈比下,奥利安费,阿米诺斯!以下按照个人向难度排序。G\(a-b\)相当于辗转相减,\(\gcd(|a|,|b|)\)和直接\(\gcd\)没什么区别。于是当\(z=0\)时,\(x,y\)中一......
  • 2023年多校联训NOIP层测试3+「SFCOI-3」Sadness Fan Club Round 3
    2023年多校联训NOIP层测试3T1数列变换\(10pts\)考虑暴力,发现\(f\)数列进行一次变换\(A\),再进行一次变换\(B\)后,恢复成了原数列;\(f\)数列进行一次变换\(B\),再进行一次变换\(A\)后,也恢复成了原数列。即变换\(A\)可以和变换\(B\)相互抵消。本质是差分是前缀......
  • 【题解】[2023牛客多校] Distance
    题目传送门:[2023牛客多校]Distance题意对于任意两个元素个数相同的set:A、B,每次可以执行以下两种操作之一:将A中的任意元素加一将B中的任意元素加一\(C(A,B)\)含义为将\(A、B\)改变为完全相同的set所需要花费的最小次数;初始给你两个set:\(S、T\),计算\(\sum_{A\subs......
  • 牛客网项目开发学习
    牛客网项目SpringSpringIocInversionofControl控制反转,是一种面向对象编程的设计思想。DependencyInjection依赖注入,是IOC思想的实现方式。IocContainerIoc容器,是实现依赖注入的关键,本质上是一个工厂。SpringMVC三层架构:表现层,业务层,数据访问层。MVC:Model模型......
  • 牛客多校友谊赛
    D-吹_23暑假友谊赛No.2(nowcoder.com)#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;constintN=1e6+50,INF=0x3f3f3f3f;inta[N],dp[N][2];signedmain(){intn;cin>>n;for......
  • 暑假牛客多校第五场 2023-7-31(G、D、H)
    未补完G.GotoPlayMaimaiDX算法:双指针做法:从左到右用两个指针维护一段区间且右指针不断右移,当这个区间满足题目所给的性质,我们取出区间长度,然后再将左指针右移,直到右指针到边界且左指针指到不符合题目的性质的位置结束,期间不断对符合题目性质的区间长度取最小值。code......
  • 2023牛客暑期多校训练营5
    之前落下的每一场比赛都是要补回来的。。。GGotoPlayMaimaiDX题解的想法比较简单,由于找到满足1,2,3出现至少一次,4出现至少k次的最短区间,所以可以双指针,双指针用于这种长度最短,长度越长越容易满足条件的题就很恰当。我没想到双指针,就写的比较麻烦,预处理每个数后一个1,2,3的位置......
  • 2023年多校联训NOIP层测试2
    2023年多校联训NOIP层测试2爆零了T1HDU4786FibonacciTree\(0pts\)@wangyunbiao:不可以,总司令我:不,可以,总司令T2期末考试\(0pts\)T3麻烦的工作\(0pts\)@wangyunbiao:不可以,总司令我:不,可以,总司令T4小X的Galgame\(0pts\)......