ProblemA Minimizing the String

  题解:这一题读完题就写了吧。就是让你删除一个字母,使得剩下的字符组成的字符串的字典序最小;我们只要第一个当前位置的字符比下一个字符小的位置把该字符删去即可;

  参考代码:

 #include<bits/stdc++.h>
using namespace std;
#define PI acos(-1.0)
#define RI register int
#define clr(a,b) memset(a,b,sizeof a)
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=2e5+;
int n;
char str[maxn];
int main()
{
scanf("%d",&n);
scanf("%s",str);
int len=strlen(str),temp=len-;
for(int i=;i<len-;++i)
{
if(str[i]-str[i+]>)
{
temp=i;
break;
}
}
for(int i=;i<len;++i) if(i!=temp) printf("%c",str[i]);
printf("\n");
return ;
}

ProblemB  Divisor Subtraction

  题解:这一题就是让你找一个数的最小质因数,并减去它,一直循环,直到该数为零;考虑输入的数num,如果num为偶数,那么次数即为num/2(因为每次都是2);对于一个奇数,它的第一个最小质因数一定是奇数,则经过一次循环后,num会变为偶数,回到了前面的情况;因此,只要分两种情况即可;
  参考代码:
 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll N;
int main()
{
cin>>N;
for(ll i=;i*i<=N;++i) if(N%i==) { printf("%lld\n",(N-i)/+);return ; }
puts("");
return ;
}

Problem C  Meme Problem

  题解:这一题数学公式推一下就行了Orz;
  参考代码:
 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define clr(a,b) memset(a,b,sizeof a)
int main()
{
double a,b,d;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf",&d);
double k=d*d-*d;
if(<d&&d<) puts("N");
else
{
a=(d+sqrt(k))/;
b=(d-sqrt(k))/;
printf("Y %.9f %.9f\n",a,b);
}
}
return ;
}

Problem D. Edge Deletion

  题解:给定 N 个点 M 条边的无向简单联通图,留下最多 K 条边,求剩下的点里面从 1 号顶点到其余各点最短路大小等于原先最短路大小的点最多怎么构造。这题用到贪心思想,我们可以在第一次跑 dij 时直接采用贪心策略,即:若当前答案集合的大小小于 K 且优先队列非空,则继续优先队列BFS,每次把一条边加入到答案集合中。因为是在求解最短路过程中向答案集合中加边,可知这就是一种最优策略。
  参考代码:
 #include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int Maxn=3e5+;
const LL INF=1e15;
int n,m,k,a[Maxn],f[Maxn],fa[Maxn];
LL d[Maxn];
bool boo[Maxn];
struct qnode{
int v;
LL cost;
bool operator < (const qnode &r) const {return cost>r.cost;}
};
struct node{
int v;
LL cost;
int w;
};
vector<node> e[Maxn];
set<int> s;
set<int>::iterator it; void dijkstra()
{
for (int i=; i<=n; i++) boo[i]=false,d[i]=INF;
priority_queue<qnode> q;
while(!q.empty()) q.pop();
d[]=;
q.push(qnode{,});
while (!q.empty())
{
qnode temp=q.top();q.pop();
int u=temp.v;
if (boo[u]) continue;
boo[u]=true;
for (int i=,len=e[u].size();i<len;i++)
{
int v=e[u][i].v;
LL cost=e[u][i].cost;
if(!boo[v] && d[v]>d[u]+cost)
{
d[v]=d[u]+cost;
q.push(qnode{v,d[v]});
f[v]=e[u][i].w;
fa[v]=u;
}
}
}
} int main()
{
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
for(int i=; i<=n; i++) e[i].clear();
for(int i=; i<=m; i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
e[x].push_back(node{y,z,i});
e[y].push_back(node{x,z,i});
}
dijkstra();
if(k>=n-)
{
printf("%d\n",n-);
for(int i=; i<=n; i++) if (i!=n) printf("%d ",f[i]); else printf("%d\n",f[i]);
}
else
{
s.clear();
for(int i=; i<=n; i++) d[i]=;
for(int i=; i<=n; i++) d[fa[i]]++,s.insert(f[i]);
a[]=;
for(int i=; i<=n; i++) if(d[i]==) a[++a[]]=i;
int x=n-;
while(x>k)
{
int u=a[a[]];
a[]--;
s.erase(f[u]);
d[fa[u]]--;
if(d[fa[u]]==) a[++a[]]=fa[u];
x--;
}
printf("%d\n",x);
int i=;
for(it=s.begin();it!=s.end();it++)
{
i++;
printf("%d",(*it));
if(i==x) printf("\n"); else printf(" ");
}
}
}
return ;
}

