Codeforces Round #398 (Div. 2)

A.Snacktower

模拟

我和官方题解的命名神相似...$has$

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=1e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,has[N];
int main(){
//freopen("in","r",stdin);
n=read();
int now=n;
for(int i=;i<=n;i++){
has[read()]=;
while(has[now]) printf("%d ",now),now--;
puts("");
}
}

B.The Queue

比赛时花了1h然后弃疗

感觉好恶心...


C.Garland

题意:一颗二叉树切断两条边分成三部分使得三部分权值和相等

感觉比B简单(好写)多了,可以发现每部分权值和就是总权值的$\frac{1}{3}$

然后我用了两个树形DP,$d[i]$表示$i$子树权值和,$f[i]$表示$i$子树里有几个权值和等于$\frac{1}{3}$的

分类讨论选的两棵子树是否互相包含,比赛时各种$debug$,最后$5min$通过了...感动

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=1e6+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,d[N],fa,w[N],root;
struct edge{
int v,ne;
}e[N<<];
int h[N],cnt=;
inline void ins(int u,int v){
cnt++;
e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
}
void dp(int u){
d[u]=w[u];
for(int i=h[u];i;i=e[i].ne)
dp(e[i].v),d[u]+=d[e[i].v];
}
int f[N],val;
void dp2(int u){
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
dp2(v);
if(f[v]==) f[u]+=d[v]==val;
else f[u]+=f[v];
}
}
int a[N],p;
int main(){
//freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++){
fa=read();w[i]=read();
if(fa==) root=i;
else ins(fa,i);
}
dp(root);
if(d[root]%!=) puts("-1");
else{
val=d[root]/;
dp2(root);
//for(int i=1;i<=n;i++) printf("%d %d %d\n",i,d[i],f[i]);
if(f[root]==) puts("-1");
else if(f[root]>=){
for(int i=;i<=n;i++) if(i!=root&&d[i]==val&&f[i]==) a[++p]=i;
printf("%d %d",a[],a[]);
}else{
int flag=,a,b;
for(int i=;i<=n;i++) if(i!=root&&d[root]-d[i]==val&&f[i]==){
flag=;a=i;break;
}
for(int i=;i<=n;i++) if(i!=root&&d[i]==val&&f[i]==) {b=i;break;}
if(flag) printf("%d %d",a,b);
else puts("-1");
}
}
}

D.Cartons of milk

赛后补题.....

