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 ...
随机推荐
- 广州.NET微软技术俱乐部与其他技术群的区别
.NET和微软技术相关的微信群有不少, 那么广州.NET微软技术俱乐部与其他技术群的区别是什么呢? 有十分大的区别! 本群公告写得很清楚! 本群坚决禁止讨论“JAVA和.NET哪个好”.“NET有没有 ...
- iOS----------取数据的两种取法
NSMutableArray * dataArray =[responseDictionary valueForKeyPath:@"data.list_dic.list"]; NS ...
- Python高级应用(3)—— 为你的项目添加验证码
验证码简介 验证码的作用: 验证码在现在来说,是很常见的东西,可以一定程度的保护网站,比如防止网络爬虫恶意爬取网站数据啊,减少低级的攻击啊什么的.但是高级点的骚操作还是不太好防范,所以现在的验证码平台 ...
- iOS pthread
pthread 是属于 POSIX 多线程开发框架 创建线程的方法:pthread_create 参数含义: 1.指向线程代号的指针 2.线程的属性 3.指向函数的指针 4.传递给该函数的参数 返 ...
- errno 的使用
error是一个包含在<errno.h>中的预定义的外部int变量,用于表示最近一个函数调用是否产生了错误.若为0,则无错误,其它值均表示一类错误. perror()和strerror() ...
- DWH中增量数据的抽取
1. Truncate-Load 全量加载 简单直观.不易出错,适合数据量不太大的操作 性能问题 2. Increamental-Load 只考虑新增.修改.删除的记录 良好的数据源设计(主要是 ...
- 浪潮服务器I4008/NX5480M4介绍
浪潮I4008 / NX5480M4是一款高密度模块化服务器. I4008是机箱,NX5480M4是节点. 8个计算节点模块可以部署在标准机架4U高度机器里,具有高性能.低功耗.易维护.组管理功能.适 ...
- Vue学习之路2-项目初搭建
1.检查环境是否全部安装成功 2.创建项目 2.1.打开dos命令窗口,使用dos命令转到项目文件夹下: 2.2.输入创建项目命令:vue init webpack myproject1 创建不同的打 ...
- Python基础——6面向对象编程
类和实例 类是抽象的模版,例如汽车:而实例则是拥有相同方法的类的实现,例如汽车里面有大众.宝马.奔驰等等,这些车都能在地面上跑,但是它们的具体数据可以不一样. calss Student(object ...
- (原创)超详细一步一步在eclipse中配置Struts2环境,无基础也能看懂
(原创)超详细一步一步在eclipse中配置Struts2环境,无基础也能看懂 1. 在官网https://struts.apache.org下载Struts2,建议下载2.3系列版本.从图中可以看出 ...