CodeForces 625D Finals in arithmetic
神奇的构造题,我的思路比较奇葩。搞了好久,看到WA on 91我绝望了,然后自己造数据,找到了错误,总算是AC了,现在是凌晨0:24分,看到AC之后,感动China!
我写的代码无比的长。。。。。应该有很简单的方法吧。。。。。没想到。
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <stack>
#include <map>
#include <vector>
using namespace std; const int maxn = + ;
char s[maxn];
int a[maxn], b[maxn], sum[maxn], flag[maxn];
int tmpa[maxn], tmpb[maxn], ans[maxn];
int nb[maxn];
int len; void read()
{
scanf("%s", s);
for (int i = ; s[i]; i++) b[i + ] = s[i] - '';
nb[] = b[] * + b[]; for (int i = ; s[i]; i++) nb[i] = s[i] - '';
} void init()
{
len = strlen(s);
memset(flag, , sizeof flag);
} bool check1()
{
for (int i = ; i <= (len + ) / ; i++)
{
if (sum[i] % == ) a[i] = sum[i] / , a[len - i + ] = sum[i] / ;
else a[i] = sum[i] / + , a[len - i + ] = sum[i] - a[i];
} for (int i = ; i <= len; i++) tmpa[i] = a[i];
for (int i = ; i <= len; i++) tmpb[i] = a[len - i + ]; int k = ;
for (int i = ; i <= len; i++)
{
ans[i] = (tmpa[i] + tmpb[i] + k) % ;
k = (tmpa[i] + tmpb[i] + k) / ;
} for (int i = ; i <= len; i++)
if (b[len - i + ] != ans[i]) return ;
return ;
} bool work1()
{
bool fail = ; init(); for (int i = len; i >= len / + ; i--)
{
int id_now = i, id_pre = len - i + ; if (i == len)
{
if (b[i] == ) { fail = ; break; } sum[id_now] = b[id_now]; sum[id_pre] = b[id_now];
flag[id_now] = ; flag[id_pre] = ; if (b[id_now] == b[id_pre]) flag[id_pre + ] = ;
else if (b[id_now] + == b[id_pre]) flag[id_pre + ] = ;
else { fail = ; break; }
} else
{
int num_now, num_pre;
num_now = b[id_now] - flag[id_now + ]; if (num_now == )
{
if (b[id_pre] == )
{
sum[id_now] = ; sum[id_pre] = ;
flag[id_pre + ] = ;
}
else if (b[id_pre] == )
{
sum[id_now] = ; sum[id_pre] = ;
flag[id_pre + ] = ;
}
else { fail = ; break; }
}
else if (b[id_now] == && flag[id_now + ])
{
if (b[id_pre] == || b[id_pre] == )
{
flag[id_now] = ;
if (b[id_pre] == ) flag[id_pre + ] = ;
sum[id_now] = ;
sum[id_pre] = ;
}
else { fail = ; break; }
}
else
{
num_now = num_now + flag[id_pre] * ;
num_pre = b[id_pre] + flag[id_pre] * ; if (num_now == num_pre)
{
flag[id_pre + ] = ;
sum[id_now] = num_now; sum[id_pre] = num_now;
if (num_now >= ) flag[id_now] = ;
} else if (num_now + == num_pre)
{
flag[id_pre + ] = ;
sum[id_now] = num_now; sum[id_pre] = num_now;
if (num_now >= ) flag[id_now] = ;
}
else { fail = ; break; }
}
}
if (id_now == id_pre&&sum[id_pre] % != ) { fail = ; break; }
} if (!check1()) fail = ; return fail;
} bool check2()
{
memset(tmpa, , sizeof tmpa);
memset(tmpb, , sizeof tmpb); for (int i = ; i <= (len + ) / ; i++)
{
if (sum[i] % == ) a[i] = sum[i] / , a[len - i + ] = sum[i] / ;
else a[i] = sum[i] / + , a[len - i + ] = sum[i] - a[i];
} for (int i = ; i <= len; i++) tmpa[i] = a[i];
for (int i = ; i <= len; i++) tmpb[i] = a[len - i + ]; int k = ;
len++;
for (int i = ; i <= len; i++)
{
ans[i] = (tmpa[i] + tmpb[i] + k) % ;
k = (tmpa[i] + tmpb[i] + k) / ;
} for (int i = ; i <= len; i++)
if (b[len - i + ] != ans[i]) return ;
return ;
} bool work2()
{
bool fail = ; init(); len--; for (int i = len; i >= len / + ; i--)
{
int id_now = i, id_pre = len - i + ; if (i == len)
{
sum[id_now] = + nb[id_now]; sum[id_pre] = + nb[id_now];
flag[id_now] = ; flag[id_pre] = ; if (nb[id_now] + == nb[id_pre]) flag[id_pre + ] = ;
else if (nb[id_now] + + == nb[id_pre]) flag[id_pre + ] = ;
else { fail = ; break; }
} else
{
int num_now, num_pre;
num_now = nb[id_now] - flag[id_now + ]; if (num_now == )
{
if (nb[id_pre] == )
{
sum[id_now] = ; sum[id_pre] = ;
flag[id_pre + ] = ;
}
else if (nb[id_pre] == )
{
sum[id_now] = ; sum[id_pre] = ;
flag[id_pre + ] = ;
}
else { fail = ; break; }
}
else if (nb[id_now] == && flag[id_now + ])
{
if (nb[id_pre] == || nb[id_pre] == )
{
flag[id_now] = ;
if (nb[id_pre] == ) flag[id_pre + ] = ;
sum[id_now] = ;
sum[id_pre] = ;
}
else { fail = ; break; }
}
else
{
num_now = num_now + flag[id_pre] * ;
num_pre = nb[id_pre] + flag[id_pre] * ; if (num_now == num_pre)
{
flag[id_pre + ] = ;
sum[id_now] = num_now; sum[id_pre] = num_now;
if (num_now >= ) flag[id_now] = ;
} else if (num_now + == num_pre)
{
flag[id_pre + ] = ;
sum[id_now] = num_now; sum[id_pre] = num_now;
if (num_now >= ) flag[id_now] = ;
}
else { fail = ; break; }
}
}
if (id_now == id_pre&&sum[id_pre] % != ) { fail = ; break; }
} if (!check2()) fail = ; return fail;
} int main()
{
read();
init();
if (!work1())
{
for (int i = ; i <= len; i++) printf("%d", a[i]);
printf("\n");
}
else
{
if (b[] == )
{
if (!work2())
{
for (int i = ; i <= len - ; i++) printf("%d", a[i]);
printf("\n");
}
else { printf("0\n"); }
}
else { printf("0\n"); }
}
return ;
}
CodeForces 625D Finals in arithmetic的更多相关文章
- Codeforces Round #342 (Div. 2) D. Finals in arithmetic 贪心
D. Finals in arithmetic 题目连接: http://www.codeforces.com/contest/625/problem/D Description Vitya is s ...
- Codeforces Round #342 (Div. 2) D. Finals in arithmetic(想法题/构造题)
传送门 Description Vitya is studying in the third grade. During the last math lesson all the pupils wro ...
- 【Codeforces 115D】Unambiguous Arithmetic Expression
Codeforces 115 D 题意:给一个没有括号的表达式,问有多少种添加括号的方法使得这是一个合法的表达式?输入可能有正负号.加减乘除.数字. 思路1: 这是不能过的\(naive\)的\(dp ...
- CF刷题-Codeforces Round #481-D. Almost Arithmetic Progression
题目链接:https://codeforces.com/contest/978/problem/D 题解: 题目的大意就是:这组序列能否组成等差数列?一旦构成等差数列,等差数列的公差必定确定,而且,对 ...
- 【codeforces 604D】Moodular Arithmetic
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- Codeforces 710 D. Two Arithmetic Progressions
Description \(x=a_1k+b_1=a_2l+b_2,L\leqslant x \leqslant R\) 求满足这样条件的 \(x\) 的个数. Sol 扩展欧几里得+中国剩余定理. ...
- Codeforces Round #342 (Div. 2)
贪心 A - Guest From the Past 先买塑料和先买玻璃两者取最大值 #include <bits/stdc++.h> typedef long long ll; int ...
- Codeforces Round #342 (Div 2) 解题报告
除夕夜之有生之年CF第一场 下午从奶奶家回到姥姥家,一看还有些时间,先吃点水果陪姥姥姥爷聊了会儿,再一看表,5:20....woc已经开场20分钟了...于是抓紧时间乱搞.. **A. Guest F ...
- [Educational Codeforces Round 16]D. Two Arithmetic Progressions
[Educational Codeforces Round 16]D. Two Arithmetic Progressions 试题描述 You are given two arithmetic pr ...
随机推荐
- ignite客户端找不到服务端的时候如何设置退出
ignite启动客户端时需要有服务端支持: Ignition.setClientMode(true); Ignition.start("ignite.xml"); 这里有个问题,当 ...
- Swift 使用Extension 场景 浅析
别人一看到我的 Swift 代码,立刻就会问我为什么如此频繁的使用 extension.这是前几天在我写的另一篇文章中收到的评论: 我大量使用 extension 的主要目的是为了提高代码可读性.以下 ...
- android 检测是否插入U盘方法之一
本方法是检测文件/proc/partitions. import java.io.*; File Usbfile = new File("/proc/partitions");if ...
- overflow:hidden
超出之后隐藏,比如有一个div,高度和宽度都是100像素,当里面的内容很多,div里撑不下时,如果设置overflow:hidden,就会把超出的内容隐藏掉不显示
- CodeForces 678D Iterated Linear Function
简单矩阵快速幂. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm& ...
- opencart配置税率
1.System->Localisation->Geo Zones新增税收区域 2.System->Localisation->Taxes->Tax Rates新增税率 ...
- 【转】js/jquery中刷新iframe方法(兼容主流)
一.js实现刷新两种方式: 1.//方法1 2.document.getElementById('FrameID').contentWindow.location.reload(true); 3.// ...
- abstract class 与interface
一.抽象类(absteact class) 特点: 1.抽象方法只作说明,而不包含实现,可以看成是没有实现体的虚方法 2.抽象类不能被实例化.除此之外,具有类的其他特性 3.抽象类可以但不是必须有抽象 ...
- Vi 详细教程
进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...
- Hibernate配置文件中配置各种数据库的driver、URL
hibernate.properties ######################### Query Language ######################### ## define qu ...