「CTSC 2011」排列

要求不存在公差为 A 或者公比为 B 的子列,那么实际上可以把该问题转化为求一个图的最优拓朴序。

任意差为 A 或者比为 B 的两个数连一条边。

求一个合法序列的答案可以用树状数组。

接下来如果直接用优先队列计算最小拓朴序就可以得到32分的好成绩。

如上方法复杂度为\(o(nlog(n))\),远远小于给定时限。

尝试引入随机算法。

每个数都定义一个优先级\(rank\)。

用爬山求出局部最优解:

​ 每次先随机生成\(rank\)数组,然后随机一个点,试图将该点$rank $和其它所有点交换。

多爬几次,这里爬\(130-n\)次,每次爬山跑150次。

另外测试点9,10已经给出,打表即可。

#include<bits/stdc++.h>
#define rep(q,a,b) for(int q=a,q##_end_=b;q<=q##_end_;++q)
#define dep(q,a,b) for(int q=a,q##_end_=b;q>=q##_end_;--q)
#define mem(a,b) memset(a,b,sizeof a )
#define debug(a) cerr<<#a<<' '<<a<<"___"<<endl
using namespace std;
void in(int &r) {
static char c;
r=0;
while(c=getchar(),!isdigit(c));
do r=(r<<1)+(r<<3)+(c^48);
while(c=getchar(),isdigit(c));
}
int head[95],to[200],ne[200],cnt1;
#define link(a,b) to[++cnt1]=b,ne[cnt1]=head[a],head[a]=cnt1
#define travel(x) for(int q(head[x]);q;q=ne[q])
int ind[95],rk[95];
struct node{
int v;
bool operator <(const node &A)const{
return rk[v]<rk[A.v];
}
};
priority_queue<node> qw;
int ans[95],n,mid_ind[95],mid[95];
void toposort(){
while(!qw.empty())qw.pop();
rep(q,1,n)mid_ind[q]=ind[q];
int ct=0;
rep(q,1,n)if(!mid_ind[q])qw.push({q});
while(!qw.empty()){
mid[++ct]=qw.top().v;
qw.pop();
travel(mid[ct]){
--mid_ind[to[q]];
if(!mid_ind[to[q]])qw.push({to[q]});
}
}
}
int c[95],c1[95];
void add(int x,int v){
while(x<=n)++c[x],c1[x]+=v,x+=x&-x;
}
int ask(int x,int v){
int sm=0,ct=0;
while(x)ct+=c[x],sm+=c1[x],x&=x-1;
return v*ct-sm;
}
int end_v;
int solve(){
rep(q,1,n)c[q]=0,c1[q]=0;
toposort();
int tot=0;
rep(q,1,n){
tot+=ask(mid[q],mid[q]);
add(mid[q],mid[q]);
}
if(tot>end_v){
end_v=tot;
rep(q,1,n)ans[q]=mid[q];
}
return tot;
}
int sx[95];
int main(){
freopen("pal.in","r",stdin);
freopen("pal.out","w",stdout);
srand(19890519);
int a,b;
in(n),in(a),in(b);
if(n==60&&a==21&&b==3){
puts("48 27 51 30 9 45 24 3 43 22 1 50 29 8 57 36 15 47 26 5 54 33 12 46 25 4 60 39 18 6 44 23 2 42 21 49 28 7 40 19 41 20 52 31 10 53 32 11 55 34 13 56 35 14 58 37 16 59 38 17");
return 0;
}
if(n==90&&a==18&&b==2){
puts("78 60 84 42 66 48 24 30 12 6 75 57 39 21 3 74 56 76 38 58 80 40 20 82 64 46 28 10 86 68 50 32 14 62 88 44 22 70 52 34 16 26 8 4 2 73 55 37 19 1 77 59 41 23 5 79 61 43 25 7 83 65 47 29 11 85 67 49 31 13 90 72 54 36 18 81 63 45 27 9 87 69 51 33 15 89 71 53 35 17");
return 0;
}
rep(q,1,n){
if(a&&a+q<=n)link(a+q,q),++ind[q];
if(q*b<=n&&b!=1)link(b*q,q),++ind[q];
}
int tim=130-n;
rep(q,1,n)rk[q]=q,sx[q]=q;
while(tim--){
random_shuffle(rk+1,rk+n+1);
int ti=150;
int now=solve();
while(ti--){
int to=rand()%n+1;
rep(q,1,n)if(q!=to){
swap(rk[q],rk[to]);
int tmp=solve();
if(tmp>now)now=tmp;
else swap(rk[q],rk[to]);
}
}
}
rep(q,1,n)printf("%d ",ans[q]);
return 0;
}

