【codeforces 709D】Recover the String
【题目链接】:http://codeforces.com/problemset/problem/709/D
【题意】
给你一个序列;
给出01子列和10子列和00子列以及11子列的个数;
然后让你输出一个符合要求的序列;
【题解】
这里
00和11可以确定出序列中0和1的个数;
但有边缘数据
00如果为0代表什么?
->没有0或者是有1个0
11如果为0代表什么?
->没有1或者是有1个1
对这两种情况需要特判一下(两种情况的特判需要用到01和10的数量)
看代码吧。
然后这两种情况排除之后;
00和11就都大于0了;
则可以根据
00=a0*(a0-1)/2
11=a1*(a1-1)/2
来求出0的个数和1的个数;
具体的;
你需要对2*00开根号->x
同时你还有算一下
(x+1)*x/2是不是等于00
因为如果不是的话就表示没有符合要求的0的个数的序列满足要求;
那种情况也要输出无解;
1同理;
然后我们算出1的个数和0的个数;
把所有的1都放在最前面,然后0的放在后面;
这样a10等于0的个数乘1的个数;
然后可以验证你每把最右边那个1往右交换一个0,a10会减1,a01会加1;
则按照这个规则;
每次看看a10和输入的a10的差为多少rest
while(rest>=num0){
**把最右边那个1和最右边那个0交换;
**rest-num;
}
然后rest可能还有剩余
则把最右边那个1和这个1往右数rest个0交换位置;
就能再减去rest个10了;
根据上述规则可知;
如果输入的a10+a01!=1的个数*0的个数
则输出无解;
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define ps push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 110;
int a00, a01, a10, a11;
string s;
void work(int num0, int num1){
s = " ";
rep1(i, 1, num1) s += '1';
rep1(i, 1, num0) s += '0';
if (a01 + a10 != num0*num1) puts("Impossible"),exit(0);
int ta10 = num1*num0;
int j = num1,i = 0;
LL rest = ta10 - a10;
while (rest>=num0)
{
swap(s[j], s[num1 + num0 - i]);
j--; i++;
rest -= num0;
}
swap(s[j], s[j + rest]);
s.erase(0, 1);
cout << s << endl;
exit(0);
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
rei(a00), rei(a01), rei(a10), rei(a11);
if (a00 == 0){
//no zero
if (a01 == 0 && a10 == 0){
int len = sqrt(2 * a11)+1;
if (len*(len - 1) == 2 * a11)
{
rep1(i, 1, len) printf("1");
return 0;
}
}
//one zero
if (a11 == 0){
//no one
if (a10 == 0 && a01 == 0) return puts("0"), 0;
//one one
if (a10 + a01 == 1){
if (a10 == 1) return puts("10"), 0;
if (a01 == 1) return puts("01"), 0;
}
}
else
if (a11 > 0) {
int len = sqrt(2 * a11) + 1;
if (len*(len-1)==2*a11)
work(1, int(sqrt(2 * a11) + 1));
}
puts("Impossible");
return 0;
}
if (a11 == 0)
{
//no one
if (a10 ==0 && a01 == 0) {
int len = sqrt(2 * a00) + 1;
if (len*(len - 1) == 2 * a00) {
rep1(i, 1, len) printf("0");
return 0;
}
}
//one one
assert(a00 > 0);
int len = sqrt(2 * a00) + 1;
if (len*(len - 1) == 2 * a00)
work(int(sqrt(2 * a00) + 1), 1);
puts("Impossible");
return 0;
}
int len = sqrt(2 * a00) + 1, len1 = sqrt(2 * a11) + 1;
if (len*(len-1)==2*a00 && len1*(len1-1)==2*a11)
work(int(sqrt(2 * a00) + 1), int(sqrt(2 * a11) + 1));
puts("Impossible");
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}
【codeforces 709D】Recover the String的更多相关文章
- codeforces 709D D. Recover the String(构造)
题目链接: D. Recover the String time limit per test 1 second memory limit per test 256 megabytes input s ...
- 【Codeforces 1132F】Clear the String
Codeforces 1132 F 题意:给一个串\(S\),问每次删除连续的一段相同字母,最少删几次将原串删空. 思路:考虑区间\(dp\),我们看要删多少次能把\([l,r]\)删空,那么最终答案 ...
- 【CodeForces 624C】Graph and String
题 题意 n个表示abc三个字符的点,所有a和b是相连的,所有b和c是相连的,所有相同的是相连的,现在给你n个点和他们之间的m条边,判断是否存在这样的字符串,存在则给出一个符合条件的. 分析 我的做法 ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- 【HDOJ 1009】 CRB and String
[HDOJ 1009] CRB and String 每组两个串s t 仅仅由小写字母组成 问从s能不能变成t 改变的操作为选一个字符 在后面加上一个与所选字符不同的字符 这样的操作能够做无数次 问能 ...
- 【codeforces 797C】Minimal string
[题目链接]:http://codeforces.com/contest/797/problem/C [题意] 一开始,给你一个字符串s:两个空字符串t和u; 你有两种合法操作; 1.将s的开头字符加 ...
- 【codeforces 779D】String Game
[题目链接]:http://codeforces.com/contest/779/problem/D [题意] 给你一段操作序列; 按顺序依次删掉字符串1中相应位置的字符; 问你最多能按顺序删掉多少个 ...
- 【codeforces 801B】Valued Keys
[题目链接]:http://codeforces.com/contest/801/problem/B [题意] 定义一个对两个字符串x,y的f(x,y)函数; 返回的是一个字符串; 这个返回的字符串的 ...
- 【codeforces 801A】Vicious Keyboard
[题目链接]:http://codeforces.com/contest/801/problem/A [题意] 一个字符串只由VK组成; 让你修改一个字符; 使得剩下的字符串里面子串VK的个数最大; ...
随机推荐
- varnish的架构和日志
varnish的架构和日志 varnish的架构 知道varnish的内部结构有两个重要的原因: 首先,架构主要负责性能,其次,它影响你如何将Varnish集成到你自己的架构中. 主程序块是Manag ...
- vue 加载文件,省略后缀后的加载顺序
Vue使用import ... from ...来导入组件,库,变量等.而from后的来源可以是js,vue,json.这个是在webpack.base.conf.js中设置的: module.exp ...
- 给独立搭建的博客启用https的过程
申请SSL证书 我自己独立搭建的博客部署在阿里云服务器上,因此我就先搜索阿里云启用https的方法,网上有比较详细的讲解,在此提供一个参考网址: https://blog.csdn.net/csluc ...
- java 实现word文档在线预览
一.准备工具 1.通过第三方工具openoffice,将word.excel.ppt.txt等文件转换为pdf文件 下载地址:http://www.openoffice.org/download/in ...
- 2017青岛网络赛1011 A Cubic number and A Cubic Number
A Cubic number and A Cubic Number Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/3276 ...
- SQL server存储过程及触发器基础
存储过程:就像函数一样的会保存在数据库中-->可编程性 --> 存储过程-----------------------------------------------------创建存储过 ...
- [ CodeForces 1063 A ] Oh Those Palindromes
\(\\\) \(Description\) 给出 \(N\) 个小写字母,将他们排成一个字符串,使得这个字符串里包含的回文串最多. \(N\le 10^5\) \(\\\) \(Solution\) ...
- python生成excel文件
2018-04-1919:04:25 测试代码如下: import openpyxl import datetime wb = openpyxl.Workbook() ws = wb.active w ...
- RabbitMQ 为什么需要信道?为什么不是TCP直接通信?
交换器和队列的关系 1. 交换器是通过路由键和队列绑定在一起的,如果消息拥有的“路由键”跟队列和交换器的“路由键”匹配,那么消息就会被路由到该绑定的队列当中去 2. 也就是说,消息到队列的过程中,消息 ...
- MySql 1248 - Every derived table must have its own alias
执行一个sql语句,报错:1248 - Every derived table must have its own alias 提示说每一个衍生出来的表,必须要有自己的别名 执行子查询的时候,外层查询 ...