AtCoder Regular Contest 99
C - Minimization
第一次可能有多种选择,我们枚举所有的选择,然后两边贪心取即可。
Code
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
//#define Local
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e5 + 5;
int n, k;
void run() {
int p;
for(int i = 1; i <= n; i++) {
int x; cin >> x;
if(x == 1) p = i;
}
int ans = N;
for(int i = 1; i <= n; i++) {
int l = i, r = min(n, i + k - 1);
if(l <= p && p <= r)
ans = min(ans, 1 + (l - 1 + k - 2) / (k - 1) + (n - r + k - 2) / (k - 1));
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
#ifdef Local
freopen("../input.in", "r", stdin);
freopen("../output.out", "w", stdout);
#endif
while(cin >> n >> k) run();
return 0;
}
D - Snuke Numbers
这个就是打表找规律...但规律也不是很好找,这个规律是变换的规律,可能一次加上\(10^i\),也可以加上\(10^{i+1}\),两个判断一下即可。
Code
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define Local
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e5 + 5;
int K;
double Snuke(ll x) {
ll tmp = 0, c = x;
while(c) {
tmp += c % 10;
c /= 10;
}
return 1.0 * x / tmp;
}
void run() {
ll res = 0, x = 1;
while(K--) {
double t1, t2;
while(true) {
t1 = Snuke(res + x), t2 = Snuke(res + x * 10);
if(t1 <= t2) break;
x *= 10;
}
res += x;
cout << res << '\n';
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
#ifdef Local
freopen("../input.in", "r", stdin);
freopen("../output.out", "w", stdout);
#endif
while(cin >> K) run();
return 0;
}
E - Independence
题意:
给出\(n\)个点\(m\)条无向边,现在对于任意两个点,至多有一条边直接连接。
现在要将这个图划分为两部分,使得两部分都为完全图,问最终每部分最小边数之和为多少。
思路:
- 划分为两部分之后的答案很好计算,假设两边的点分别有\(x,y\)个,那么最终答案就为\(\frac{x\cdot (x-1)}{2}+\frac{y\cdot (y-1)}{2}\)。
- 现在就考虑如何划分。
- 我们取原图的补图,那么最终两个集合中不存在任何一条边即符合条件。
- 进一步地,我们将这个与二分图等价,其实就将问题转化为二分图问题了。
- 首先判断二分图是否存在,若存在,先有若干个连通块,每个连通块有两种选择,那么直接背包\(dp\)一下求出最终所有方案数就行了。
(一开始还以为能够滚动一维QAQ)
代码如下:
Code
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
//#define Local
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 705;
int n, m;
bool lnk[N][N];
int cnt[2];
int col[N];
bool f;
void dfs(int u, int c) {
col[u] = c;
++cnt[c];
for(int v = 1; v <= n; v++) {
if(lnk[u][v]) {
if(col[v] == -1) dfs(v, 1 - c);
else if(col[v] == c) {
f = false;
return;
}
}
}
}
pii num[N];
bool dp[N][N];
void run() {
memset(col, -1, sizeof(col));
memset(dp, 0, sizeof(dp));
f = true;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
if(i != j) lnk[i][j] = 1;
}
for(int i = 1; i <= m; i++) {
int u, v; cin >> u >> v;
lnk[u][v] = lnk[v][u] = 0;
}
int tot = 0;
for(int i = 1; i <= n; i++) {
if(col[i] == -1) {
cnt[0] = cnt[1] = 0;
dfs(i, 0);
num[++tot] = MP(cnt[0], cnt[1]);
}
}
if(f == false) {
cout << -1 << '\n';
return;
}
dp[0][0] = 1;
for(int i = 1; i <= tot; i++) {
for(int j = 0; j <= n; j++) {
if (j >= num[i].fi) dp[i][j] |= dp[i - 1][j - num[i].fi];
if (j >= num[i].se) dp[i][j] |= dp[i - 1][j - num[i].se];
}
}
int ans = 1e9;
for(int i = 0; i <= n; i++) {
if(dp[tot][i]) {
ans = min(ans, i * (i - 1) / 2 + (n - i) * (n - i - 1) / 2);
}
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
#ifdef Local
freopen("../input.in", "r", stdin);
freopen("../output.out", "w", stdout);
#endif
while(cin >> n >> m) run();
return 0;
}
F - Eating Symbols Hard
鸽了好久,终于来补了= =
题意:
给出一个字符串含有">,<,+,-"四种字符,每种字符代表一种操作,字符串长度不超过\(10^5\)。
先有一个初始全为\(0\)的无限长的数组,起点为\(0\)。"+"代表当前位置加一,"-"与之相反;">"代表往右边走一步,"<"代表往左边走一步。
现问多少区间\([l,r]\),只执行该区间内的操作,得到的数组能与执行\([1,n]\)的操作得到的想同。
思路:
感觉题意说了一大堆,可能我表述有点问题= =
可以考虑字符串哈希,哈希函数设计为:
\]
之后有点不好表述了(果真我表述能力有问题),可以参见代码,代码还是比较好懂的。
处理区间hash值时注意\(hs[l]-hs[r+1]=hs[1]*pos[l-1]\)这个等式,具体含义可以看代码,这里直接相减是计算上前面那一部分的移动的。
反正很巧妙QAQ
Code
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
//#define Local
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int N = 250005, P1 = 1e9 + 7, P2 = 1e9 + 9;
ll qpow(ll a, ll b, ll c) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % c;
a = a * a % c;
b >>= 1;
}
return ans;
}
char s[N];
int n;
struct rolling_hash{
ll a, b;
rolling_hash() {
a = b = 0;
}
rolling_hash(ll x) {
a = x % P1;
b = x % P2;
}
rolling_hash(ll x, ll y) {
a = x % P1;
b = y % P2;
}
rolling_hash operator + (const rolling_hash& A) const {
return rolling_hash(a + A.a, b + A.b);
}
rolling_hash operator - (const rolling_hash& A) const {
return rolling_hash(a - A.a + P1, b - A.b + P2);
}
rolling_hash operator * (const rolling_hash& A) const {
return rolling_hash(a * A.a, b * A.b);
}
ll get() {
return a * P2 + b;
}
}hs[N], pos[N];
rolling_hash X = 1000003;
rolling_hash invX = rolling_hash(qpow(X.a, P1 - 2, P1), qpow(X.b, P2 - 2, P2));
unordered_map <ll, int> mp;
void run() {
mp.clear();
cin >> s + 1;
pos[0] = 1;
for(int i = 1; i <= n; i++) {
pos[i] = pos[i- 1];
if(s[i] == '>') {
pos[i] = pos[i - 1] * X;
} else if(s[i] == '<') {
pos[i] = pos[i - 1] * invX;
}
}
hs[n + 1] = 0;
for(int i = n; i >= 1; i--) {
hs[i] = hs[i + 1];
if(s[i] == '+') {
hs[i] = hs[i] + pos[i];
} else if(s[i] == '-') {
hs[i] = hs[i] - pos[i];
}
}
ll ans = 0;
++mp[hs[n + 1].get()];
for(int i = n; i >= 1; i--) {
rolling_hash now = hs[i] - hs[1] * pos[i - 1];
ans += mp[now.get()];
++mp[hs[i].get()];
// cout << ans << '\n';
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
#ifdef Local
freopen("../input.in", "r", stdin);
freopen("../output.out", "w", stdout);
#endif
while(cin >> n) run();
return 0;
}
AtCoder Regular Contest 99的更多相关文章
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- AtCoder Regular Contest 093
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...
- AtCoder Regular Contest 094
AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...
- AtCoder Regular Contest 095
AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...
- AtCoder Regular Contest 102
AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...
- AtCoder Regular Contest 096
AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...
- AtCoder Regular Contest 097
AtCoder Regular Contest 097 C - K-th Substring 题意: 求一个长度小于等于5000的字符串的第K小子串,相同子串算一个. K<=5. 分析: 一眼看 ...
随机推荐
- 【每天一题】LeetCode 0026. 删除排序数组中的重复项
开源地址:https://github.com/jiauzhang/algorithms 题目描述 /* * https://leetcode-cn.com/problems/remove-dupli ...
- axios解决跨域问题(vue-cli3.0)
一.什么是跨域 1.跨域 指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 2.同源策略 是指协议,域名,端口都要相同,其中有一个不同都 ...
- 轻松定位CPU飙高问题
以下四步轻松定位CPU飙高问题: ①top pid 查看cpu耗CPU进程 ②top -Hp pid 查看该进程所有线程的运行情况,找到占用 CPU 过高的线程 pid ③ printf %x pid ...
- [20191122]oracel SQL parsing function qcplgte.txt
[20191122]oracel SQL parsing function qcplgte.txt --//昨天看了链接:https://nenadnoveljic.com/blog/memory-l ...
- Centos手动安装PHP
下载PHP的源码,我下的是7.2版本,看了一下安装的参数太多了,也没有时间依次了解每个参数的意思,直接从网上复制了一个,先尝试安装起来.并记录一下步骤,基本的步骤就是解压.配置.编译.运行.1.下载P ...
- idea开发时springboot项目时的自动编译和热部署
前提:最好将idea的启动器设置一下 操作:1.file > Build,Execution,Deployment > Compiler 勾选 Build project automati ...
- Linux系统学习 二十二、SAMBA服务—Samba基本使用—share权限访问、客户端的使用
share权限访问 配置文件修改 [global]全局设置 workgroup=MYGROUP server string=Samba Server Lamp log file=/var/log/sa ...
- Linux系统学习 十六、VSFTP服务—本地用户访问—基本用户基础配置
缺点,ftp密码是和系统密码是一致的,并不安全 先设置两个测试用户 test1 123123 test2 123123 基本用户基础配置 1.本地用户基本配置 local_enab ...
- 如何写一个Python万能装饰器,既可以装饰有参数的方法,也可以装饰无参数方法,或者有无返回值都可以装饰
Python中的装饰器,可以有参数,可以有返回值,那么如何能让这个装饰器既可以装饰没有参数没有返回值的方法,又可以装饰有返回值或者有参数的方法呢?有一种万能装饰器,代码如下: def decorate ...
- Python文件操作:文件的打开关闭读取写入
Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...