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背包么,这个题 ...
随机推荐
- 利用JaCoCo统计接口测试中代码覆盖率
做接口测试,很多时候都会听到,你接口测试的覆盖率是多少?很多人会回答80%,你怎么统计的,他说覆盖了80%的需求.这个回答没有错误,但是片面,我们不能只考虑需求的覆盖率,还有业务的覆 ...
- X-Admin&ABP框架开发-RBAC
在业务系统需求规划过程中,通常对于诸如组织机构.用户和角色等这种基础功能,通常是将这部分功能规划到通用子域中,这也说明了,对于这部分功能来讲,是系统的基石,整个业务体系是建立于这部分基石之上的,当然, ...
- JavaScript: 遍历Array的同时删除指定项
一个简单的需求是,在遍历一个数组时,移除指定的项. 下列代码是不能正常工作的: var elements = [1, 5, 5, 3, 5, 2, 4]; for(var i = 0; i < ...
- ubantu14.04安装storm伪分布式
1.安装jdk 安装:sudo apt-get install openjdk-7-jdk 配置: 修改文件 sudo nano /etc/profile , 添加以下内容: 立即执行使之生效: 2. ...
- 关于RAID 10的介绍与创建
一.RAID 10的简介 定义: RAID10也被称为镜象阵列条带.象RAID0一样,数据跨磁盘抽取:象RAID1一样,每个磁盘都有一个镜象磁盘, 所以RAID 10的另一种会说法是 RAID 0+1 ...
- VMware Workstation Pro(15.5)下安装Windows_Server_2008_R2
一.新建虚拟机 1.打开VMware Workstation Pro 15.5虚拟机,点击新建虚拟机 2.选择典型(推荐),单击下一步 3.选最后一个 稍后安装操作系统,点击下一步 4.进来页面,选择 ...
- Windows 10上源码编译glog和gflags 编写glog-config.cmake和gflags-config.cmake | compile glog and glags on windows from source
本文首发于个人博客https://kezunlin.me/post/bb64e398/,欢迎阅读! compile glog v0.3.5 and glags on windows from sour ...
- java中大整型BigInteger及setBit和testBit方法
最近在修改公司之前的项目,在项目中遇到了权限校验的问题,代码中出现了BigInteger的setBit()testBit()方法,之前未接触过,所以了解了下BigInteger. 在Java中,由CP ...
- selenium(java)浏览器多窗口切换处理
要在多个窗口直接切换,首先获取每个窗口的唯一标示符(句柄),通过窗口属性可以获取所有打开窗口的标示符,以集合的形式返回:以下示例: Set<String> winHandels ...
- 内核升级在线安装报错:Could not retrieve mirrorlist http://mirrors.elrepo.org/mirrors-elrepo-kernel.el7 error was14: curl#6 - "Could not resolve host: mirrors.elrepo.org; 未知的错误"
修改网卡配置 [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32 BOOTPROTO="none" ...