T1 数列

题目

【题目描述】

长乐培训Day6

【输入格式】

长乐培训Day6

长乐培训Day6

【输出格式】

长乐培训Day6

【输入样例】

长乐培训Day6

【输出样例】

长乐培训Day6

【数据规模】

如上所述。

解析

身为T1,居然比T4还难......让我怎么办......以下为巨佬题解:

长乐培训Day6

我猜你们看了题解估计也不理解(手动滑稽),配合代码一起看吧,我也无能为力了。

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;
int read()
{
    int num=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        num=(num<<1)+(num<<3)+ch-'0';
        ch=getchar();
    }
    return num*w;
}
const int N=400100;
struct rec1{
    int w,pos,num;
}a[N];
struct rec2{
    int x,y,z,num;
}b[N];
struct rec3{
    int tot0;
    long long tot1,tot2;
    rec3 friend operator - (rec3 x,rec3 y)
    {
        return (rec3){x.tot0-y.tot0,x.tot1-y.tot1,x.tot2-y.tot2};
    }
};
int n,q;
long long sum[N*2][3],ans[N];
bool bj[N];
bool cmp1(rec1 x,rec1 y)
{
    return x.w<y.w;
}
bool cmp2(rec2 x,rec2 y)
{
    return x.z<y.z;
}
void insert(int x,int y)
{
    long long g=1ll*y*y;
    for(int i=x;i<=n;i+=(i&-i)) sum[i][0]++,sum[i][1]+=y,sum[i][2]+=g;
}
rec3 find(int x)
{
    rec3 tot=(rec3){0,0,0};
    for(int i=x;i;i-=(i&-i)) tot.tot0+=sum[i][0],tot.tot1+=sum[i][1],tot.tot2+=sum[i][2];
    return tot;
}
void put(long long x)
{
    if(!x){cout<<"0"<<endl;return ;}
    if(x<0) x=-x,cout<<"-";
    int b[20],lenb=0;
    while(x)
    {
        b[++lenb]=x%10;
        x/=10;
    }
    for(int i=lenb;i>=1;i--) cout<<(char)(b[i]+'0');
    cout<<endl;
}
int main()
{
    //freopen("sequence.in","r",stdin);
    //freopen("sequence.out","w",stdout);
    n=read(),q=read();
    for(int i=1;i<=n;i++) a[i].w=read(),a[i].pos=read(),a[i].num=i;
    sort(a+1,a+n+1,cmp1);
    for(int i=1;i<=q;i++) b[i].x=read(),b[i].y=read(),b[i].z=read(),b[i].num=i;
    sort(b+1,b+q+1,cmp2);
    int j=0;
    for(int i=1;i<=q;i++)
    {
        while(j+1<=n&&a[j+1].w<=b[i].z) insert(a[j+1].num,a[j+1].pos),j++;
        rec3 tot=find(b[i].y)-find(b[i].x-1);
        if(!tot.tot0){bj[b[i].num]=1;continue;}
        ans[b[i].num]=tot.tot2*tot.tot0-2*tot.tot1*tot.tot1+tot.tot1*tot.tot1;
    }
    for(int i=1;i<=q;i++)
        if(bj[i]) cout<<"empty"<<endl;
        else put(ans[i]);
    return 0;
    //fclose(stdin);
    //fclose(stdout);
}
View Code

相关文章: