zoukankan      html  css  js  c++  java
  • [BZOJ]2161: 布娃娃

     题解:  对于每个点 表示的区间做个差分  在L[I]位置插入 R[i]+1的位置删除 然后对离散化后的C[I]用线段树维护区间第K大即可

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <cmath>
    #include <set>
    #include <map>
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define link(x) for(edge *j=h[x];j;j=j->next)
    #define inc(i,l,r) for(int i=l;i<=r;i++)
    #define dec(i,r,l) for(int i=r;i>=l;i--)
    const int MAXN=3e5+10;
    const double eps=1e-8;
    #define ll long long
    const int mod=19921228;
    using namespace std;
    struct edge{int t,v;edge*next;}e[MAXN<<1],*h[MAXN],*o=e;
    void add(int x,int y,int vul){o->t=y;o->v=vul;o->next=h[x];h[x]=o++;}
    ll read(){
        ll x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
        return x*f;
    }
    
    
    int P[MAXN],C[MAXN],L[MAXN],R[MAXN];
    int n;
    typedef struct node{
        int x,y;
        friend bool operator<(node aa,node bb){return aa.x<bb.x;}
    }node;
    node d1[MAXN],d2[MAXN];
    int cnt1,cnt2;
    int sum[MAXN<<2];
    vector<int>vec;
    void update(int x,int l,int r,int t,int k){
        sum[x]+=k;
        if(l==r)return ;
        int mid=(l+r)>>1;
        if(t<=mid)update(x<<1,l,mid,t,k);
        else update(x<<1|1,mid+1,r,t,k);
    }
    
    int ans1;
    void query(int x,int l,int r,int k){
        if(l==r){ans1=l;return ;}
        int mid=(l+r)>>1;
        if(sum[x<<1]>=k)query(x<<1,l,mid,k);
        else query(x<<1|1,mid+1,r,k-sum[x<<1]);
    }
    
    
    int main(){
        n=read();
        int t1,t2,t3,t4;
        t1=read();t2=read();t3=read();t4=read();
        P[1]=t2%t3;
        inc(i,2,n)P[i]=(1ll*P[i-1]*t4+t1+i)%t3;
        t1=read();t2=read();t3=read();t4=read();
        C[1]=t2%t3;
        inc(i,2,n)C[i]=(1ll*C[i-1]*t4+t1+i)%t3;
        t1=read();t2=read();t3=read();t4=read();
        L[1]=t2%t3;
        inc(i,2,n)L[i]=(1ll*L[i-1]*t4+t1+i)%t3;
        t1=read();t2=read();t3=read();t4=read();
        R[1]=t2%t3;
        inc(i,2,n)R[i]=(1ll*R[i-1]*t4+t1+i)%t3;
        inc(i,1,n){
    	if(L[i]>R[i])swap(L[i],R[i]);
    	d2[++cnt2]=(node){L[i],C[i]};
    	d2[++cnt2]=(node){R[i]+1,-C[i]};
    	d1[++cnt1]=(node){P[i],i};
    	vec.pb(C[i]);
        }
        sort(d1+1,d1+cnt1+1);sort(d2+1,d2+cnt2+1);
        sort(vec.begin(),vec.end());
        int base=unique(vec.begin(),vec.end())-vec.begin();
        int tot=1;
        ll ans=0;
        inc(i,1,cnt1){
    	while(tot<=cnt2&&d2[tot].x<=d1[i].x){
    	    int t=d2[tot].y;
    	    if(t<0)t*=-1;
    	    t=lower_bound(vec.begin(),vec.begin()+base,t)-vec.begin()+1;
    	    if(d2[tot].y<0)update(1,1,base,t,-1);
    	    else update(1,1,base,t,1);
    	    tot++;
    	}
    	if(sum[1]>=d1[i].y){
    	    query(1,1,base,sum[1]-d1[i].y+1);ans+=vec[ans1-1];ans%=mod;
    	}
        }
        printf("%lld
    ",ans);
        return 0;
    }
    

      

    2161: 布娃娃

    Time Limit: 20 Sec  Memory Limit: 259 MB
    Submit: 405  Solved: 204
    [Submit][Status][Discuss]

    Description

    小时候的雨荨非常听话,是父母眼中的好孩子。在学校是老师的左右手,同学的好榜样。后来她成为艾利斯顿第二
    代考神,这和小时候培养的良好素质是分不开的。雨荨的妈妈也为有这么一个懂事的女儿感到高兴。一次期末考试
    ,雨荨不知道第多少次,再次考了全年级第一名。雨荨的妈妈看到女儿100分的成绩单时,脸上又泛起了幸福的笑
    容,作为奖励,她给雨荨买了n个布娃娃。细心的雨荨发现,第i个布娃娃有一个耐心值P[i]以及一个魅力值C[i],
    并且还有能够忍受的耐心值的上限R[i]以及下限L[i]。当一个布娃娃j满足L[j]<=P[i]并且P[i]<=R[j],那么布娃
    娃j喜欢布娃娃i。雨荨还发现,一个布娃娃有可能喜欢它自己。每个布娃娃心中都有一个谜团,具体来说就是:第
    i个布娃娃想知道喜欢它的布娃娃中,魅力值第i大的布娃娃的魅力值是多少,并且称这个布娃娃的谜团答案为这个
    魅力值的大小,如果不存在,那么这个布娃娃的谜团答案为0。鉴于雨荨的上司栋栋不让题目的数据过大,下面给
    出数据的生成方法:给出16个参数:
    Padd, Pfirst, Pmod, Pprod, Cadd, Cfirst, Cmod, Cprod, Ladd, Lfirst, Lmod, Lprod, Radd, Rfirst, Rmod, Rprod。
    ----------------------------------------------------------------------------------------
    P[1] = Pfirst % Pmod, P[i] = (P[i-1]   Pprod + Padd + i) % Pmod (i > 1)。
    ----------------------------------------------------------------------------------------
    对于C、L、R数组也有类似的得到方式, %代表取余运算。注意:L和R数组生成完之后,如果某个布娃娃的忍耐度上
    限小于下限,那么交换它的上限和下限。当然,雨荨也不会让你告诉她每个布娃娃的谜团答案,因为那样会使输出
    数据很大。所以雨荨希望你告诉她,所有布娃娃谜团答案的和除以19921228的余数是多少。

    Input

    输入的第一行有一个整数n,代表布娃娃的个数。
    输入的第二行有16个用空格隔开的整数
    分别代表Padd,Pfirst,Pmod,Pprod,Cadd,Cfirst,Cmod,Cprod,Ladd,Lfirst,Lmod,Lprod,Radd,Rfirst,Rmod,Rprod。
    16个参数均为1到100,000,000中的整数。
     

    Output

    输出一个整数,代表所有布娃娃谜团答案的和除以19921228的余数。

    Sample Input

    3
    2 3 4 3 1 4 5 2 3 6 9 1 1 2 3 4

    Sample Output

    4

     

  • 相关阅读:
    算法第三章上机实践报告
    算法第3章作业
    算法第二章上机实验报告
    对二分法的理解和关于结对编程的看法
    轮播图终极版
    C语言II博客作业04
    C语言II博客作业03
    C语言II博客作业02
    C语言II博客作业01
    作业01
  • 原文地址:https://www.cnblogs.com/wang9897/p/10360010.html
Copyright © 2011-2022 走看看