一开始贪心乱搞失败,然后发现直接二分答案就好了.....然而是$O(n log^{2}n)$.....

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=2e6+;
inline int read(){
char c=getchar();int x=;
while(c<''||c>''){c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x;
}
int n,m,k,a[N];
struct data{
int id,b;
bool operator <(const data &r) const{
return b>r.b;
}
}b[N];
int p,c[N];
bool check(int x){//printf("check %x\n",x);
ll now=;
p=;
for(int i=;i<=n;i++) c[++p]=a[i];
for(int i=;i<=x;i++) c[++p]=b[i].b;
sort(c+,c++p);
//for(int i=1;i<=p;i++) printf("%d ",c[i]);puts("");
for(int i=;i<=p;i++){
now++;//printf("now %d %d %d\n",i,c[i],now);
if(now>(ll)k*c[i]) return false;
}
return true;
}
int main(){
//freopen("in","r",stdin);
n=read();m=read();k=read();
for(int i=;i<=n;i++) a[i]=read()+;
for(int i=;i<=m;i++) b[i].b=read()+,b[i].id=i;
sort(a+,a++n);
sort(b+,b++m);
int l=,r=m,ans=-;
while(l<=r){
int mid=(l+r)>>;
if(check(mid)) ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
if(ans!=-){
memset(c,,sizeof(c));
for(int i=;i<=ans;i++) c[b[i].id]=;
for(int i=;i<=m;i++) if(c[i]) printf("%d ",i);
}
}

看了一个别人的代码发现贪心也能做并且很快

$f[i]$记录时间i选了几个,贪心选择放在最晚到期,然后从后往前$>k$的给前面就行了,$O(n)$,时间只有二分答案的$\frac{1}{3}$

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=2e6+,M=1e7+;
inline int read(){
char c=getchar();int x=;
while(c<''||c>''){c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x;
}
int n,m,k,a[N];
struct data{
int id,b;
bool operator <(const data &r) const{
return b>r.b;
}
}b[N];
int f[M],mx;
bool vis[N];
int main(){
//freopen("in","r",stdin);
n=read();m=read();k=read();
for(int i=;i<=n;i++) a[i]=read()+,f[a[i]]++,mx=max(mx,a[i]);
for(int i=;i<=m;i++) b[i].b=read()+,b[i].id=i,mx=max(mx,b[i].b);
sort(a+,a++n);
for(int i=mx;i>=;i--) if(f[i]>k) f[i-]+=f[i]-k,f[i]=k;
if(f[]) puts("-1");
else{
sort(b+,b++m);
for(int i=;i<=m;i++) f[b[i].b]++;
for(int i=mx;i>=;i--) if(f[i]>k) f[i-]+=f[i]-k,f[i]=k;
int p=m-f[];
printf("%d\n",p);
for(int i=;i<=p;i++) vis[b[i].id]=;
for(int i=;i<=m;i++) if(vis[i]) printf("%d ",i);
}
}

Codeforces Round #398 (Div. 2)的更多相关文章

  1. Codeforces Round #398 (Div. 2) A. Snacktower 模拟

    A. Snacktower 题目连接: http://codeforces.com/contest/767/problem/A Description According to an old lege ...

  2. Codeforces Round #398 (Div. 2) C. Garland —— DFS

    题目链接:http://codeforces.com/contest/767/problem/C 题解:类似于提着一串葡萄,用剪刀剪两条藤,葡萄分成了三串.问怎样剪才能使三串葡萄的质量相等. 首先要做 ...

  3. Codeforces Round #398 (div.2)简要题解

    这场cf时间特别好,周六下午,于是就打了打(谁叫我永远1800上不去div1) 比以前div2的题目更均衡了,没有太简单和太难的...好像B题难度高了很多,然后卡了很多人. 然后我最后做了四题,E题感 ...

  4. Codeforces Round #398 (Div. 2) A,B,C,D

    A. Snacktower time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  5. Codeforces Round #398 (Div. 2) A B C D 模拟 细节 dfs 贪心

    A. Snacktower time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  6. Codeforces Round #398 (Div. 2) B,C

    B. The Queue time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  7. 【DFS】Codeforces Round #398 (Div. 2) C. Garland

    设sum是所有灯泡的亮度之和 有两种情况: 一种是存在结点U和V,U是V的祖先,并且U的子树权值和为sum/3*2,且U不是根,且V的子树权值和为sum/3. 另一种是存在结点U和V,他们之间没有祖先 ...

  8. 【枚举】【贪心】 Codeforces Round #398 (Div. 2) B. The Queue

    卡题意……妈的智障 一个人的服务时间完整包含在整个工作时间以内. 显然,如果有空档的时间,并且能再下班之前完结,那么直接输出即可,显然取最左侧的空档最优. 如果没有的话,就要考虑“挤掉”某个人,就是在 ...

  9. 【暴力】Codeforces Round #398 (Div. 2) A. Snacktower

    题意不复述. 用个bool数组记录一下,如果某一天,当前剩下的最大的出现了的话,就输出一段. #include<cstdio> using namespace std; int n; bo ...

随机推荐

  1. Necklace(树状数组+离线操作)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3874 Necklace Time Limit: 15000/5000 MS (Java/Others) ...

  2. c#版 K线控件(Stock)

    K线起源于日本米市交易,它的基本用途就是为了寻找"买卖点".股市及期货市场中的K线图的画法包含四个数据,即开盘价.最高价.最低价.收盘价,所有的k线都是围绕这四个数据展开,反映大势 ...

  3. 电铸3D18K硬金 电铸易熔合金 电铸中空硬金饰品合金

        俊霖电铸3DK金易熔合金是要求相互关连,互为条件,缺一不可,是产品完整性和完美性的重要体现.    第一.适用性:电铸3DK金易熔合金的性能应适用于电铸.首饰.K金饰品.摆件等工艺品的易熔合金 ...

  4. [国嵌攻略][182][Sqlite嵌入式数据库移植]

    数据库系统构成 在计算机系统中,保存数据的方式一般有两种: 1.普通文件方式 2.数据库方式 相比于普通文件方式,使用数据库来管理大批量数据具有更高的效率与安全性. 数据库系统一般由三个部分构成 1. ...

  5. 使用ng-options指令创建下拉框

    今天在学习AngularJs中使用ng-options指令创建下拉框时遇到点问题,这里总结一下. 其实,使用ng-options指令创建下拉框很简单,只需要绑定两个属性. ng-options指令用于 ...

  6. 数据库 MySQL基础知识

    (关于MySQL的安装,具体见下面博客:http://www.cnblogs.com/wj-1314/p/7573242.html) 一.什么是数据库 ? 数据库是按照数据结构来组织,存储和管理数据的 ...

  7. java 数据类型间的转换

    byte a = (byte)129; 129已经超过了byte数据类型的存储上限,所以需要在值的前面加括号需要转换的数据类型名. 但是从高往低转的时候数值精度会有丢失; 所以最后结果为 a = -1 ...

  8. 本地phpstudy时常停机连接失败,php.ini文件中9000端口问题

    2018/01/05 13:35:07 [error] 20508#19380: *1 WSARecv() failed (10054: An existing connection was forc ...

  9. DEDECMS点击主栏目默认显示第一个子栏目列表的方法

    本文实例讲述了DEDECMS点击主栏目默认显示第一个子栏目列表的方法.分享给大家供大家参考.具体分析如下: 今天公司有个需求是,点击导航上的父栏目进去默认显示第一个子栏目的列表,以下是具体实现方法,可 ...

  10. python基础6之迭代器&生成器、json&pickle数据序列化

    内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...