Problem E. Vasya and a Tree

题解:

题意:

给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值

首先要明确两件事情
性质1.每个人的操作只会影响到他的子孙(包括自己) 性质1.每个人的操作只会影响到他的子孙(包括自己)性质1.每个人的操作只会影响到他的子孙(包括自己)
性质2.每个人只会被他祖先的操作所影响(包括自己) 性质2.每个人只会被他祖先的操作所影响(包括自己)性质2.每个人只会被他祖先的操作所影响(包括自己)
也就是说,如果我们能在访问到某个节点时,统计出所有影响到该节点的祖先操作 也就是说,如果我们能在访问到某个节点时,统计出所有影响到该节点的祖先操作也就是说,如果我们能在访问到某个节点时,统计出所有影响到该节点的祖先操作
就可以统计出这个节点的最终权值 就可以统计出这个节点的最终权值就可以统计出这个节点的最终权值
而对于每个操作,我们只要用一个dep数组保存每个深度被增加的值 而对于每个操作,我们只要用一个dep数组保存每个深度被增加的值而对于每个操作,我们只要用一个dep数组保存每个深度被增加的值;
所有深度大于当前节点的操作都会影响到当前节点,如果用线段树就是一个区间求和问题 所有深度大于当前节点的操作都会影响到当前节点,如果用线段树就是一个区间求和问题所有深度大于当前节点的操作都会影响到当前节点,如果用线段树就是一个区间求和问题
为了减少代码量我们用树状数组,更新时只在本次操作的最深的深度更新 为了减少代码量我们用树状数组,更新时只在本次操作的最深的深度更新为了减少代码量我们用树状数组,更新时只在本次操作的最深的深度更新;
  这样求一个1~maxdep的前缀和就是所有更新了根节点的操作 这样求一个1~maxdep的前缀和就是所有更新了根节点的操作这样求一个1~maxdep的前缀和就是所有更新了根节点的操作;
在求一个1~(nowdep-1)的前缀和就是所有不包含当前节点的操作 在求一个1~(nowdep-1)的前缀和就是所有不包含当前节点的操作在求一个1~(nowdep-1)的前缀和就是所有不包含当前节点的操作;两个前缀和相减就是当前节点被更新的值 两个前缀和相减就是当前节点被更新的值两个前缀和相减就是当前节点被更新的值;为了保证每个操作只影响自己子树内的节点,在dfs退出子树时 为了保证每个操作只影响自己子树内的节点,在dfs退出子树时为了保证每个操作只影响自己子树内的节点,在dfs退出子树时,要将当前根节点的所有修改值还原 要将当前根节点的所有修改值还原要将当前根节点的所有修改值还原。

参考代码:

 #include<bits/stdc++.h>
