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. Dart编程语言从基础到进阶1

    Dart编程语言从基础到进阶Dart的语言的发展史以及Dart能做什么未来发展怎么样等等问题我们在这里是不讨论的.我相信既然选择了来学习它,那你内心基本已经认可了它,所以我们废话不多说直接进入主题. ...

  2. 美团店铺数据抓取 token解析与生成

    美团.点评网的token都是用一套加密算法,实际上就是个gzip压缩算法.加密了2次,第一次是加密了个sign值,然后把sign值带进去参数中进行第二次加密,最后得出token 分析请求 打开上海美食 ...

  3. Redis持久化的几种方式——深入解析RDB

    Redis 的读写都是在内存中,所以它的性能较高,但在内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,我们需要将内存中的数据存储到磁盘,以便 Redis 重启时能够从磁盘中恢复原有的数据,而 ...

  4. idea 常用功能

      Ctrl + E:打开最近文件   双击 Shift:按文件名查找文件   Ctrl + Shift + F:全局搜索   Alt + ~(数字 1 左边的键):commit.push 代码   ...

  5. 用正则表达式获取URL中的查询参数

    总结获取url中查询参数的两种方式 通过正则表达式获取单个参数 url中的所有查询参数可以通过 window.location.search 字段获取,以字符串的形式返回.并有固定的格式 ?param ...

  6. win10 visual studio 2017环境中安装CUDA8

    从https://developer.nvidia.com/cuda-toolkit-archive下载CUDA 8 安装 从https://developer.nvidia.com/gamework ...

  7. AppBoxFuture: 集成第三方Sql数据库

      框架设计之初是不准备支持第三方数据库的,但最近几个朋友都提到需要将旧的基于传统Sql数据库的应用迁移到框架内,主要是考虑到一方面目前框架内置的分布式数据库尚未完善,另一方面是希望能逐步迭代旧应用替 ...

  8. 01-tornado练习-tornado简介

    # coding = utf-8 """ 启动一个tornado的web服务 """ import tornado.web from tor ...

  9. Head First设计模式——模板方法模式

    前言:本篇我们讲解模板方法模式,我们以咖啡和茶的冲泡来学习模板方法.关于咖啡另一个设计模式例子也以咖啡来讲解,可以看下:Head First设计模式——装饰者模式 废话不多说,开始进入模板方法模式. ...

  10. Java8 Stream中间操作使用详解

    前面两篇简单的介绍了Stream以及如何创建Stream,本篇就给大家说说stream有哪些用途,以及具体怎样使用. 再次介绍Stream Stream 使用一种类似用于SQL 语句从数据库查询数据的 ...