T1 数列
题目
【题目描述】
【输入格式】
【输出格式】
【输入样例】
【输出样例】
【数据规模】
如上所述。
解析
身为T1,居然比T4还难......让我怎么办......以下为巨佬题解:
我猜你们看了题解估计也不理解(手动滑稽),配合代码一起看吧,我也无能为力了。
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); }