题目链接

AtCoder:https://agc012.contest.atcoder.jp/tasks/agc012_c

洛谷:https://www.luogu.org/problemnew/show/AT2363

题目大意

洛谷好像没有翻译,窝翻译了下顺便交了一发洛谷

我们称一个字符串\(x\)是好的当且仅当它满足一下条件:

  • \(x\)可以被表示为另外一个串\(y\)复制一遍得到,即\(x=\overline {yy}\)。

举个例子:'aa''bubobubo'是好的,'a','abcabcabc''abba'不是。

现在要求一个串\(s\)满足下列条件,可以证明这个串存在:

  • \(|s|\leqslant 200\)

  • 字符集大小为\(100\),即每个字符用\([1,100]​\)的整数表示。

  • 在\(s\)的所有的\(2^{|s|}\)个子序列中,恰好有\(N\)个串是好的,其中\(N​\)是给出的。

Solution

构造题...窝太菜了想不出来...

一开始想搞一个二进制拆分,一段一段的分,每段字符相同,但是这样串长是\(O(\log ^2 n)\)的,\(\rm WA\)了近一半的点...

正解很简洁,也很巧妙:

注意到\(\rm good \, string\)的性质,我们可以在串的右半段构造一个严格上升的串,在左边构造一个右边串的排列,那么方案数就是左边串的上升子序列个数。

我们从小到大往左边加字符,设空串也是一种情况,那么当前字符可以放最前面或最后面:

  • 当前字符放最前面,那么我们的方案数会\(+1\)。
  • 放最后面,方案数\(\times 2\)。

那么我们可以构造\(n+1\)的每个二进制位,串长为\(O(2\log n)\),复杂度也是\(O(\log n)\)。

#include<bits/stdc++.h>
using namespace std; #define int long long void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
} void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');} #define lf double
#define ll long long
#define pb push_back const int maxn = 1e5+10;
const int inf = 1e9;
const lf eps = 1e-8; int n; vector<int > s,t; signed main() {
read(n);int p=101;n++;
while(n>1) {if(n&1) t.pb(--p),n--;else s.pb(--p),n>>=1;}
int m=s.size()+t.size();printf("%lld\n",m<<1);
for(int i=0;i<(int)t.size();i++) printf("%lld ",t[i]);
for(int i=s.size()-1;~i;i--) printf("%lld ",s[i]);
for(int i=100-m+1;i<=100;i++) printf("%lld ",i);
return 0;
}

[AT2363] [agc012_c] Tautonym Puzzle的更多相关文章

  1. 【AtCoder Grand Contest 012C】Tautonym Puzzle [构造]

    Tautonym Puzzle Time Limit: 50 Sec  Memory Limit: 256 MB Description 定义一个序列贡献为1,当且仅当这个序列 由两个相同的串拼接而成 ...

  2. AtCoder Grand Contest 012 C:Tautonym Puzzle

    题目传送门:https://agc012.contest.atcoder.jp/tasks/agc012_c 题目翻译 如果一个字符串是好的,那么这个字符串的前半部分和后半部分肯定一模一样.比如\(a ...

  3. AT2363-[AGC012C]Tautonym Puzzle【构造】

    正题 题目链接:https://www.luogu.com.cn/problem/AT2363 题目大意 给出\(n\),要求构造一个字符串\(s\),使得能够找出恰好\(n\)个子序列使得这个子序列 ...

  4. Atcoder Grand 012 C - Tautonym Puzzle

    题意: 构造一个字符串,使得这个字符串有只有n个形如AA这样的子序列. 神TM构造题不会做,, 我们构造一个长度为2*m的字符串,前m个是一个1-m的排列,后m个就是按顺序1-m. 这样这个串里符合要 ...

  5. AGC 012 C - Tautonym Puzzle

    题面在这里! 神仙构造啊qwqwq. 窝一开始只想到一个字符串长度是 O(log(N)^2) 的做法:可以发现一段相同的长度为n的字符串的贡献是 2^(n-1)-1 ,可以把它看成类二进制,枚举用了多 ...

  6. Tautonym Puzzle

    题意: 构造一个长度不超过200,数字不大于100的序列,使得合法子序列的个数恰好为N: 合法子序列是指一个长度为偶数的序列,前一半和后一半相等. 解法: 考虑这种构造方法 假设我们当前有序列为 $x ...

  7. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  8. 【AtCoder】AGC012

    AGC012 A - AtCoder Group Contest 从最后开始间隔着取就行 #include <bits/stdc++.h> #define fi first #define ...

  9. A♂G&C012

    A♂G&C012 A AtCoder Group Contest 从大到小sort后输出\(a_2+a_4+a_6+\ldots a_{2n}\) 好♂啊,只会背结论/kk B Splatte ...

随机推荐

  1. cocos2dx2.0 帧动画的创建和播放过程 深入分析

    一.帧动画的创建过程帧动画的实现有四个不可或缺的类,如下:1.CCSpriteFrame:精灵帧信息.存储帧动画的每一帧的纹理基本信息. class CC_DLL CCSpriteFrame : pu ...

  2. 一个IP可以登几个拼多多后台 拼多多如何推广营销

    想要在拼多多上开双店?担心一根网线会引起IP冲突?那么一根网线可以登几个拼多多后台呢?有数据显示,挂双店是没有问题的,甚至可以多开.那么解决了一根网线的事情,要怎么对自己的店铺进行营销推广呢?下面是小 ...

  3. TensorFlow深度学习实战---图像数据处理

    图像的亮度.对比度等属性对图像的影响非常大,这些因素都会影响最后的识别结构.当然,复杂的预处理过程可能会导致训练效率的下降(利用TensorFlow中多线程处理输入数据的解决方案). 同一不同的原始数 ...

  4. CentOS 下 MySQL 5.6 基于 RPM 的下载、安装、配置

    CentOS 下 MySQL 5.6 基于 RPM 的下载.安装.配置 系统: CentOS 7 x86_64 MySQL 版本: 5.6.40 安装方式: RPM 下载 下载地址 操作系统 选择 R ...

  5. Query类型_JDBC的方法_JAVA方法_Loadrunner脚本

    数据库查询压力测试脚本 jdbc_java_查询类型接口测试 package com.test; import java.sql.Connection; import java.sql.DriverM ...

  6. 7个Node.js的Web框架

    NodeJS也就是Node,是众所周知的使用javascript构建Web应用框架,它启动一个服务器非常简单,如下: var http = require('http'); http.createSe ...

  7. 算法笔记(c++)--01背包问题

    算法笔记(c++)--经典01背包问题 算法解释起来太抽象了.也不是很好理解,最好的办法就是一步步写出来. 背包问题的核心在于m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+ ...

  8. 下载android sdk更新包离线安装解决方案

    本文转载自:http://xljboox.blog.163.com/blog/static/7628448320111159354738/ 第一次安装android sdk后进行开发包的更新,你应该了 ...

  9. shell命令之at 执行一次性定时任务的用法

    大家都知道crontab是执行定时任务的命令,那么at又是什么呢? 其实at也是定时任务命令,不同的是crontab是执行循环任务,at执行一次性任务 首先说下时间例子 Minute    at no ...

  10. eclipse连接SQL2008R2

    最近又开始写JAVA WEB了,想起连接数据库就麻烦,但是通过一天的努力我居然弄好了,很有成就感. 我用的是 SQL Server 2008 R2  +  eclipse 首先要成功的安装好SQL最终 ...