zoukankan      html  css  js  c++  java
  • Lucas的数列

    description

    image-20200805164735305

    solution

    看到分母,先推式子,不难推出,(K=mcdot sum_{i=1}^{m}x_{i}^{2} +(sum_{i=1}^{m} x_{i})^{2}),明显满足区间减法,于是可以考虑直接用主席树维护,但空间不允许我们这么做.

    由于本题可以离线计算,统一输出答案,所以我们不妨将元素和查询一同输入,然后将其按(w)(z)从小到大排序,若相同,元素在查询前头.所以我们可以使用树状数组或线段树进行维护.

    code

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    #define R register
    #define next MabLcdG
    #define mod 1
    #define Mod(x) ((x%mod+mod)%mod)
    using namespace std;
    typedef long long ll;
    typedef long double ld;
    typedef unsigned long long ull;
    inline ll read();
    inline void write(ll x);
    inline void writesp(ll x);
    inline void writeln(ll x);
    ll n,m;
    const ll maxn=400001;
    struct node{
    	ll w;
    	ll l,r;
    	ll id;
    	bool operator <(node X)const{return w==X.w?id<X.id:w<X.w;}
    }t[maxn<<1];
    ll dat[maxn*3+(maxn>>1)],dat1[maxn*3+(maxn>>1)],dat2[maxn*3+(maxn>>1)];
    ll tot;
    inline void update(ll p,ll l,ll r,ll u){
    	if(l==r){
    		dat[p]++;dat1[p]+=t[u].l*t[u].l;dat2[p]+=t[u].l;
    		return;
    	}
    	ll mid=l+r>>1;
    	if(t[u].r<=mid) update(p<<1,l,mid,u);
    	else update(p<<1|1,mid+1,r,u);
    	dat[p]=dat[p<<1]+dat[p<<1|1];
    	dat1[p]=dat1[p<<1]+dat1[p<<1|1];
    	dat2[p]=dat2[p<<1]+dat2[p<<1|1];
    }
    ll ans1,ans2,ans3;
    ll ans[maxn];
    inline void query(ll p,ll l,ll r,ll u,ll v){
    	if(u<=l&&r<=v){
    		ans1+=dat[p];ans2+=dat1[p];ans3+=dat2[p];
    		return;
    	}
    	ll mid=l+r>>1;
    	if(u<=mid) query(p<<1,l,mid,u,v);
    	if(v>mid) query(p<<1|1,mid+1,r,u,v);
    }
    int main(){
    	freopen("sequence.in","r",stdin);
    	freopen("sequence.out","w",stdout);
    //	writeln((sizeof t+sizeof dat+sizeof dat1+sizeof dat2+sizeof ans)>>20);
    	n=read();m=read();
    	for(R ll i=1;i<=n;i++){
    		t[++tot].w=read();t[tot].l=read();t[tot].r=i;
    	}
    	for(R ll i=1;i<=m;i++){
    		t[++tot].l=read();t[tot].r=read();t[tot].id=i;t[tot].w=read();
    	}	
    	sort(t+1,t+tot+1);
    	for(R ll i=1;i<=tot;i++){
    //		writesp(t[i].w);writesp(t[i].l);writeln(t[i].r);
    		if(!t[i].id){
    			update(1,1,n,i);
    		}
    		else{
    			ans1=ans2=ans3=0;
    			query(1,1,n,t[i].l,t[i].r);
    //			writeln(ans1*ans2-ans3*ans3);
    			ans[t[i].id]=ans1*ans2-ans3*ans3;
    			if(!ans1) ans[t[i].id]=-1;
    		}
    	}
    	for(R ll i=1;i<=m;i++){
    		if(ans[i]==-1) puts("empty");
    		else writeln(ans[i]);
    	}
    }
    inline ll read(){ll x=0,t=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') t=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*t;}
    inline void write(ll x){if(x<0){putchar('-');x=-x;}if(x<=9){putchar(x+'0');return;}write(x/10);putchar(x%10+'0');}
    inline void writesp(ll x){write(x);putchar(' ');}
    inline void writeln(ll x){write(x);putchar('
    ');}
    
  • 相关阅读:
    metadata
    java.net.SocketException: Permission denied 连网权限
    JUnit4 测试
    web生成工具
    Linux scp 两台服务器传输文件
    eclipse 无法导入项目
    html 流动字幕 marquee 标签 jquery
    libSVM 简易入门
    程序员创业指导书
    svm(libsvm)在文本分类中的应用
  • 原文地址:https://www.cnblogs.com/ylwtsq/p/13441154.html
Copyright © 2011-2022 走看看