「CTSC 2011」排列
「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」排列的更多相关文章
- 「CTSC 2011」幸福路径
		[「CTSC 2011」幸福路径 蚂蚁是可以无限走下去的,但是题目对于精度是有限定的,只要满足精度就行了. \({(1-1e-6)}^{2^{25}}=2.6e-15\) 考虑使用倍增的思想. 定义\ ... 
- loj #2509. 「AHOI / HNOI2018」排列
		#2509. 「AHOI / HNOI2018」排列 题目描述 给定 nnn 个整数 a1,a2,…,an(0≤ai≤n),以及 nnn 个整数 w1,w2,…,wn.称 a1,a2,…,an 的 ... 
- 「状压DP」「暴力搜索」排列perm
		「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ... 
- 「BalticOI 2011」Switch the Lamp On
		Casper is designing an electronic circuit on a \(N \times M\) rectangular grid plate. There are \(N ... 
- Solution -「CTSC 2018」「洛谷 P4602」混合果汁
		\(\mathcal{Description}\) Link. \(n\) 种果汁,第 \(i\) 种美味度为 \(d_i\),每升价格 \(p_i\),一共 \(l_i\) 升.\(m\) ... 
- loj#2509. 「AHOI / HNOI2018」排列(思维题 set)
		题意 题目链接 Sol 神仙题Orz 首先不难看出如果我们从\(a_i\)向\(i\)连一条边,我们会得到以\(0\)为根的树(因为每个点一定都有一个入度,出现环说明无解),同时在进行排列的时候需要保 ... 
- 【LOJ】#2509. 「AHOI / HNOI2018」排列
		题解 虽然要求一个dfs序,但是不是从根开始贪心 从最小的点开始贪心,最小的点显然是父亲选了之后马上就选它 那么我们每次把最小的点和父亲合并,两个联通块之间也是如此 对于两个联通块,他们合并的顺序应该 ... 
- 「ZJOI 2010」 排列计数
		题目链接 戳我 \(Solution\) 其实我们可以发现这题等价于让你求: 用\(1\)~\(n\)的数组成一个完全二叉树使之满足小根堆性质的方案数 于是我们可以考虑\(dp\) 假设我们现在在\( ... 
- 「BZOJ 2342」「SHOI 2011」双倍回文「Manacher」
		题意 记\(s_R\)为\(s\)翻转后的串,求一个串最长的形如\(ss_Rss_R\)的子串长度 题解 这有一个复杂度明显\(O(n)\)的做法,思路来自网上某篇博客 一个双倍回文串肯定当且仅当本身 ... 
随机推荐
- Codeforces 777E:Hanoi Factory(贪心)
			Of course you have heard the famous task about Hanoi Towers, but did you know that there is a specia ... 
- [Box] Robust Training and Initialization of Deep Neural Networks: An Adaptive Basis Viewpoint
			目录 概 主要内容 LSGD Box 初始化 Box for Resnet 代码 Cyr E C, Gulian M, Patel R G, et al. Robust Training and In ... 
- [C++]使用vector描述线性表定义及基本操作
			#ifndef VECTORLIST_H #define VECTORLIST_H #include<iostream> #include"linearlist.h" ... 
- CS5213替代AG6200 AG6201|HDMI转VGA带音频输出方案芯片
			台湾安格AG6200 AG6201专门用于设计HDMI转VGA带音频输出的方案芯片,CS5213是一款HDMI to VGA转换器且结合了HDMI输入接口和模拟RGB DAC输出.带支持片上音频数模转 ... 
- Java Web程序设计笔记 • 【第1章 Web应用程序】
			全部章节 >>>> 本章目录 1.1 Web 应用程序 1.1.1 Web 应用程序概述 1.1.2 Web 应用程序的工作原理 1.1.3 实践练习 1.2 HTTP协议 ... 
- 揭开“QUIC”的神秘面纱
			作者:赵咏 QUIC的发音类似于Quick,实际上也确实很快.它可以很好地解决应用在传输层和应用层面临的各种需求,包括处理更多的连接.安全性以及低延迟. 目前在互联网领域,QUIC可以说刮起了新一代互 ... 
- 【工控老马】OPC通讯协议解析-OPC七问
			1 通讯步骤 1.1 第一问 OPC Client和OPC Server之间通讯谁是主动的? 答:当然是OPC Client. 1.2 第二问 OPC Client第一次动作做了什么? 答:从大多数O ... 
- 解决spring boot 无法访问静态文件夹的附件或图片
			1.需要在配置文件重新执行静态文件夹位置即可 # 指定静态文件位置 resources: static-locations: classpath:/static/,classpath:/static/ ... 
- Linux命令--ss命令的参数及使用详解
			ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信 ... 
- 总结关于spring security 使用 JWT 和 账户密码登录 整合在一起的新感悟
			(1)jwt登录拦截,需要在账户密码认证之前进行jwt认证,因此jwt拦截需要在 UsernamePasswordAuthenticationFilter 之前: (2)jwt验证通过则不需要执行账户 ... 
