zoukankan      html  css  js  c++  java
  • CF444B DZY Loves FFT 题解

    Codeforces
    Luogu

    Description.

    随机生成一个排列 \(\{a_i\}\) 和一个 01 序列 \(\{b_i\}\)
    \(c_{i+j}=\max_{i,j}a_i\cdot b_j\)

    Solution.

    学不会乱搞

    首先发现随机生成,必然乱搞。

    发现如果 1 比较多,那从大到小枚举然后覆盖,枚举完前 \(K\) 个就基本没有剩下了。
    然后直接对剩下的答案暴力枚举就行了

    如果 1 比较少,那直接枚举答案,每个答案从所有 \(b_j\)\(1\) 的地方转移过来就行了。

    然后就做完了。

    Coding.

    点击查看代码
    //是啊,你就是那只鬼了,所以被你碰到以后,就轮到我变成鬼了{{{
    #include<bits/stdc++.h>
    using namespace std;typedef long long ll;
    template<typename T>inline void read(T &x)
    {
    	x=0;char c=getchar(),f=0;
    	for(;c<48||c>57;c=getchar()) if(!(c^45)) f=1;
    	for(;c>=48&&c<=57;c=getchar()) x=(x<<1)+(x<<3)+(c^48);
    	f?x=-x:x;
    }
    template<typename T,typename...L>inline void read(T &x,L&...l) {read(x),read(l...);}//}}}
    int n,D,X,a[100005],b[100005],rs[200005],id[100005];vector<int>vc;
    inline int rnd() {return X=(X*37ll+10007)%1000000007;}
    inline void init()
    {
    	for(int i=0;i<n;i++) a[i]=i+1;
    	for(int i=0;i<n;i++) swap(a[i],a[rnd()%(i+1)]);
    	for(int i=0;i<n;i++) b[i]=i<D;
    	for(int i=0;i<n;i++) swap(b[i],b[rnd()%(i+1)]);
    	//for(int i=0;i<n;i++) printf("%d%c",a[i],i==n-1?'\n':' ');
    	//for(int i=0;i<n;i++) printf("%d%c",b[i],i==n-1?'\n':' ');
    }
    int main()
    {
    	read(n,D,X),init();const int M=sqrt(n);
    	for(int i=0;i<n;i++) if(b[i]) vc.push_back(i);
    	for(int i=0;i<n;i++) id[a[i]]=i;
    	for(int i=max(n-M,0);i<=n;i++) for(auto j:vc) rs[id[i]+j]=i;
    	for(int i=0;i<n;i++) if(!rs[i])
    		{for(auto j:vc) if(j>i) break;else rs[i]=max(rs[i],a[i-j]);}
    	for(int i=0;i<n;i++) printf("%d\n",rs[i]);
    	return 0;
    }
    
  • 相关阅读:
    逆向技术汇总
    绕过安全软件设置注册表
    内存空间中的句柄,指针,对象,类
    COM组件的逆向
    组策略设置隔离文件夹
    VS2015驱动环境配置
    python批量提取eml附件
    反沙箱——SetErrorMode
    CrypMic分析报告
    反调试——jmp到那个地址
  • 原文地址:https://www.cnblogs.com/pealfrog/p/15409550.html
Copyright © 2011-2022 走看看