Codeforces Round #447 (Div. 2)
我感觉这场CF还是比较毒的,虽然我上分了。。。
Problem A QAQ
题目大意:给你一个由小写字母构成的字符串,问你里面有多少个QAQ。
思路:找字符串中的A然后找两边的Q即可,可以枚举找Q,也可以前缀和优化一下。
#include<bits/stdc++.h>
using namespace std;
char s[];
int sum[];
long long ans;
int main()
{
scanf("%s",s+);
int n=strlen(s+);
for(int i=;i<=n;i++)
{
sum[i]=sum[i-];
if(s[i]=='Q') sum[i]++;
}
int all=sum[n];
for(int i=;i<=n;i++)
{
if(s[i]!='A') continue;
ans+=(long long)(sum[i])*(all-sum[i]);
}
cout<<ans<<endl;
return ;
}
Problem B Ralph And His Magic Field
题目大意:给你n(n<=1e18),m (m<=1e18),k(k==1 || k==-1),说明是一个n行m列的一个矩阵,现在让你往这个矩阵里面填数字,
使得每一行每一列的数字的乘积微为k。
思路:刚开始看到的时候在想公式,然后想不出来,后来打了个表找出了规律,答案是(2^(n-1))^(m-1),然后套一下快速幂就好啦。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long n,m,k;
long long mod=1e9+;
long long modexp(long long a, long long b, int mod)
{
long long res=;
while(b>)
{
a=a%mod;
if(b&) res=res*a%mod;
b=b>>;
a=a*a%mod;
}
return res;
}
int main()
{
cin>>n>>m>>k;
if(k==- && (n+m)&)
{
puts("");
return ;
}
ll ans=;
ll g=modexp(,n-,mod);
ans=modexp(g,m-,mod);
cout<<ans<<endl;
return ;
}
Problem C Marco and GCD Sequence
题目大意:给你一个从小到大集合,这个集合的元素是另外一个数列连续子段的gcd的集合,让你构造出这个数列。
思路:比赛的时候想的是判断一下原序列任意两个的gcd是不是在这个序列里边,如果全部都在输出原序列,否则
输出-1,结果终判被卡掉了。。。
正确解法是看原序列里每一个元素是否能被第一个元素整除,如果都能整除就在每个元素后边插入第一个元素,然
后输出就可以啦,因为第一个元素肯定是原数列所有所有数字的gcd,那么我们在集合每个元素后边插入第一个元素
构成的数列的连续子段的gcd要么是本身要么是集合的第一个元素。
#include<bits/stdc++.h>
using namespace std;
const int N=;
int m,a[N];
int main()
{
scanf("%d",&m);
for(int i=;i<=m;i++) scanf("%d",&a[i]);
for(int i=;i<=m;i++)
{
if(a[i]%a[])
{
puts("-1");
return ;
}
}
printf("%d\n",*m);
for(int i=;i<=m;i++)
{
printf("%d ",a[i]);
printf("%d ",a[]);
}
puts("");
return ;
}
Problem D Ralph And His Tour in Binary Country
题目大意:给你一棵按顺序构建的二叉树,给你这些边的权值,由m个询问,每个询问给你一个A和一个H,A是出发点
H是愉悦值,每个点的权值为这个点到A的距离d,然后求所有d-H>=0 的点的(d-H)的和。
思路:每个二叉树的节点保存左子树所有点到当前点的距离,右子树所有点到当前点的距离,然后对这两个序列排序,
并且求前缀和。 然后对于每次询问我们要的答案就是,通过二分A节点保存的序列 对下边的子树求贡献,加到答案里,
然后不断地找A的祖先,将之前没有计算过的贡献加到答案里面,查询复杂度为O(m logn logn)。
#include<bits/stdc++.h>
#define pii pair<int,int>
#define mk make_pair
using namespace std;
const int N=1e6+,M=1e5+;
int n,m;
vector<long long> vec[][N];
vector<long long> e[N];
void build(int cur)
{
if((cur<<)<=n)
{
build(cur<<);
long long g=e[cur][];
for(int i:vec[][cur<<]) vec[][cur].push_back(g+i);
for(int i:vec[][cur<<]) vec[][cur].push_back(g+i);
vec[][cur].push_back(g);
sort(vec[][cur].begin(),vec[][cur].end());
}
if((cur<<|)<=n)
{
build(cur<<|);
long long g=e[cur][];
for(int i:vec[][cur<<|]) vec[][cur].push_back(g+i);
for(int i:vec[][cur<<|]) vec[][cur].push_back(g+i);
vec[][cur].push_back(g);
sort(vec[][cur].begin(),vec[][cur].end());
}
vec[][cur].resize(vec[][cur].size());
vec[][cur].resize(vec[][cur].size());
for(int i=;i<vec[][cur].size();i++)
{
vec[][cur][i]=vec[][cur][i];
if(i) vec[][cur][i]+=vec[][cur][i-];
}
for(int i=;i<vec[][cur].size();i++)
{
vec[][cur][i]=vec[][cur][i];
if(i) vec[][cur][i]+=vec[][cur][i-];
}
}
long long work(int v,int H)
{
long long ans=;
int flag=-,item=-;
long long pre=;
while(v)
{
if(pre<=H) ans=ans+H-pre;
else break;
if(flag!= && vec[][v].size())
{
item=lower_bound(vec[][v].begin(),vec[][v].end(),H-pre)-vec[][v].begin();
if(item) ans=ans-vec[][v][item-]+(long long)(item)*(H-pre); }
if(flag!= && vec[][v].size())
{
item=lower_bound(vec[][v].begin(),vec[][v].end(),H-pre)-vec[][v].begin();
if(item) ans=ans-vec[][v][item-]+(long long)(item)*(H-pre);
}
int nx=v>>,g;
if(nx==) break;
if(v&) flag=,g=e[nx][];
else flag=,g=e[nx][];
pre+=g; v=nx;
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
{
int L; scanf("%d",&L);
e[(i+)/].push_back(L);
}
build();
while(m--)
{
int A,H; scanf("%d%d",&A,&H);
long long ans=work(A,H);
printf("%I64d\n",ans);
}
return ;
}
Problem E Ralph and Mushrooms
题目大意:给你n个点,m条边,每条边有个权值k,还有一个人在起点s。每条边经过1次后权值减1,经过第二次权值减2
……,然后问你这个人走过路的权值和最大为多少。
思路:先求强联通分量,然后缩点,可以知道一个强连通分量里任意两个点之间的边最后肯定为0。所以我们可以扫一遍所
有边,如果这条边两端的点属于同一个强连通分量则将这条边对应的贡献加到这个强连通分量上,否则我们将对应的两个
强连通分量连接起来。 最后dfs在拓扑图上进行记忆话搜索就能得到答案。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int P=1e6;
const int N=2e6+;
const int M=2e6+;
const int inf=0x3f3f3f3f;
struct edge
{
int f,t,next;
ll v;
}e[M];
int n,m,tot,all,s,cnt,head[N],dfn[N],low[N],st[N],id[N];
int dindex;
bool inst[N];
ll num[N],sum[],val[N];
void add(int f,int t,ll v)
{
e[tot].f=f; e[tot].t=t; e[tot].v=v;
e[tot].next=head[f]; head[f]=tot++;
}
void tarjan(int v)
{
dindex++;
dfn[v]=low[v]=dindex;
st[all++]=v; inst[v]=true;
for(int i=head[v];~i;i=e[i].next)
{
int nx=e[i].t;
if(!dfn[nx])
{
tarjan(nx);
low[v]=min(low[v],low[nx]);
}
else if(inst[nx]) low[v]=min(low[v],dfn[nx]);
}
if(dfn[v]==low[v])
{
cnt++;
while()
{
int cur=st[--all];
inst[cur]=false;
id[cur]=cnt;
if(cur==v) break;
}
}
}
ll work(ll x)
{
ll ans=;
int item=lower_bound(num,num+,x)-num;
ans-=sum[item];
ans+=x*(item+);
ans+=num[item]-x;
return ans;
}
ll dfs(int v)
{
ll res=;
dfn[v]=;
for(int i=head[v];~i;i=e[i].next)
{
int nx=e[i].t;
if(!dfn[nx]) res=max(res,e[i].v+dfs(nx));
else res=max(res,val[nx]+e[i].v);
}
val[v]+=res;
return val[v];
}
int main()
{
num[]=; cnt=; all=; tot=; dindex=;
for(int i=;i<=;i++) num[i]=num[i-]+i,sum[i]=sum[i-]+num[i];
memset(head,-,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int f,t; ll v;
scanf("%d%d%lld",&f,&t,&v);
add(f,t,v);
}
scanf("%d",&s);
tarjan(s);
int up=tot;
for(int i=;i<up;i++)
{
int a=e[i].f,b=e[i].t;
if(!id[a] || !id[b]) continue;
if(id[a]==id[b]) val[id[a]+P]+=work(e[i].v);
else if(id[a]<id[b]) add(id[b]+P,id[a]+P,e[i].v);
else add(id[a]+P,id[b]+P,e[i].v);
}
ll ans=dfs(id[s]+P);
printf("%lld\n",ans);
return ;
}
Codeforces Round #447 (Div. 2)的更多相关文章
- Codeforces Round #447 (Div. 2) B. Ralph And His Magic Field 数学
题目链接 题意:给你三个数n,m,k;让你构造出一个nm的矩阵,矩阵元素只有两个值(1,-1),且满足每行每列的乘积为k,问你多少个矩阵. 解法:首先,如果n,m奇偶不同,且k=-1时,必然无解: 设 ...
- Codeforces Round #447 (Div. 2) 题解 【ABCDE】
BC都被hack的人生,痛苦. 下面是题解的表演时间: A. QAQ "QAQ" is a word to denote an expression of crying. Imag ...
- Codeforces Round #447 (Div. 2) 题解
A.很水的题目,3个for循环就可以了 #include <iostream> #include <cstdio> #include <cstring> using ...
- Codeforces Round #447 (Div. 2) C 构造
现在有一个长度为n的数列 n不超过4000 求出它的gcd生成set 生成方式是对<i,j> insert进去(a[i] ^ a[i+1] ... ^a[j]) i<=j 然而现在给 ...
- Codeforces Round #447 (Div. 2) C. Marco and GCD Sequence【构造/GCD】
C. Marco and GCD Sequence time limit per test 1 second memory limit per test 256 megabytes input sta ...
- Codeforces Round #447 (Div. 2) B. Ralph And His Magic Field【数论/组合数学】
B. Ralph And His Magic Field time limit per test 1 second memory limit per test 256 megabytes input ...
- Codeforces Round #447 (Div. 2) A. QAQ【三重暴力枚举】
A. QAQ time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- Codeforces Round #447 (Div. 2)E. Ralph and Mushrooms
Ralph is going to collect mushrooms in the Mushroom Forest. There are m directed paths connecting n ...
- 【Codeforces Round #447 (Div. 2) B】Ralph And His Magic Field
| [链接] 我是链接,点我呀:) [题意] 给你一个n*m矩阵,让你在里面填数字. 使得每一行的数字的乘积都为k; 且每一列的数字的乘积都为k; k只能为1或-1 [题解] 显然每个位置只能填1或- ...
随机推荐
- 八、IIC 接口
8.1 IIC接口介绍 8.1.1 IIC 总线的概念 I2C总线是由Philips公司开发的一种简单.双向二线制同步串行总线.它只需要两根线即可在连接于总线上的器件之间传送信息. 主器件用于启动总线 ...
- (转)MFC界面风格
以前在XP写的程序,现在系统换成了WIN7,现在对话框在编辑和预览的时候显示都如图一所示,可实际编译生成之后的显示却如图二所示,是什么问题?如何设置两者的显示风格使其保持一致? ----------- ...
- cocos2d-x 2.1.4 项目配置过程
http://cocos2d-x.org 下载cocos2d-x 2.1.4 使用project-creator.py脚本创建Cocos2d-win32 Application项目 1.先下载Wind ...
- python的__mro__与__slot__
class A(object): def __init__(self): print ' -> Enter A' print ' <- Leave A' class B(A): def _ ...
- 个人经验~mysql故障处理思路
一 简介:个人经验总结 二 思路: 从整体上再进行梳理 三 linux角度 1 硬件是否有问题 常见主板 raid卡 和raid磁盘组 2 综合指标 负载 uptime : 1min 5min ...
- Maven聚合工程的使用
创建一个service模块 接下来,在该项目中创建一个接口 创建一个实现类,并实现接口 在sm1234-web项目中,调用service的方法,需要在该项目的pom.xml中引入依赖Service模块 ...
- Freemarker导出带多个不重复图片的word
1.新建一个word,添加一张图片,调整好图片大小与位置.
- host-only
https://www.cnblogs.com/yaox/p/6635312.html
- 【PE结构】PIMAGE_FILE_HEADER中TimeDateStamp的时间戳与标准时间转换
计算PE文件创建时间,需要对时间进行转换,也就是将时间戳转换成特定的格式,或者特定的格式转换成时间戳. pImageFileHeader->TimeDateStamp的值为1487665851 ...
- 同步阿里云镜像到本地,在本地搭建YUM仓库
1.下载阿里云镜像repo文件 项目使用CentOS6系统,因此我下载的文件是: # CentOS-Base.repo # # The mirror system uses the connectin ...