Codeforces #381(div2)
A.题目:http://codeforces.com/contest/740/problem/A
题意:现有n本书,买一本书需要花a元,两本书b元,三本书c元,问买够书是4的倍数所需要的最小花费
思路:n%4=1的时候可以3a a+b c n%4=2 2a b 2c n%4==3 a b+c 3c 取个最小值就好了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
long long n,a,b,c;
while(scanf("%lld %lld %lld %lld",&n,&a,&b,&c)!=EOF){
long long ans;
if(n%==){
printf("0\n");
continue;
}
else if(n%==){
ans=min(*a,c);
ans=min(a+b,ans);
}
else if(n%==){
ans=min(*a,b);
ans=min(ans,c*);
}
else if(n%==){
ans=min(a,b+c);
ans=min(ans,*c);
}
printf("%lld\n",ans);
}
return ;
}
B:题目:http://codeforces.com/contest/740/problem/B
题意:有n朵花每朵花有自己的价值ai,正或者负,现在有m个建议的区间,选择其中一些区间,计算花被选中的次数ki,求s=(a1*k1+a2*k2...+an*kn)的最大值
思路:最后总的值是看每个区间的贡献,也就是区间的价值如果大于0就加上去
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=;
int a[maxn];
int n,m;
struct node{
int l,r;
};
node num[maxn];
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
for(int i=;i<=n;i++) scanf("%d",&a[i]);
int sum=;
for(int i=;i<=m;i++){
scanf("%d %d",&num[i].l,&num[i].r);
int val=;
for(int j=num[i].l;j<=num[i].r;j++){
val+=a[j];
}
if(val>) sum+=val;
}
printf("%d\n",sum);
}
return ;
}
C:题目:http://codeforces.com/contest/740/problem/C
题意:有m个区间,构造一个长度为n的序列,使得m个区间中的mex(a[i]..a[j])的最小值最大,mex(a[i]..a[j])代表i到j这个区间中最小的没有出现过的非负整数
思路:m个区间中最小mex肯定是看区间长度最小的那一个并且mex=区间长度,之后的区间长度都大于或者等于它,而我们只需要mex最小的尽量大就行了,也就是其他区间的只要一定有区间长度最小的那个区间里面的数就行了,那么我们循环输出最小的区间长度,那么m个区间里面肯定都会包括这些数
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
const int maxn=1e5+;
int n,m;
int a[maxn];
set<int> s;
struct node{
int l,r;
int len;
};
node num[maxn];
bool cmp(const node&a,const node&b){
return a.len<b.len;
}
bool cmp1(const node&a,const node&b){
return a.l<b.l;
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
for(int i=;i<=m;i++){
int x,y;
scanf("%d %d",&x,&y);
num[i].l=x,num[i].r=y;
num[i].len=y-x+;
}
sort(num+,num++m,cmp);
int tmp=num[].len;
printf("%d\n",tmp);
for(int i=;i<=n;i++){
printf("%d%c",i%tmp,i==n?'\n':' ');
} }
return ;
}
D:题目:http://codeforces.com/contest/740/problem/D
题意:有n个节点的树,以1为根,每个点有权值a[i],每条边也有权值w[i],如果v是u的父亲节点并且dis(u,v)<=au 则表示v能控制u点,输出每个点能控制多少个点
思路:注意到u是儿子节点,也就是找到最远能控制u的父亲节点v,那么这一条路上所有的u的父亲都能控制u,也就是给这条路径上所有的节点+1,那么输出的时候只要统计每个节点的子树和就行了,当前节点是u,最远的能控制u的父亲节点v,假设v的父亲节点是v0,dfs序给树编号,那么一棵子树的编号肯定都是连着的,用树状数组维护和,查询v能控制多少个节点的时候只要查询v的子树和,但v0控制不了u,也就是在v0的位置-1,倍增找节点。
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=2e5+;
struct node{
int u;
int v;
long long dis;
};
vector<node> G[maxn];
int id[maxn];
int outId[maxn];
int fa[maxn][];
long long dis[maxn];
long long tree[maxn<<];
int n;
void add(int i,int k){
for(;i<=maxn;i+=(i&(-i))) tree[i]+=k;
}
long long query(int i){
long long sum=;
for(;i>;i-=(i&(-i))) sum+=tree[i];
return sum;
}
int cnt=;
void dfs(int x){
id[x]=++cnt;
for(int i=;i<=;i++){
fa[x][i]=fa[fa[x][i-]][i-];
}
for(int i=;i<G[x].size();i++){
int v=G[x][i].v;
if(fa[v][]) continue;
fa[v][]=x;
dis[v]=dis[x]+G[x][i].dis;
dfs(v);
}
outId[x]=cnt;
}
int a[maxn];
int main(){
scanf("%d",&n);
cnt=;
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++){
int x,y;
scanf("%d %d",&x,&y);
node tmp;
tmp.dis=y,tmp.v=i;
G[x].push_back(tmp);
}
fa[][]=;
dis[]=;
dfs();
long long Dis;
for(int i=;i<=n;i++){
int now=i;
add(id[i],);
for(int j=;j>=;j--){
if (dis[i]-dis[fa[now][j]]<=a[i]) now=fa[now][j];
}
if (now!=) add(id[fa[now][]],-);
}
for(int i=;i<=n;i++){
printf("%lld ",query(outId[i])-query(id[i]-)-);
}
printf("\n");
}
不用倍增 二分栈的写法
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
const int maxn=2e5+;
long long stk[maxn];
struct node{
int v;
long long dis;
};
int a[maxn];
long long dis[maxn];
int ans[maxn];
int stkid[maxn];
vector<node> G[maxn];
void dfs(int x,int cnt){
stk[cnt]=dis[x];
stkid[cnt]=x;
int v0=lower_bound(stk,stk+cnt+,dis[x]-a[x])-stk-;
ans[x]++,ans[stkid[v0]]--;
for(int i=;i<G[x].size();i++){
node it=G[x][i];
dis[it.v]=dis[x]+it.dis;
dfs(it.v,cnt+);
ans[x]+=ans[it.v];
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
memset(ans,,sizeof(ans));
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
G[i].clear();
}
for(int i=;i<=n;i++){
int x;
node tmp;
tmp.v=i;
scanf("%d %lld",&x,&tmp.dis);
G[x].push_back(tmp);
}
dis[]=;
dfs(,);
for(int i=;i<=n;i++){
printf("%d ",ans[i]-);
}
printf("\n");
}
return ;
}
E,F留坑
Codeforces #381(div2)的更多相关文章
- Codeforces #180 div2 C Parity Game
// Codeforces #180 div2 C Parity Game // // 这个问题的意思被摄物体没有解释 // // 这个主题是如此的狠一点(对我来说,),不多说了这 // // 解决问 ...
- Codeforces #541 (Div2) - E. String Multiplication(动态规划)
Problem Codeforces #541 (Div2) - E. String Multiplication Time Limit: 2000 mSec Problem Descriptio ...
- Codeforces #541 (Div2) - F. Asya And Kittens(并查集+链表)
Problem Codeforces #541 (Div2) - F. Asya And Kittens Time Limit: 2000 mSec Problem Description Inp ...
- Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)
Problem Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...
- Codeforces #548 (Div2) - D.Steps to One(概率dp+数论)
Problem Codeforces #548 (Div2) - D.Steps to One Time Limit: 2000 mSec Problem Description Input Th ...
- 【Codeforces #312 div2 A】Lala Land and Apple Trees
# [Codeforces #312 div2 A]Lala Land and Apple Trees 首先,此题的大意是在一条坐标轴上,有\(n\)个点,每个点的权值为\(a_{i}\),第一次从原 ...
- codeforces Round#381 div2
第一题: 按余数分类,1,2,3分别由哪些基数组成 1->[1][2+3][3+3+3] 2->[1+1][2][3+3] 3->[1+1+1][1+2][3] #include&l ...
- Codeforces #263 div2 解题报告
比赛链接:http://codeforces.com/contest/462 这次比赛的时候,刚刚注冊的时候非常想好好的做一下,可是网上喝了个小酒之后.也就迷迷糊糊地看了题目,做了几题.一觉醒来发现r ...
- codeforces #round363 div2.C-Vacations (DP)
题目链接:http://codeforces.com/contest/699/problem/C dp[i][j]表示第i天做事情j所得到最小的假期,j=0,1,2. #include<bits ...
随机推荐
- ionic3 Toast组件
html页面 <button ion-button color="dark" class="button-block" (click)="sho ...
- 瞧一瞧!这儿实现了MongoDB的增量备份与还原(含部署代码)
一 需求描述 我们知道数据是公司的重要资产,业务的系统化.信息化就是数字化.数据高效的存储与查询是系统完善和优化的方向,而数据库的稳定性.可靠性是实现的基础.高可用和RPO(RecoveryPoint ...
- mssql sqlserver 表增加列后,视图不会自动更新相关列的两种解决方法分享
摘要: 今天对物理数据表,进行增加列操作后,程序一直显示无法找到相应列,通过仔细比对发现,视图中无相应列更新,下文将具体的解决方法分享如下: 例: create view vw_test as sel ...
- c:\windows\system32\config\systemprofile\desktop 打不开
Question 重启开机后显示桌面打不开: 再次重启后无效 Solution 打开注册表regedit如下路径,复制Desktop值到 同路径下的Desktop中,再重启.
- 我的第一个python web开发框架(29)——定制ORM(五)
接下来我们要封装的是修改记录模块. 先上产品信息编辑接口代码 @put('/api/product/<id:int>/') def callback(id): ""&q ...
- 关于创建本地docker仓库
从远程仓库中下载regitstry镜像文件,下载后运行命令即可:docker run -p 5000:5000 -d registry
- log4cplus 简单记录
请注意区别对待: 1.2.1 : 不支持 C++11,比如 std::move 就会 fail. 2.0.1 : 支持 C++11,比如 std::move 就 ok. 完.
- python3 二分法查找
'''二分法查找有序列表掐头去尾取中间查找列表中xx在不在列表中,在,则返回索引值'''# lst = [1, 4, 6, 8, 9, 21, 23, 26, 35, 48, 49, 54, 67, ...
- Linux 实例常用内核网络参数介绍与常见问题处理
本文总结了常见的 Linux 内核参数及相关问题.修改内核参数前,您需要: 从实际需要出发,最好有相关数据的支撑,不建议随意调整内核参数. 了解参数的具体作用,且注意同类型或版本环境的内核参数可能有所 ...
- InetAddress类和InetSocketAddress类
InetAddress 类 封装计算机的 IP 地址,不包含端口号 InetAddress 类常用的方法 1 String getHostAddress() 获得 IP 地址 2 String get ...