2020 CCPC-Wannafly Winter Camp Day2
2020 CCPC-Wannafly Winter Camp Day2
A 托米的字符串
虽然每个子串出现的概率是相同的,但是同一长度的子串个数是不同的,所以要分别处理。计算出某一长度的情况下,元音字母的贡献,然后计算期望即可。
cls题解上的思路很清晰...我的代码太暴力了。
const int N = 1000010;
char s[N];
int a[N],n;
ll d[N],c[N];
int main()
{
scanf("%s",s+1);
n = strlen(s+1);
double res = 0;
for(int i=1;i<=n;i++){
if(s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u' || s[i] == 'y'){
a[i] = 1;
}
}
for(int i=1;i<=n;i++){
if(a[i] == 1){
d[i] = min(i,n-i+1);
}
d[i] += d[i-1];
a[i] += a[i-1];
}
for(int i=1;i<=n;i++){
int l = min(i,n-i+1);
int r = max(i,n-i+1);
c[i] = 1ll * min(l,r) * (a[r] - a[l-1]) + d[l-1] + d[n] - d[r];//长度为i的贡献
//cout << i << ' ' <<' ' << l << ' ' << r << ' ' << c[i] << endl;
res += 1.0 * c[i] / i;
}
res /= 1ll*n*(n+1)/2;
printf("%.10f\n",res);
return 0;
}
C.纳新一百的石子游戏
nim游戏,再胜局的情况下,要使得异或和变为0,必须选取某一堆拿一定数量的石子。如果逐个遍历前面所有的石子去验证是否可行复杂度会爆炸,所以通过位运算的规律来优化。异或和的结果最高位的1可以在异或操作中起到翻转作用,所以只需要一个长度60的数组来记录对应位为1的数字有多少个就可以了。
const int N = 100010;
int d[61],n;
ll a[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
ll x = 0;
for(int i=1;i<=n;i++){
for(int j=60;j>=0;j--){
if(a[i] >> j & 1){
d[j]++;
}
}
x ^= a[i];
int res = 0;
for(int j=60;j>=0;j--){
if(x >> j & 1){
res = d[j];
//printf("%d\n",d[j]);
break;
}
}
printf("%d\n",res);
}
return 0;
}
E. 阔力梯的树
考虑子树合并的操作,每次都让轻儿子向重儿子合并即可。方法是重儿子的所有数存在set中,然后将所有轻儿子的节点以\(O(logSize)\)的复杂度插入,插入的时候顺便更新答案即可。
有关树上启发式合并的内容:https://oi-wiki.org/graph/dsu-on-tree/
const int N = 100010;
int head[N],ver[N<<1],nxt[N<<1],tot,n,cnt,id[N],l[N];
int son[N],sz[N];
ll res[N];
set<int> s;
void add(int x,int y){
ver[++tot] = y;nxt[tot] = head[x];head[x] = tot;
}
void pre(int x){
sz[x] = 1;
l[x] = ++ cnt;
id[cnt] = x;
for(int i=head[x];i;i=nxt[i]){
int y = ver[i];
pre(y);
sz[x] += sz[y];
if(sz[y] > sz[son[x]]){
son[x] = y;
}
}
}
void modify(int x,int val){
set<int>::iterator it = s.lower_bound(val);
if(s.size() == 0){
s.insert(val);
return;
}
if(it == s.begin()){ // 最小的比它大
ll tmp = (*it) - val;
res[x] += tmp * tmp;
}else if(it == s.end()){
it--;
ll tmp = val - (*it);
res[x] += tmp * tmp;
}else{
ll tmp = (*it) - (*(--it));
res[x] -= tmp * tmp;
tmp = val - (*it);
res[x] += tmp * tmp;
tmp = (*(++it)) - val;
res[x] += tmp * tmp;
}
s.insert(val);
}
void dfs(int x,bool flag){
for(int i=head[x];i;i=nxt[i]){
int y = ver[i];
if(y == son[x])continue;
dfs(y,false);
}
if(son[x])dfs(son[x],true);
res[x] = res[son[x]];
for(int i=head[x];i;i=nxt[i]){
int y = ver[i];
if(y == son[x])continue;
//cout << y << ' ' << l[y] << ' ' << l[y] + sz[y] - 1 << endl;
for(int j=l[y];j<=l[y]+sz[y]-1;j++){
//添加,计算答案
modify(x,id[j]);
}
}
modify(x,x);
if(!flag){
s.clear();
}
}
int main()
{
scanf("%d",&n);
for(int i=2;i<=n;i++){
int x;
scanf("%d",&x);
add(x,i);
}
pre(1);
dfs(1,false);
for(int i=1;i<=n;i++){
printf("%lld\n",res[i]);
}
return 0;
}
H. 叁佰爱抠的序列
欧拉回路问题,m个点,如果m是奇数那么完全图即欧拉图,是偶数则需要至少补\((m-2)\over 2\)条边使得m-2个点的度数为偶数,2个点度数为奇数并作为起始点和终点。
二分找到最大的m,然后建图求出欧拉路径即可
const int N = 2010;
const int M = 8000010;
ll n;
int head[N],ver[M],nxt[M],tot;
int st[N*N],ans[N*N],vis[M],top,t;
inline ll getNum(ll x){
if(x & 1){
return (x * x - x) / 2 + 1;
}else return x * x / 2;
}
inline void add(int x,int y){
ver[++tot] = y;nxt[tot] = head[x];head[x] = tot;
}
void euler(){
st[++top] = 1;
while(top){
int x = st[top],i = head[x];
while(i && vis[i]) i = nxt[i];
if(i){
st[++top] = ver[i];
vis[i] = vis[i^1] = true;
head[x] = nxt[i];
}else{
top --;
ans[++t] = x;
}
}
}
int main()
{
scanf("%lld",&n);
ll m = 0,l = 1,r = 1500000000;
while(l < r){
ll mid = l + r + 1>> 1;
if(getNum(mid) <= n){
l = mid;
}else r = mid - 1;
}
m = l;
if(n > 2000000){
printf("%lld\n",m);
return 0;
}
tot = 1;
for(int i=1;i<=m;i++){
for(int j=i+1;j<=m;j++){
add(i,j);
add(j,i);
}
}
if(m % 2 == 0){
for(int i = 2;i < m;i += 2){
add(i,i+1);
add(i+1,i);
}
}
euler();
// cout << t << endl;
for(int i=t+1;i<=n;i++){
ans[i] = 1;
}
printf("%lld\n",m);
for(int i=1;i<=n;i++){
if(i > 1)printf(" ");
printf("%d",ans[i]);
}
puts("");
return 0;
}
K.破忒头的匿名信
所有的串总长为5e5,那么不同长度的串最多有根号n个。建好AC自动机后,顺着遍历目标串,对于每个符合要求的当前后缀,都可以产生一次有效转移(所有转移等同于DAG上求最短路),总共最多发生\(\sqrt{n}\)次转移。所以复杂度最多\(O(n*\sqrt{n})\)。
const int inf = 0x3f3f3f3f;
const int N = 5e5 + 10;
int n,vis[N];
char s[N];
ll d[N];
namespace AC{
int tr[N][26],tot;
int e[N],fail[N],dep[N];
ll val[N];
queue<int> q;
void init(){
for(int i=0;i<=tot;i++){
memset(tr[i],0,sizeof tr[i]);
fail[i] = e[i] = 0;
}
tot = 0;
}
void insert(char *s,ll v){
int u = 0;
int len = strlen(s + 1);
for(int i=1;i<=len;i++){
if(!tr[u][s[i] - 'a']){
tr[u][s[i] - 'a'] = ++tot;
val[tot] = inf;
}
u = tr[u][s[i] - 'a'];
dep[u] = i;
}
e[u] ++;
val[u] = min(val[u],v);
}
void build(){
for(int i=0;i<26;i++)if(tr[0][i])q.push(tr[0][i]);
while(q.size()){
int u = q.front();q.pop();
for(int i=0;i<26;i++){
if(tr[u][i])fail[tr[u][i]] = tr[fail[u]][i],q.push(tr[u][i]);
else tr[u][i] = tr[fail[u]][i];
}
}
}
void query(char *t){
int u = 0,res = 0;
for(int i=1;t[i];i++){
u = tr[u][t[i] - 'a'];
for(int j = u; j; j = fail[j]){ //深度 dep[j], 价值 val[j];
if(vis[i - dep[j]] && e[j]){
d[i] = min(d[i],d[i-dep[j]] + val[j]);
vis[i] = 1;
}
}
}
}
}
int main(){
scanf("%d",&n);
AC::init();
for(int i=1;i<=n;i++){
ll val;
scanf("%s%lld",s+1,&val);
AC::insert(s,val);
}
scanf("%s",s+1);
AC::build();
int len = strlen(s+1);
vis[0] = 1;
for(int i=1;i<=len;i++){
d[i] = 1ll * inf * inf;
}
AC::query(s);
//for(int i=1;i<=len;i++)cout << d[i] << ' ' ; cout << endl;
if(!vis[len]){
puts("-1");
}else{
printf("%lld\n",d[len]);
}
return 0;
}
2020 CCPC-Wannafly Winter Camp Day2的更多相关文章
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- 2020 CCPC Wannafly Winter Camp Day1 Div.1& F
#include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...
- 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)
题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...
- 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信
题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...
- 2020 CCPC Wannafly Winter Camp Day1-F-乘法
题目传送门 sol:二分答案$K$,算大于$K$的乘积有多少个.关键在于怎么算这个个数,官方题解上给出的复杂度是$O(nlogn)$,那么计算个数的复杂度是$O(n)$的.感觉写着有点困难,自己写了一 ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- 2019 wannafly winter camp
2019 wannafly winter camp Name Rank Solved A B C D E F G H I J K day1 9 5/11 O O O O O day2 5 3/11 O ...
- 2019 wannafly winter camp day 3
2019 wannafly winter camp day 3 J 操作S等价于将S串取反,然后依次遍历取反后的串,每次加入新字符a,当前的串是T,那么这次操作之后的串就是TaT.这是第一次转化. 涉 ...
- Wannafly Winter Camp 2020 Day 7E 上升下降子序列 - 数学
神奇公式 #include <bits/stdc++.h> using namespace std; #define int long long int n,mod,c[205][205] ...
随机推荐
- Ubuntu上好用的截图工具——flameshot
前言 堪称完美的截图工具--flameshot,windows上人们习惯性的使用QQ自带的截图工具Ctrl+Alt+A或者WeChat自带的截图工具Alt+A,若您是一位使用聊天工具截图多年的&q ...
- ORA-28001: the password has expired解决方法
Oracle提示错误消息ORA-28001: the password has expired,是由于Oracle11G的新特性所致, Oracle11G创建用户时缺省密码过期限制是180天(即6个月 ...
- 醒醒!Python已经支持中文变量名啦!
最近,我在翻阅两本比较新的 Python 书籍时,发现它们都犯了一个严重的低级错误! 这两本书分别是<Python编程:从入门到实践>和<父与子的编程之旅>,它们都是畅销书,都 ...
- 大厂面试官竟然这么爱问Kafka,一连八个Kafka问题把我问蒙了?
本文首发于公众号:五分钟学大数据 在面试的时候,发现很多面试官特别爱问Kafka相关的问题,这也不难理解,谁让Kafka是大数据领域中消息队列的唯一王者,单机十万级别的吞吐量,毫秒级别的延迟,这种天生 ...
- TCP连接的建立与释放(超详细)
前言:在计算机网络协议中,TCP只是其中一个,然而在网络使用中,TCP也是最离不开的协议之一,它的重要性毋庸置疑,最最重要的是,面试的重点就是它啊,呜呜~~,今天我们一起来看下TCP的连接建立与释放, ...
- 【剑指 Offer】10-II.青蛙跳台阶问题
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008, ...
- LeetCode1337矩阵中最弱的K行
题目 给你一个大小为 m * n 的矩阵 mat,矩阵由若干军人和平民组成,分别用 1 和 0 表示. 请你返回矩阵中战斗力最弱的 k 行的索引,按从最弱到最强排序. 如果第 i 行的军人数量少于第 ...
- ctfhub技能树—RCE—过滤空格
打开靶机 查看页面信息 开始尝试注入 127.0.0.1 || ls 尝试绕过 127.0.0.1||ls 使用cat命令查看flag 127.0.0.11||cat<flag_10872536 ...
- 【Azure 存储服务】Python模块(azure.cosmosdb.table)直接对表存储(Storage Account Table)做操作示例
什么是表存储 Azure 表存储是一项用于在云中存储结构化 NoSQL 数据的服务,通过无结构化的设计提供键/属性存储. 因为表存储无固定的数据结构要求,因此可以很容易地随着应用程序需求的发展使数据适 ...
- qt for webassembly环境搭建图文教程
一.前言 从Qt5.14开始,官方的在线安装提供了qt for webassembly构建套件,这对很多小白来说绝对是个好消息,也绝对是个好东西,好消息是不用再去交叉编译自己生成qt for weba ...