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 ...
随机推荐
- 【AO笔记】有关TIN数据集的常用介绍
写论文查了很多TIN的接口和属性,特此来记录一下. 转载请注明出处:博客园@秋意正寒,B站同名. 未完待续 1. Tin数据集在ArcGIS中的描述 Tin数据集在磁盘中,被ArcGIS以文件夹形式管 ...
- 驰骋工作流引擎JFlow与activiti的对比之4种包含多实例的模式
1. 无同步的多实例(MIwithout) 在流程中,一个活动可以激活多个实例,每个实例相互独立,并不需要在后面进行同步. 例子:比如用户购买了N本书,于是后续的支付账单.更新客户可以以本书为单位各自 ...
- Android远程桌面助手(Build 0737)
Android Remote Displayer and Controller Build 0737, Aug 02, 2017 新增功能: 录制MP4文件,突破了Android原生180S的限制 截 ...
- 精简你的 docker 镜像
精简你的 docker 镜像 Intro 现在 docker 的使用越来越普遍,今天来谈一下如何精简你的 docker 镜像 为什么要精简 docker 首先来说说为什么要精简 docker 镜像,减 ...
- dede 采集文章内容中图片不显示的问题
找到include文件下面的dedecollection.class.php 找到DownMedias这个方法,大概在870行 //下载标记里的图片和flash $okurl = $this-> ...
- nginx 防止盗链
1.测试盗链(www.html2.com 盗取 www.html5.com的图片) 2.防止盗链 符合盗链 —— 重写 说明:if ($invalid_referer) {,if的后面是有空格的,如果 ...
- 数据库之redis篇(1)—— redis数据库安装,简单使用
简介 reids,由Salvatore Sanfilippo写的一个高性能的key-value数据库,并且它是非关系型数据库,也就是没有像mysql那样多表链接操作,并且它是是完全开源免费的,遵守BS ...
- 注册表修改computer name
修改windows server的机器名的时候,发现change按钮是disable的. 手动修改不了,用注册表regedit来修改. HKEY_LOCAL_MACHINE\SYSTEM\Curren ...
- 公共的JS组件-告别CURD
urls.py urlpatterns = [ url('^asset.html$', views.AssetView.as_view()), url('^asset-json.html$', vie ...
- Saltstack_使用指南02_远程执行-验证
1. 主机规划 2. Master与哪些minion通信 2.1. Master与哪些minion正常通信 [root@salt100 ~]# salt '*' test.ping salt100: ...