A. k-Factorization

题目大意:给一个数n,求k个大于1的数,乘积为n。(n<=100,000,k<=20)

思路:分解质因数呗

#include<cstdio>
#define MN 100000
int a[MN+],an;
int main()
{
int n,k,i;
scanf("%d%d",&n,&k);
for(i=;k>&&n>;++i)for(;k>&&n%i==;--k,n/=i)a[++an]=i;
if(n==)return *puts("-1");
for(i=;i<=an;++i)printf("%d ",a[i]);printf("%d",n);
}

B. Odd sum

题目大意:给你n个数,求和为奇数的子序列的最大和。(n<=10^5)

思路:大于0的偶数直接加入答案,把奇数排序,先选一个最大的把它删掉并加入答案,while剩下的最大的的两个奇数和大于0就加入答案并删掉。

#include<cstdio>
#include<algorithm>
using namespace std;
char B[<<],*S=B,C;int X,F;
inline int read()
{
for(F=;(C=*S++)<''||C>'';)if(C=='-')F=-;
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X*F;
}
#define MN 100000
int a[MN+],an;
int main()
{
fread(B,,<<,stdin);
int n=read(),i,x,ans=;
for(i=;i<=n;++i)
if((x=read())&)a[++an]=x;
else if(x>)ans+=x;
sort(a+,a+an+);
ans+=a[an];
for(i=an;--i>;--i)if(a[i]+a[i-]>)ans+=a[i]+a[i-];else break;
printf("%d",ans);
}

C. Minimal string

题目大意:给出一个序列的入栈顺序,求字典序最小的可能的出栈顺序。(序列长度<=10^5)

思路:堆+双向链表贪心,选了一个元素后之后只能选这个元素的前一个元素和后面的元素,每次选能选的最小且位置最前的。

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define MN 100000
char s[MN+];
int ls[MN+],nx[MN+],u[MN+];
struct node
{
char c;int x;
bool operator<(const node&b)const{return c==b.c?x>b.x:c>b.c;}
};
priority_queue<node> pq;
int main()
{
int n,i,l,x;
scanf("%s",s+);n=strlen(s+);
for(i=;i<=n;++i)ls[i]=i-,nx[i]=i+,pq.push((node){s[i],i});
for(i=l=;i<=n;++i)
{
while((x=pq.top().x)<l||u[x])pq.pop();
u[x]=;putchar(pq.top().c);pq.pop();
if(ls[x]<l&&ls[x])pq.push((node){s[ls[x]],ls[x]});
l=ls[x];nx[ls[x]]=nx[x];ls[nx[x]]=ls[x];
}
}

D. Broken BST

题目大意:给出一棵n个节点的树,每一个点有一个权值,对每个点的权值从根节点开始按二叉搜索树的方式查询,问有多少个点的权值不会被查到。(n<=10^5)

思路:dfs求出会走到每个节点的数字区间。

#include<cstdio>
#include<map>
using namespace std;
char B[<<],*S=B,C;int X,F;
inline int read()
{
for(F=;(C=*S++)<''||C>'';)if(C=='-')F=-;
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X*F;
}
#define MN 100000
#define MX 1000000000
int v[MN+],l[MN+],r[MN+],d[MN+];
map<int,int> mp;
void dfs(int x,int L,int R)
{
if(x<)return;
if(L<=v[x]&&v[x]<=R)mp[v[x]]=;
if(L<v[x])dfs(l[x],L,min(R,v[x]-));
if(R>v[x])dfs(r[x],max(L,v[x]+),R);
}
int main()
{
fread(B,,<<,stdin);
int n=read(),i,ans=;
for(i=;i<=n;++i)v[i]=read(),
(l[i]=read())>?++d[l[i]]:,
(r[i]=read())>?++d[r[i]]:;
for(i=;i<=n;++i)if(!d[i])dfs(i,,MX);
for(i=;i<=n;++i)if(!mp[v[i]])++ans;
printf("%d",ans);
}

E. Array Queries

题目大意:给出n和ai(1<=i<=n),一次变换定义为把p变成p+a[p]+k,q次询问,每次给出p和k,问要多少次能把p变成大于n的数。(n,q<=10^5)

思路:分块,对于k<=n^0.5直接预处理出各个p和k的答案,对于k>n^0.5答案最大不会超过n^0.5,直接暴力,复杂度O(n^1.5)。

#include<cstdio>
inline int read()
{
int x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=(x<<)+(x<<)+c-'';
return x;
}
#define MN 100000
#define MK 350
int a[MN+],f[MK+][MN+];
int main()
{
int n=read(),q,i,k,ans;
for(i=;i<=n;++i)a[i]=read();
for(k=;k<=MK;++k)for(i=n;i;--i)f[k][i]=i+a[i]+k>n?:f[k][i+a[i]+k]+;
for(q=read();q--;)
{
i=read();k=read();
if(k<=MK)printf("%d\n",f[k][i]);
else{for(ans=;i<=n;i+=a[i]+k)++ans;printf("%d\n",ans);}
}
}

F. Mice and Holes

题目大意:n只老鼠m个洞分别位于数轴上,每个洞有容量ci,求每个老鼠都进洞的最小距离和。(n,m<=5,000)