using namespace std;
#define clr(a,b) memset(a,b,sizeof a)
#define PI acos(-1.0)
#define lowbit(x) x&-x
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=3e5+;
vector<int> G[maxn],dep[maxn],val[maxn];
int n,m,v,d,x,y;
ll tree[maxn],ans[maxn];
inline void readint(int &k)
{
int x=,f=;char ch=getchar();
while(ch<''||ch>'') {if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') {x=x*+ch-'';ch=getchar();}
k=x*f;
} inline void add(int x,int val)
{
while(x<=n)
{
tree[x]+=val;
x+=lowbit(x);
}
} inline ll sum(int x)
{
ll ans=;
while(x)
{
ans+=tree[x];
x-=lowbit(x);
}
return ans;
} inline void dfs(int t,int fa,int depth)
{
for(int i=;i<dep[t].size();++i) add(min(dep[t][i]+depth,n),val[t][i]);
ans[t]=sum(n)-sum(depth-);
for(int i=;i<G[t].size();++i)
{
if(G[t][i]==fa) continue;
dfs(G[t][i],t,depth+);
}
for(int i=;i<dep[t].size();++i) add(min(dep[t][i]+depth,n),-val[t][i]);
} int main()
{
clr(tree,);clr(ans,);
readint(n);
for(int i=;i<=n-;++i)
{
readint(x),readint(y);
G[x].push_back(y);G[y].push_back(x);
}
readint(m);
for(int i=;i<=m;++i)
{
readint(v),readint(d),readint(x);
dep[v].push_back(d); val[v].push_back(x);
}
dfs(,,);
for(int i=;i<=n;++i) printf("%lld%c",ans[i],i==n?'\n':' ');
return ;
}

  

CoderForces Round54 (A~E)的更多相关文章

  1. coderforces #387 Servers(模拟)

    Servers time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...

  2. coderforces #384 D Chloe and pleasant prizes(DP)

    Chloe and pleasant prizes time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  3. coderforces 731c

    题目大意:给出m组数据,每组数据包括两个数Li与Ri,分别表示左右袜子的索引(下标),表示这一天要穿的袜子:而我们要使得每天穿的这两只袜子的颜色相同,所以可以改变袜子的颜色,每次只能改变一只袜子的颜色 ...

  4. coderforces 721b

    题目描述: B. Passwords time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  5. CoderForces 280B(记忆化搜索)

    题目大意:一个纸牌游戏,52张纸牌排成一列,每张纸牌有面值和花色两种属性.每次操作可以用最后一张纸牌将倒数第二张或者倒数第四张替换,但前提是两张牌的花色或者面值相同.问最终能否只剩一张牌. 题目分析: ...

  6. CoderForces 689A Mike and Cellphone (水题)

    题意:给定一个手机键盘数字九宫格,然后让你判断某种操作是不是唯一的,也就是说是不是可以通过平移也能实现. 析:我的想法是那就平移一下,看看能实现,就四种平移,上,下,左,右,上是-3,要注意0变成8, ...

  7. CoderForces 518C Anya and Smartphone (模拟)

    题意:给定一个手机,然后一共有 n 个app,告诉你每个屏幕最多放 k 个,现在要你运行 m 个app,每次都从第一个屏幕开始滑动,每运行一个,它就和前一个交换位置,第一个就不换了,现在问你要滑动多少 ...

  8. CoderForces 518D Ilya and Escalator (期望DP)

    题意:给定 n 个人,在每一时刻一个人进入地铁的概率是 p,站着不动的概率是 1-p,然后问你 t 时间地铁里有多少人. 析:很明显这是一个期望DP,用d[i][j]表示 i 时刻 j 个人进入地铁的 ...

  9. CoderForces 687C The Values You Can Make (01背包,DP)

    题意:给定 n 个硬币和一个值 k,问你在用一些硬币组成面值为 k的这些硬币还能组成多少种其他面值. 析:如果这样说,由这些硬币能组成多少种不同的面值,那么是不是就很熟悉了,这不就是01背包么,这个题 ...

随机推荐

  1. 201871010114-李岩松《面向对象程序设计(java)》第二周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  2. Spring Cloud gateway 七 Sentinel 注解方式使用

    Sentinel 注解支持 @SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项. @SentinelResource 注解包含以下属性: value:资 ...

  3. Apache Hudi 介绍与应用

    Apache Hudi Apache Hudi 在基于 HDFS/S3 数据存储之上,提供了两种流原语: 插入更新 增量拉取 一般来说,我们会将大量数据存储到HDFS/S3,新数据增量写入,而旧数据鲜 ...

  4. 20191010-4 alpha week 1/2 Scrum立会报告+燃尽图 02

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/8747 一.小组情况 组长:迟俊文 组员:宋晓丽 梁梦瑶 韩昊 刘信鹏 队名 ...

  5. htm&css 颜色的浮动

    目标样式 目标分析: 由图可知,整个色板可以分为三块 可以理解为一个大的盒子包含了三个小的盒子,定义如下 LEFT的定义方式 TOP的定义方式 class为bottom的块最为复杂,但分析方法也是异曲 ...

  6. 图解AQS的设计与实现,手摸手带你实现一把互斥锁!

    AQS是并发编程中非常重要的概念,它是juc包下的许多并发工具类,如CountdownLatch,CyclicBarrier,Semaphore 和锁, 如ReentrantLock, ReaderW ...

  7. [转载] Docker 实现原理

    目录 Namespaces 进程 网络 libnetwork 挂载点 chroot
 CGroups UnionFS 存储驱动 AUFS 其他存储驱动 总结 原文链接:https://dravenes ...

  8. day 12 函数名的应用 闭包 迭代器

    今日主要内容 1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用   #再函数名后面添加() 才是对函数的调用, 否则打印的是函数的内存地址 1.赋值 2.作为list元素 3.作为参数 d ...

  9. 概率分布的python实现

    接上篇概率分布,这篇文章讲概率分布在python的实现. 文中的公式使用LaTex语法,即在\begin{equation}至\end{equation}的内容可以在https://www.codec ...

  10. C#学习笔记03--循环和一维数组

    一.循环(重点) 什么时候用循环? 想让一段代码执行多次, 这段代码可能不一样但是一定有一个规律. 1.while 循环 格式:  while(循环条件) { 循环执行的代码; } 循环的机制:  当 ...