【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的个数最大; ...
随机推荐
- IE6的3像素BUG产生条件及解决方法
1.IE6中第一个元素浮动第二个元素不浮动,这两个元素之间就会产生3像素BUG 2.解决方案: 2.1若若宽度一定则给第二个元素添加 float 样式即可: 2.2若宽度自适应: 2.2.1 _ma ...
- Eclipse使用Tomcat发布项目时出现YadisException异常解决方案
调整使用Eclipse的JDK版本,大概JDK版本过低会出现这个org.openid4java.discovery.yadis.YadisException: 0x704: I/O transport ...
- 【Tair】淘宝分布式NOSQL框架:Tair
Tair是淘宝的一个开源项目,它是一个分布式的key/value结构数据的解决方案. 一.基本组成 作为一个分布式系统,Tair由一个中心控制节点(config server)和一系列的服务节点(da ...
- 计算几何值平面扫面poj2932 Coneology
Coneology Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4097 Accepted: 859 Descript ...
- VMWare虚拟网络编辑
VMWare虚拟网络编辑记录. 点击"编辑->虚拟网络编辑器" 在网卡列表中选择"VMnet8"查看目前设置,点击右下角的更改设置进行网络修改. 备注:更 ...
- CircuitBreaker design pattern---reference
It's common for software systems to make remote calls to software running in different processes, pr ...
- mysql中数据库的设计
软件开发流程(CMMI): 1):项目启动; 2):项目计划: 3):需求分析; 需要得到的结果是什么? 4):系统设计; 该怎么做? 5):系统开发; 6):系统测试; 7):系 ...
- C#和Java在语法上的差异(原创,持续更新中)
1.switch C#一直支持String类型 Java直到1.7才支持 2.C#里String有Length属性 Java里是Length方法 3.C#中修饰class的sealed效果与Java ...
- Java 基础入门随笔(5) JavaSE版——函数重载
1.函数 函数就是定义在类中具有特定功能的一段独立小程序,也称为方法. 定义函数的格式: 修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,...) { ...
- 梦想CAD控件安卓参数绘图
在CAD绘图中,参数化绘图可以帮助我们极大缩短设计时间,用户可以按照设计意图控制绘图对象,这样即使对象发生了变化,具体的关系和测量数据仍将保持不变,能够对几何图形和标注进行控制,可以帮助用户应对耗时的 ...