思路:把老鼠和洞分别排序,最优方案下进每个洞的老鼠必然是连续的区间,f[i][j]表示前i个洞进前j只老鼠的最小距离和,s[i][j]表示前j只老鼠都进第i个洞的距离和,f[i][j]=min(f[i-1][k]+s[i][j]-s[i][k])(j-k<=ci),单调队列维护即可,复杂度O(nm)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define MN 5000
struct hole{int p,c;}h[MN+];
bool cmp(hole a,hole b){return a.p<b.p;}
int x[MN+],q[MN+],ql,qr;
ll f[MN+][MN+],s[MN+];
inline int z(int x){return x<?-x:x;}
int main()
{
int n,m,i,j;ll cnt=;
scanf("%d%d",&n,&m);
for(i=;i<=n;++i)scanf("%d",&x[i]);
for(i=;i<=m;++i)scanf("%d%d",&h[i].p,&h[i].c),cnt+=h[i].c;
if(cnt<n)return *puts("-1");
sort(x+,x+n+);sort(h+,h+m+,cmp);
memset(f,,sizeof(f));f[][]=;
for(i=;i<=m;++i)for(q[ql=,qr=]=j=;j<=n;++j)
{
s[j]=s[j-]+z(h[i].p-x[j]);
while(ql<=qr&&f[i-][j]-s[j]<=f[i-][q[qr]]-s[q[qr]])--qr;q[++qr]=j;
while(j-q[ql]>h[i].c)++ql;
f[i][j]=f[i-][q[ql]]+s[j]-s[q[ql]];
}
printf("%I64d",f[m][n]);
}

Educational Codeforces Round 19的更多相关文章

  1. Educational Codeforces Round 19 A, B, C, E(xjb)

    题目链接:http://codeforces.com/contest/797 A题 题意:给出两个数n, k,问能不能将n分解成k个因子相乘的形式,不能输出-1,能则输出其因子: 思路:将n质因分解, ...

  2. Educational Codeforces Round 19 题解【ABCDE】

    A. k-Factorization 题意:给你一个n,问你这个数能否分割成k个大于1的数的乘积. 题解:因为n的取值范围很小,所以感觉dfs应该不会有很多种可能-- #include<bits ...

  3. 【Educational Codeforces Round 19】

    这场edu蛮简单的…… 连道数据结构题都没有…… A.随便质因数分解凑一下即可. #include<bits/stdc++.h> #define N 100005 using namesp ...

  4. Educational Codeforces Round 19 A+B+C+E!

    A. k-Factorization 题意:将n分解成k个大于1的数相乘的形式.如果无法分解输出-1. 思路:先打个素因子表,然后暴力判,注意最后跳出的条件. int len,a[N],b[N]; v ...

  5. Educational Codeforces Round 19 C

    Description Petya recieved a gift of a string s with length up to 105 characters for his birthday. H ...

  6. Educational Codeforces Round 19 B

    Description You are given sequence a1, a2, ..., an of integer numbers of length n. Your task is to f ...

  7. Educational Codeforces Round 19 A

    Description Given a positive integer n, find k integers (not necessary distinct) such that all these ...

  8. Educational Codeforces Round 19 E. Array Queries(暴力)(DP)

    传送门 题意 给出n个数,q个询问,每个询问有两个数p,k,询问p+k+a[p]操作几次后超过n 分析 分块处理,在k<sqrt(n)时,用dp,大于sqrt(n)用暴力 trick 代码 #i ...

  9. Educational Codeforces Round 17

    Educational Codeforces Round 17 A. k-th divisor 水题,把所有因子找出来排序然后找第\(k\)大 view code //#pragma GCC opti ...

随机推荐

  1. 敏捷冲刺每日报告四(Java-Team)

    第四天报告(10.28  周六) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...

  2. 学号:201621123032 《Java程序设计》第1周学习总结

    1:本周学习总结 JDK,JRE,JVM三者的含义和关系.JDK是java开发工具包,包含了java的运行环境,java工具和类文库.例如java.javac.jar....可以把 .java编译成. ...

  3. 201621123043 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 泛型的定义: 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此 ...

  4. Cocoapods最全完整使用教程

    什么是cocoapods cocoapods是库管理工具. cocoapods的用途 解决库之间的依赖关系.如前文所述: 一个开源的项目可能是另一个项目的基础, A依赖B, B依赖C和D, D又依赖E ...

  5. equalsignorecase 和equals的区别

    equals方法来自于Object类equalsIgnoreCase方法来自String类equals对象参数是Object 用于比较两个对象是否相等equals在Object类中方法默然比较对象内存 ...

  6. Linux安装svn服务图文详解 ;出现No repository found in 'svn***问题

    Linux安装svn服务 ** 示例都是用的root权限,可选择用 sudo** 1:检查 安装条件为:Linux(centos)上未安装过svn服务,若安装过或安装失败请自行删除,这里不多介绍.检查 ...

  7. 你能选择出,前几个元素吗?使用纯css

    面试被问到 ,你能选择出前几个元素吗?括弧只能使用css 我当时是一脸懵逼... 回去的路上思考一路 终于想到了解决办法 虽然为时已晚 但是觉得很有意义... 首先要用到 否定选择器 : :not() ...

  8. unity A*寻路 (三)A*算法

    这里我就不解释A*算法 如果你还不知道A*算法 网上有很多简单易懂的例子 我发几个我看过的链接 http://www.cnblogs.com/lipan/archive/2010/07/01/1769 ...

  9. 【原创】自己动手实现RPC服务调用框架

    自己动手实现rpc服务调用框架 本文利用java自带的socket编程实现了一个简单的rpc调用框架,由两个工程组成分别名为battercake-provider(服务提供者).battercake- ...

  10. linux系统下Apache日志分割(按天生成文件)

    Apache日志按天显示,修改Apache http.conf文件,注释默认的日志文件,修改为下面2行 ErrorLog "| /usr/local/apache/bin/rotatelog ...