「CTSC 2011」排列的更多相关文章

  1. 「CTSC 2011」幸福路径

    [「CTSC 2011」幸福路径 蚂蚁是可以无限走下去的,但是题目对于精度是有限定的,只要满足精度就行了. \({(1-1e-6)}^{2^{25}}=2.6e-15\) 考虑使用倍增的思想. 定义\ ...

  2. loj #2509. 「AHOI / HNOI2018」排列

    #2509. 「AHOI / HNOI2018」排列   题目描述 给定 nnn 个整数 a1,a2,…,an(0≤ai≤n),以及 nnn 个整数 w1,w2,…,wn.称 a1,a2,…,an 的 ...

  3. 「状压DP」「暴力搜索」排列perm

    「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...

  4. 「BalticOI 2011」Switch the Lamp On

    Casper is designing an electronic circuit on a \(N \times M\) rectangular grid plate. There are \(N ...

  5. Solution -「CTSC 2018」「洛谷 P4602」混合果汁

    \(\mathcal{Description}\)   Link.   \(n\) 种果汁,第 \(i\) 种美味度为 \(d_i\),每升价格 \(p_i\),一共 \(l_i\) 升.\(m\) ...

  6. loj#2509. 「AHOI / HNOI2018」排列(思维题 set)

    题意 题目链接 Sol 神仙题Orz 首先不难看出如果我们从\(a_i\)向\(i\)连一条边,我们会得到以\(0\)为根的树(因为每个点一定都有一个入度,出现环说明无解),同时在进行排列的时候需要保 ...

  7. 【LOJ】#2509. 「AHOI / HNOI2018」排列

    题解 虽然要求一个dfs序,但是不是从根开始贪心 从最小的点开始贪心,最小的点显然是父亲选了之后马上就选它 那么我们每次把最小的点和父亲合并,两个联通块之间也是如此 对于两个联通块,他们合并的顺序应该 ...

  8. 「ZJOI 2010」 排列计数

    题目链接 戳我 \(Solution\) 其实我们可以发现这题等价于让你求: 用\(1\)~\(n\)的数组成一个完全二叉树使之满足小根堆性质的方案数 于是我们可以考虑\(dp\) 假设我们现在在\( ...

  9. 「BZOJ 2342」「SHOI 2011」双倍回文「Manacher」

    题意 记\(s_R\)为\(s\)翻转后的串,求一个串最长的形如\(ss_Rss_R\)的子串长度 题解 这有一个复杂度明显\(O(n)\)的做法,思路来自网上某篇博客 一个双倍回文串肯定当且仅当本身 ...

随机推荐

  1. 【嵌入式AI】全志 XR806 say hello world

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文介绍了全志 ...

  2. Variational Inference with Normalizing Flow

    目录 概 主要内容 一些合适的可逆变换 代码 Rezende D., Mohamed S. Variational Inference with Normalizing Flow. ICML, 201 ...

  3. [C/C++]linux下c-c++语法知识点归纳和总结

    1.c/c++申请动态内存 在c++中,申请动态内存是使用new和delete,这两个关键字实际上是运算符,并不是函数. 而在c中,申请动态内存则是使用malloc和free,这两个函数是c的标准库函 ...

  4. 【微信小程序云开发】1分钟学会实现上传、下载、预览、删除图片,并且以九宫格展示图片

    大家好,我叫小秃僧 这篇文章是讲解云开发如何上传.下载.预览.删除图片,并且以九宫格展示图片的功能 @ 目录 1. 实现效果 2.JavaScript代码 3.wxml代码 4.wxss代码 1. 实 ...

  5. Ranger-Usersync安装

    Ranger-Usersync安装, 配置数据源Unix,Usersync从Unix拉取Users/Groups的数据源, 对应的Ranger版本0.6.0. IP/机器名 安装软件 运行进程 zdh ...

  6. MySQL数据库常用命令汇总

    -- 查看mysql的当前登陆用户 select user(); -- 列出数据库 show databases; -- 使用数据库 use mysql; describe mysql.user; s ...

  7. Linux常用命令,新手可以看看

    最近在温习了一些linux的命令,这里总结一下,博主使用的系统是Ubuntu,版本如下: 由于博主是做开发的,所有linux只会一些常用的命令,跟那些专业linux大牛当前没的比,为什么Ubuntu而 ...

  8. 在安装pdfplumber时报错 Microsoft Visual C++ 14.0 is required.

    在安装pdfplumber时报下列错误: 解决方法:     更新pip ,因为pip 版本太旧 来自为知笔记(Wiz)

  9. 纯手画WinForm的Alert提示弹出框

    纯手画WinForm的Alert弹框 一.窗体设置 设置以下属性: 属性名 属性值 说明 AutoScaleMode None 确定屏幕分辨率或字体更改时窗体如何缩放 BackColor 103, 1 ...

  10. RBAC: K8s基于角色的权限控制

    文章目录 RBAC: K8s基于角色的权限控制 ServiceAccount.Role.RoleBinding Step 1:创建一个ServiceAccount,指定namespace Step 2 ...