CoderForces Round54 (A~E)
题解:这一题读完题就写了吧。就是让你删除一个字母,使得剩下的字符组成的字符串的字典序最小;我们只要第一个当前位置的字符比下一个字符小的位置把该字符删去即可;
参考代码:
#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
#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
#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
#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)的更多相关文章
- coderforces #387 Servers(模拟)
Servers time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...
- 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 ...
- coderforces 731c
题目大意:给出m组数据,每组数据包括两个数Li与Ri,分别表示左右袜子的索引(下标),表示这一天要穿的袜子:而我们要使得每天穿的这两只袜子的颜色相同,所以可以改变袜子的颜色,每次只能改变一只袜子的颜色 ...
- coderforces 721b
题目描述: B. Passwords time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- CoderForces 280B(记忆化搜索)
题目大意:一个纸牌游戏,52张纸牌排成一列,每张纸牌有面值和花色两种属性.每次操作可以用最后一张纸牌将倒数第二张或者倒数第四张替换,但前提是两张牌的花色或者面值相同.问最终能否只剩一张牌. 题目分析: ...
- CoderForces 689A Mike and Cellphone (水题)
题意:给定一个手机键盘数字九宫格,然后让你判断某种操作是不是唯一的,也就是说是不是可以通过平移也能实现. 析:我的想法是那就平移一下,看看能实现,就四种平移,上,下,左,右,上是-3,要注意0变成8, ...
- CoderForces 518C Anya and Smartphone (模拟)
题意:给定一个手机,然后一共有 n 个app,告诉你每个屏幕最多放 k 个,现在要你运行 m 个app,每次都从第一个屏幕开始滑动,每运行一个,它就和前一个交换位置,第一个就不换了,现在问你要滑动多少 ...
- CoderForces 518D Ilya and Escalator (期望DP)
题意:给定 n 个人,在每一时刻一个人进入地铁的概率是 p,站着不动的概率是 1-p,然后问你 t 时间地铁里有多少人. 析:很明显这是一个期望DP,用d[i][j]表示 i 时刻 j 个人进入地铁的 ...
- CoderForces 687C The Values You Can Make (01背包,DP)
题意:给定 n 个硬币和一个值 k,问你在用一些硬币组成面值为 k的这些硬币还能组成多少种其他面值. 析:如果这样说,由这些硬币能组成多少种不同的面值,那么是不是就很熟悉了,这不就是01背包么,这个题 ...
随机推荐
- pip的简单用法
pip的用法: 其实跟linux的yum很像,它可以帮我们安装python所需要的环境包,并且可以包解决依赖关系 eg: 列出已安装的包 pip list 安装要安装的包 pip install xx ...
- SqlServer2005 查询 第二讲 distinct
今天我们来说distinct关键字的用法. distinct - distinct:我们可以这样理解成[过滤重复值] - select distinct deptno from emp // -- 首 ...
- mysql 导出 导入
一.导出 windows下 切换到mysql安装目录bin目录下 导出 数据库lz_garden 下的 所有表结构 到d盘并命名为lz_garden.sql: D:\dev\MySQL\MySQL S ...
- vuejs学习之新的components组件挂载
暂时写个目录,内容待完善,主要是记录我的学习过程,方便以后复习
- Linux 命令记录
记录Linux下使用过的命令: Linux端 1.测试当前系统支持语言(我这用的是xshell,如果出现乱码,则在file-properties-terminal-encoding中,设置为utf-8 ...
- Spring Cloud Alibaba(四)实现Dubbo服务消费
本项目演示如何使用 Spring Cloud Alibaba 完成 Dubbo 的RPC调用. Spring Cloud与Dubbo Spring Cloud是一套完整的微服务架构方案 Dubbo是国 ...
- 记录用户登陆信息,你用PHP是如何来实现的
对于初入门的PHP新手来说,或许有一定的难度.建议大家先看看PHP中session的基础含义,需要的朋友可以选择参考. 下面我们就通过具体的代码示例,为大家详细的介绍PHP中session实现记录用户 ...
- Win 使用终端创建mysql数据库及使用(5)
删除你创建过的数据库newsql里面的所有表 这里必须安装了mysql,并且知道用户名密码IP地址.因为我用的window,所以只介绍Win使用cmd创建的方式 首先windown+R 出现窗口输入c ...
- 什么鬼,面试官竟然让我用Redis实现一个消息队列!!?
GitHub 9.4k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 9.4k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 9.4k Star 的 ...
- NTP服务编译安装报错:ntpd.c:124:29: 致命错误:sys/capability.h:没有那个文件或目录
缺少libcap-devel [root@localhost libcap]# cd /mnt/ [root@localhost mnt]# rpm -Uvh libcap*