ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

暴力+组合数学+预处理+双指针——cf 1371E1+E2

2020-07-11 11:08:10  阅读:272  来源: 互联网

标签:maxx int ll cf long minx ai 1371E1 E2


E1,暴力+组合数学 对每个x都求一遍就行

/*
在位置i的糖果数量是x+i-1, 所以先把minx和maxx确定下来
当a数组递增排列时,minx=max(minx,ai-i+1)
当a中最大值出现在第一位时,取到maxx=ai
x遍历范围[max(0,minx),max(maxx,n)], 
将ai-x,然后ai只能出现在i及以后,那么从大到小求一个乘积,如果碰到%p=0,就是不行 
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define N 2005 
 
ll n,p,a[N],maxx,minx;
vector<ll>v;
 
int check(ll x){
    ll b[N],mul=1;
    for(int i=1;i<=n;i++)b[i]=a[i]-x+1;
    for(int i=n;i>=1;i--){//值为b[i]的数只能在位置b[i]及以后 
        if(b[i]<=0)b[i]=1;
        mul=mul*(n-b[i]+1-(n-i));
        mul%=p;
        if(mul%p==0)return 0;
    }
    return 1;
}
 
int main(){
    cin>>n>>p;
    for(int i=1;i<=n;i++)cin>>a[i];
/*    n=2000;p=1999;
    for(int i=1;i<=2000;i++)a[i]=i;
*/    minx=0,maxx=0;
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++)
        minx=max(minx,a[i]-i+1);
    maxx=a[n];
    
    for(int i=minx;i<=max(maxx,n);i++)
        if(check(i))v.push_back(i);
    
    cout<<v.size()<<'\n';
    for(auto x:v)cout<<x<<" ";
} 

E2 数据为1e5,像E1那样暴力肯定不行,要先预处理出一个数组b,bi=i-a数组中值<=i的个数,然后用双指针在上面跑

#include<bits/stdc++.h>
using namespace std;
#define N 500005
#define ll long long 

ll n,p,a[N],minx,maxx;

map<ll,ll>b;

int main(){
    cin>>n>>p;
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    sort(a+1,a+1+n);
    minx=0;maxx=max(a[n]-1,n);
    for(int i=1;i<=n;i++)minx=max(minx,a[i]-i+1);
    for(int i=minx;i<=maxx+2*n;i++){
        int pos=upper_bound(a+1,a+1+n,i)-a-1;
        b[i]=i-pos;
        b[i]%=p;b[i]+=2*p;b[i]%=p;
    }
    
    ll p1=minx,p2=minx-1;
    map<ll,ll>mp;
    vector<ll>v;
    for(int x=minx;x<=maxx;x++){
        while(p2<x+n-1){
            ++p2;
            mp[b[p2]]++;
        }
        while(p1<x){
            mp[b[p1]]--;
            p1++;
        }        
        if(mp[x%p]==0)
            v.push_back(x);
    }
    
    cout<<v.size()<<'\n';
    for(auto x:v)cout<<x<<" ";
}

 

标签:maxx,int,ll,cf,long,minx,ai,1371E1,E2
来源: https://www.cnblogs.com/zsben991126/p/13282786.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有