「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. Boost的反射库PFR

    目录 目录 简介 使用方法 限制 总结 简介 Boost.PFR是一个Boost 1.75版本出的C++14的基础反射库,其使用非常简单,非常便捷,但是适用性也比较差,有很多的地方无法使用,适合比较简 ...

  2. Histogram Processing

    目录 HISTOGRAM EQUALIZATION 代码示例 HISTOGRAM MATCHING (SPECIFICATION) 其它 Gonzalez R. C. and Woods R. E. ...

  3. Essentially No Barriers in Neural Network Energy Landscape

    目录 梗概 主要内容 path的定义 path的逼近 Mechanical Model Nudged Elastic Band 局部最优 Draxler F, Veschgini K, Salmhof ...

  4. Capstone CS5213|HDMI转VGA|CS5213设计参考电路

    Capstone CS5213是一款HDMI到VGA转换器结合了HDMI输入接口和模拟RGB DAC输出且带支持片上音频数模转换器.CS5213芯片设计简单,整体芯片尺寸精悍,外围电路集成优化度较高, ...

  5. 使用 jQuery对象设置页面中 <ul> 元素的标记类型,并使用 DOM 对象设置 <li> 元素的浮动属性和右边距。使用jQuery 对象和 DOM 对象设置页面元素属性

    查看本章节 查看作业目录 需求说明: 使用 jQuery对象设置页面中 <ul> 元素的标记类型,并使用 DOM 对象设置 <li> 元素的浮动属性和右边距.使用jQuery ...

  6. [学习笔记] Oracle字符串函数、日期函数、数值函数、转换函数、聚合函数

    函数 单行函数:对一行数据进行操作的函数,如字符串函数.数值函数.转换函数.日期函数等. 聚合函数:同时对多行数据进行操作,如求和函数等. 字符串函数 函数 说明 ASCII(X) 求字符X的ASCI ...

  7. oracle 之 while循环月份

    需求 需要跑一个数据,时间从17年5月到21年3月. 代码(简单粗暴实现) DECLARE i number; BEGIN i:= 201705; WHILE i <202104 LOOP if ...

  8. Selenium_浏览器窗口大小(6)

    import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driv ...

  9. spring security 登出操作 详细说明

    1.前言 这里专门 做 spring security 登出操作 的  详细记录 2.操作 (1)目录结构 (2)在security 拦截规则配置文件添加退出登录支持 源码 package com.e ...

  10. scrollTop、scrollHeight与clientHeight

    MDN上概念 scrollTop:获取或设置一个元素的内容垂直滚动的像素数. scrollHeight:一个元素内容高度的度量,包括由于溢出导致的视图中不可见内容. clientHeight:元素内部 ...