The 2017 China Collegiate Programming Contest, Hangzhou Site Solution
A: Super_palindrome
题面:给出一个字符串,求改变最少的字符个数使得这个串所有长度为奇数的子串都是回文串
思路:显然,这个字符串肯定要改成所有奇数位相同并且所有偶数位相同
那统计一下奇数位上哪个字符出现的个数最多,偶数位上哪个字符出现的个数最多
答案就是 n 减去它们
#include <bits/stdc++.h> using namespace std; #define N 110
#define INF 0x3f3f3f3f int t;
char s[N]; int odd[];
int even[]; int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%s", s);
memset(odd, , sizeof odd);
memset(even, , sizeof even);
int len = strlen(s);
int Maxodd = , Maxeven = ;
for (int i = ; i < len; ++i)
{
if (i & )
odd[s[i]]++, Maxodd = max(Maxodd, odd[s[i]]);
else
even[s[i]]++, Maxeven = max(Maxeven, even[s[i]]);
}
printf("%d\n", len - Maxodd - Maxeven);
}
return ;
}
B: Master of Phi
题意:给定一个n,接下来n行输入p和q代表数字num有q个p因子,计算题中式子
思路:根据题中数字提取出公因数n,然后每个式子只是每个数的质因子乘上(1-1/p)。对于所有要求的式子,对于每个质因子p仅可能0-q中可能,所以所求式子就变成了∏((1-1/pi)*qi+1)所得值。
#include<bits/stdc++.h> using namespace std; #define N 110 typedef long long ll; const int MOD = ; inline ll qpow(ll x,ll n)
{
ll res = ;
while(n)
{
if(n & ) res = (res * x) % MOD;
x = (x * x) % MOD;
n >>= ;
}
return res;
} int m;
ll p[N],q[N];
ll tmp[N]; int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&m);
ll ans = ;
for(int i = ;i <= m; ++i)
{
scanf("%lld %lld",&p[i], &q[i]);
p[i] %= MOD;
ans = (ans * qpow(p[i], q[i])) % MOD;
p[i] = (p[i] - ) * qpow(p[i], MOD - ) % MOD;
tmp[i] = p[i] * q[i] % MOD;
}
for(int i = ; i <= m; ++i)
{
ans = (ans * (tmp[i] + ) % MOD) % MOD;
}
printf("%lld\n",ans);
}
return ;
}
C: Hakase and Nano
题面:有n堆石子,两个人轮流取,Hakase 一轮必须取两次,另一个人一轮取一次,最后取光的人胜利,给出先后手顺序,判断哪个人必胜
思路:通过两个人的简单模拟,可以发现Hakase的优势很大,它的必败情况很少。
以下四种为必败情况
H先手,并且所有石子堆都是1,并且石子堆数%3==0
H后手,并且所有石子堆都是1,并且石子堆数%3==1
H后手,并且有一个石子堆的个数不是1,其它全是1,并且石子堆数%3==0 || %3 == 1
#include<bits/stdc++.h> using namespace std; #define N 1000010 int n, d;
int arr[N]; int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&d);
int num = ;
for(int i = ; i <= n; ++i)
{
scanf("%d",&arr[i]);
if(arr[i] > ) num++;
}
if(num >= )
{
puts("Yes");
continue;
}
if(d == )
{
if(num == && n % == ) puts("No");
else puts("Yes");
}
else if(d == )
{
if(num == && n % == ) puts("No");
else if(num == && (n % == || n % == )) puts("No");
else puts("Yes");
}
}
return ;
}
D:Master of Random
题意:给出一棵树,每个节点都有一个权值,对于第i个节点,它的father是random(0, i-1),求任意一颗子树的权值期望。
题意:对于一颗子树,它的权值为自身权值加上除自己以外的权值期望。对于节点i,那么i+1是节点i的子节点的概率为1/(1 + i),对于第i+2个节点是节点i的子节点的概率为1/(i+2)+1/(i+1)*1/(i+2)=1/(i+1),从而发现后面每个节点是i的子节点的概率都为1/(i+1)。那么第i个节点的权值期望就为ai+1/(i+1)*∑aj(j from i+1 to n-1)
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MOD = ; #define N 100010 inline ll qpow(ll x,ll n)
{
ll res = ;
while(n)
{
if(n & ) res = (res * x) % MOD;
x = (x * x) % MOD;
n >>= ;
}
return res;
} int n;
ll a[N];
ll sum[N]; int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i = ;i < n; ++i)
{
scanf("%lld",&a[i]);
}
memset(sum, , sizeof sum);
for(int i = n - ; i >= ; --i)
{
sum[i] = (sum[i + ] + a[i]) % MOD;
}
ll ans = ;
for(int i = ;i < n; ++i)
{
ans = (ans + (a[i] + sum[i + ] * qpow(i + , MOD - ) % MOD) % MOD) % MOD;
}
ans = (ans * qpow(n, MOD - )) % MOD;
printf("%lld\n", ans);
}
return ;
}
E:Master of Subgraph
留坑。
F:Hearthock
留坑。
G:Marriage
留坑。
H:Master of Connexted Component
留坑。
I:Master of Matrix
留坑
J:Master of GCD
题意:有n个数刚开始都是1,然后每次操作使得(l, r)区间的所有数都乘上x,x == 2 || x ==3 求所有数的最大公约数
思路:显然,我们找出乘2最少的次数n,以及乘3最少的次数m 答案就是2^n * 3*m
#include<bits/stdc++.h> using namespace std; typedef long long ll;
const int INF = 0x3f3f3f3f;
const int p = ;
#define N 100010 int n, m; ll sum_2[N], sum_3[N]; ll qpow(ll x,ll n)
{
ll res = ;
while(n)
{
if(n & ) res = (res * x) %p;
x = (x * x) % p;
n >>= ;
}
return res;
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(sum_2, , sizeof sum_2);
memset(sum_3, , sizeof sum_3);
scanf("%d %d",&n,&m);
for(int i = ; i < m; ++i)
{
int l,r,x;
scanf("%d %d %d",&l ,&r ,&x);
if(x == )
{
sum_2[l]++;
sum_2[r + ]--;
}
else
{
sum_3[l]++;
sum_3[r + ]--;
}
}
ll Min_2 = INF;
ll Min_3 = INF;
ll op_2 = , op_3 = ;
for(int i = ; i <= n; ++i)
{
op_2 += sum_2[i];
Min_2 = min(Min_2, op_2);
op_3 += sum_3[i];
Min_3 = min(Min_3, op_3);
}
ll ans = ;
ans = (ans * qpow(, Min_2)) % p;
ans = (ans * qpow(, Min_3)) % p;
printf("%lld\n",ans);
}
return ;
}
K:Master of Sequence
题意:两组序列,三种操作。
思路:ai很小,我们可以考虑对ai作文章。可以把那个式子拆开看成 floor(t / ai) - (bi / ai)
然后预处理出bi / ai 的整数部分和余数部分 并且将所有整数部分相加得到sum
然后查询的时候二分枚举t,查询的时候用去考虑对于同一个ai, 如果t/ai 的余数小于 bi/ai 的余数 那就需要多减一 然后加上整数部分
然后前缀和处理一下,二分的时间复杂度为logn * 1000
修改的时间复杂度为O(1000)
#include <bits/stdc++.h> using namespace std; #define N 100010 #define M 1010 #define ll long long #define INFLL (ll)1e12 int arr[N], brr[N]; int a[M][M]; ll sum; int n, m; inline bool check(ll mid, ll k)
{
ll tot = -sum;
for (int i = ; i <= ; ++i)
{
ll tmp = mid / i;
ll MOD = mid % i;
tot += tmp * a[i][];
tot -= a[i][MOD + ];
}
return tot >= k;
} int main()
{
int t; scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; ++i)
scanf("%d", arr + i);
for (int i = ; i <= n; ++i)
scanf("%d", brr + i);
memset(a, , sizeof a);
sum = ;
for (int i = ; i <= n; ++i)
{
a[arr[i]][brr[i] % arr[i]]++;
sum += brr[i] / arr[i];
}
for (int i = ; i <= ; ++i)
{
for (int j = ; j >= ; --j)
{
a[i][j] += a[i][j + ];
}
}
int op, x, y, k;
while (m--)
{
scanf("%d", &op);
if (op == )
{
scanf("%d%d", &x, &y);
int tmp = arr[x]; arr[x] = y;
for (int i = ; i <= brr[x] % tmp; ++i)
a[tmp][i]--;
sum -= brr[x] / tmp;
sum += brr[x] / arr[x];
for (int i = ; i <= brr[x] % arr[x]; ++i)
a[arr[x]][i]++;
}
else if (op == )
{
scanf("%d%d", &x, &y);
int tmp = brr[x]; brr[x] = y;
for (int i = ; i <= tmp % arr[x]; ++i)
a[arr[x]][i]--;
sum -= tmp / arr[x];
sum += brr[x] / arr[x];
for (int i = ; i <= brr[x] % arr[x]; ++i)
a[arr[x]][i]++;
}
else if (op == )
{
scanf("%d", &k);
ll l = , r = INFLL, ans = -;
while (r - l >= )
{
ll mid = (l + r) >> ;
if (check(mid, (ll)k))
{
ans = mid;
r = mid - ;
}
else
{
l = mid + ;
}
}
printf("%lld\n", ans);
}
}
}
return ;
}
L:Mod, Xor and Everything
留坑。
The 2017 China Collegiate Programming Contest, Hangzhou Site Solution的更多相关文章
- The 2019 China Collegiate Programming Contest Harbin Site F. Fixing Banners
链接: https://codeforces.com/gym/102394/problem/F 题意: Harbin, whose name was originally a Manchu word ...
- 2017 China Collegiate Programming Contest Final (CCPC 2017)
题解右转队伍wiki https://acm.ecnu.edu.cn/wiki/index.php?title=2017_China_Collegiate_Programming_Contest_Fi ...
- The 2019 China Collegiate Programming Contest Harbin Site
题解: https://files.cnblogs.com/files/clrs97/HarbinEditorialV2.zip Code: A. Artful Paintings /* let x= ...
- The 2019 China Collegiate Programming Contest Harbin Site K. Keeping Rabbits
链接: https://codeforces.com/gym/102394/problem/K 题意: DreamGrid is the keeper of n rabbits. Initially, ...
- The 2019 China Collegiate Programming Contest Harbin Site J. Justifying the Conjecture
链接: https://codeforces.com/gym/102394/problem/J 题意: The great mathematician DreamGrid proposes a con ...
- The 2019 China Collegiate Programming Contest Harbin Site I. Interesting Permutation
链接: https://codeforces.com/gym/102394/problem/I 题意: DreamGrid has an interesting permutation of 1,2, ...
- 模拟赛小结:2017 China Collegiate Programming Contest Final (CCPC-Final 2017)
比赛链接:传送门 前期大顺风,2:30金区中游.后期开题乏力,掉到银尾.4:59绝杀I,但罚时太高卡在银首. Problem A - Dogs and Cages 00:09:45 (+) Solve ...
- 模拟赛小结:The 2019 China Collegiate Programming Contest Harbin Site
比赛链接:传送门 上半场5题,下半场疯狂挂机,然后又是差一题金,万年银首也太难受了. (每次银首都会想起前队友的灵魂拷问:你们队练习的时候进金区的次数多不多啊?) Problem J. Justify ...
- The 2015 China Collegiate Programming Contest A. Secrete Master Plan hdu5540
Secrete Master Plan Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Othe ...
随机推荐
- dos命令临时和永久设置环境变量方法
方法一:批处理中,修改环境变量,一次性有效(也就是在当前的脚本中有效) CMD中运行:set path==%path%;d:/mypath 用 set path可以查看,当前的环境变量 方 ...
- HTTP 请求过程
如下,我们在浏览器输入一个域名,按回车之后,便向该域名对应的服务器发送了一个请求:服务器接收到这个请求后进行处理和解析,然后返回响应的内容给浏览器,浏览器再对其进行解析然后呈现网页 我们可以通过 Ch ...
- COM组件技术名称解释
GUID:全局唯一标识. CLSID 或 ProgID :唯一地表示一个组件服务程序,那么根据这些ID,就可以加载运行组件,并为客户端程序提供服务了. IID :唯一的表示接口ID. COM 组件是运 ...
- 《转载》POI导出excel日期格式
参考帖子: [1]http://www.ithao123.cn/content-2028409.html [2]http://javacrazyer.iteye.com/blog/894850 再读本 ...
- Objective-c官方文档翻译 类的定义
类是对象的蓝图. 一个类是描述了对象的行为和属性.例如NSString的一个实例.他的类提供了各种的方法来转化和表示他的内部字符的表示. 每个类的实例都包含了这个类的属性和行为.例如每个NSSt ...
- Android 7.1 SystemUI--任务管理--场景一:长按某个缩略图,拖动分屏的流程
TaskView 类的长按事件 onLongClick 方法内发送了 DragStartEvent 事件消息,该 DragStartEvent 事件消息由 RecentsView,TaskStackV ...
- Dropwizard简单入门
Dropwizard:一个简洁的RESTful Web框架 Dropwizard跨越了开发库与框架的界限,旨在为Web应用所需的功能提供高性能.可靠的实现.Dropwizard将这些功能抽象为可重用的 ...
- Ubuntu16.04安装Nessus和MSF
一.Nessus篇: 1.参考文献:https://www.cnblogs.com/shamojituan/p/6511208.html 2.下载地址:https://downloads.nessus ...
- org.apache.commons.beanutils.BeanUtils的常见用法
import org.apache.commons.beanutils.BeanUtils BeanUtils1. public static void copyProperty(Object bea ...
- onethink重新安装后,还原数据库后,登陆不了解决办法!
在用onethink开发的时候,为了防止修改出错,我会在开发下一个功能的对上一个功能代码整体进行备份,如果出错就返回上一个版本再次修改. 但是会发现一个问题,如果如果返回到上一个版本,重新安装完成之后 ...