layout: post
title: Codeforces Round 250 (Div. 2)
author: "luowentaoaa"
catalog: true
tags:
mathjax: true
- codeforces
- 几何
- 区间DP
- 最大生成树


传送门

A.The Child and Homework (签到题)

题意

给出四个字符串A,B,C,D,让你按照其中如下规则输出答案

1:如果有一个字符串的长度小于其他字符串的长度至少两倍 输出他的序号

2.如果有一个字符串的长度大于其他字符串的长度至少两倍 输出他的序号

3.如果都不符合输出C

思路

一开始直接做了,发现果断wa 发现如下坑

1.是必须要一直有一个字符串满足如上属性,如果有两个字符串满足 比如长度分别为( 1 ,2 , 4 , 8 )这里有多个符合条件 所有需要输出C;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e6+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;int num[1500];
int cnt[1500];
int tnc[1500];
int main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);string a;bool doul=false;for(int i=1;i<=4;i++){cin>>a;num[i]=a.length()-2;cnt[num[i]]++;tnc[num[i]]++;}for(int i=1;i<=1000;i++){cnt[i]+=cnt[i-1];}for(int i=1000;i>=1;i--){tnc[i]+=tnc[i+1];}int id=0,nu=0;for(int i=1;i<=4;i++){if(tnc[num[i]*2]>=3||cnt[num[i]/2]>=3){id=i;nu++;}}if(nu!=1)cout<<"C"<<endl;else{cout<<char(id-1+'A')<<endl;}return 0;
}

B.The Child and Set (二进制的性质)

题意

让你在1-limit中选一个集合,使得集合元素的值等于sum

元素的值为编号的lowbit值

思路

lowbit值很好处理(废话)

然后lowbit的性质是绝对是2的次方,所以集合里面的元素值肯定都是相差多倍或者是相等的情况 所以我们就可以直接对1-limit中的lowbit值从大到小排序 每次取最大的小于等于sum的lowbit值,就行。

具体证明是 如果有一个值为x 那么如果你不去他,你就只能取x/2,和x/4 和x/8,会发现这些值就算都取你也得不到原来的x

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e6+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
struct node{int num;int lowbit;
}my[maxn];
int main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int sum,limit;cin>>sum>>limit;for(int i=1;i<=limit;i++){my[i].num=i;my[i].lowbit=i&(-i);}sort(my+1,my+1+limit,[](node a,node b){return a.lowbit>b.lowbit;});vector<int>ve;for(int i=1;i<=limit;i++){if(my[i].lowbit<=sum){ve.push_back(my[i].num);sum-=my[i].lowbit;}}if(sum)cout<<-1<<endl;else {cout<<ve.size()<<endl;for(int i=0;i<ve.size();i++)cout<<ve[i]<<" ";}return 0;
}

C.The Child and Toy (贪心)

题意

给出n个点m条边让你把所有点删除 删除的花费是所有和该点连接的点的值的总和。

问你吧所有点删除的最小值是多少

思路

首先把删点转换成删边,根据题意 在删点的过程中也相当于删边。

根据题意对于每条边删去的花费是其中一个点的费用,所以就每次贪心取每条边的费用最小的那个点。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e6+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
int a[maxn];
int main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int n,m,sum=0;cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];while(m--){int u,v;cin>>v>>u;sum+=min(a[v],a[u]);}cout<<sum;return 0;
}

D.The Child and Zoo (最大生成树)

题意

给出一个图,对于任意两个点之间的路径中的最小值的和,让你把这个值最大化 输出他的平均值。

思路

首先想到最大生成树,可以保证每两个点之间的路径都是最大费用,然后对于两个子树合并,他们的答案就是子树结点数的乘积(方案数)再乘上这条关键边的费用。

因为我们只求了单向的一次值,所以需要把值乘2 才算是答案

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e6+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
struct Edge{int u,v;ll value;bool operator <( const Edge &a)const {return value>a.value;}
};
vector<Edge>G;
ll a[maxn];
int fa[maxn];
int sz[maxn];
int Find(int u){return u==fa[u]?u:fa[u]=Find(fa[u]);
}
int main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int n,m;cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];while(m--){int u,v;cin>>u>>v;G.push_back(Edge{u,v,min(a[v],a[u])});}for(int i=1;i<=n;i++)sz[i]=1,fa[i]=i;ll ans=0;sort(G.begin(),G.end());for(int i=0;i<G.size();i++){int aa=Find(G[i].u),bb=Find(G[i].v);if(aa^bb){ans+=1LL*(2LL*sz[aa]*sz[bb])*1LL*G[i].value;fa[aa]=bb;sz[bb]+=sz[aa];}}cout<<fixed<<setprecision(6);cout<<1.0*ans/n/(n-1);return 0;
}

E.The Child and Polygon (基础几何+区间DP)

题意

给出一个简单多边形,其中的点根据顺时针或者逆时针排列

让你把这个多边形分成许多三角形满足以下情况

1.三角形的每个端点都在简单多边形的端点上

2.简单多边形的每一条边都要属于一个三角形

3.三角形之间不能重叠和有间隙

4.每个三角形都必须严格在多边形中

5.三角形的每一条边都要连接多边形的两个端点

思路

一开始毫无思路....

首先 利用分治的想法把一整个多边形变成两个小多边形 那么大多边形的答案就是小多边形各自的答案相乘(比如小A的答案是4种,小B的答案是5种,那么他们各自的组合就是4*5=20种),然后把就是怎么分多边形了,假设我们现在的多边形是(0-(n-1))这几个大点构成的,那么小多边形之间的分割点 肯定就是在这些(0~n-1)点之间的某个点 也就是 1,2,3,->n-2 ,那么什么时候结束呢,如果两个点之间没有间隔了就结束。也就是i+1=j了的时候

这时候发现有些分割点并不能取,能取的分割点 和边界也必须要符合构成一个三角形

如下图

另一种情况不能选择这个K点为分割点


这种情况是K在i-j这条线之内的情况

然后那么怎么判断这个点在不在呢,就直接判断线段i -k 和线段k -j是不是在同一个方向的就行.

为了统一我们可以在输入数据的时候就统一指定为顺时针

ps:给出一个序列的点,判断它是顺时针还是逆时针:计算连续两个点的叉积,包括第一个和最后一个,求他们的和,大于0为顺时针,小于0为逆时针。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=1e6+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
struct node{ll x,y;node operator -(const node &a)const{return node{x-a.x,y-a.y};}ll operator *(const node &a)const{return x*a.y-y*a.x;}
}my[550];
ll dp[250][250];
ll dfs(int l,int r){if(l+1==r)return 1;if(~dp[l][r])return dp[l][r];ll ans=0;for(int i=l+1;i<r;i++){if((my[l]-my[i])*(my[i]-my[r])<=0)continue;ans+=dfs(l,i)*dfs(i,r)%mod;ans%=mod;}return dp[l][r]=ans;
}
int main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int n;cin>>n;for(int i=0;i<n;i++)cin>>my[i].x>>my[i].y;ll ans=0;for(int i=0;i<n;i++){ans+=my[i]*my[(i+1)%n];}if(ans<0){reverse(my,my+n);}memset(dp,-1,sizeof(dp));cout<<dfs(0,n-1)<<endl;return 0;
}

转载于:https://www.cnblogs.com/luowentao/p/10413227.html

Codeforces Round 250(Div. 2)相关推荐

  1. Codeforces Round #250 (Div. 2) A - The Child and Homework

    传送门Codeforces Round #250 (Div. 2) A - The Child and Homework 第一次做完之后交上去,过了例子.顺手就锁定了...然后一个小时之后就被HACK ...

  2. Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸

    D. The Child and Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  3. [Codeforces Round #250 (Div. 1) -D] The Child and Sequence

    Codeforces传送门 洛谷传送门 题意翻译 给定数列,区间查询和,区间取模,单点修改. n,m≤105n,m≤105n,m\le 10^5 题目描述 At the children's day, ...

  4. Codeforces Round #250 (Div. 2) (ABCD题解)

    比赛链接:http://codeforces.com/contest/437 A. The Child and Homework time limit per test:1 second memory ...

  5. Codeforces Round #250 (Div. 2)—A. The Child and Homework

         好题啊,被HACK了.曾经做题都是人数越来越多.这次比赛 PASS人数 从2000直掉 1000人  被HACK  1000多人! ! ! ! 没见过的科技啊 1 2 4 8 这组数 被黑的 ...

  6. Educational Codeforces Round 112(Div.2) ABC题解

    D题好像可以做一做,挖个坑以后做好了来填(doge Educational Codeforces Round 112(Div.2) 题目列表 1.A 2.B 3.C 1.A 原题链接 题目大意 有三种 ...

  7. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  8. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  9. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

最新文章

  1. 【FFmpeg】便捷函数汇总(持续更新中...)
  2. 在linux 下怎么查看服务器的cpu和内存的硬件信息
  3. lua学习笔记之字符串
  4. 如何阵列平面_Proe/Creo如何使用点阵列——通过内部草绘创建
  5. dart和python哪个好_RedMonk 2020 年 Q1 编程语言排行:Python 冲进前二,Dart 值得关注...
  6. 搞了这么久的产品,终于看清了真相
  7. 全球服务器内存芯片市场规模,2020年全球存储芯片行业市场现状分析,中国是全球最主要的消费国「图」...
  8. SS不能在Win7中打开,出现停止运行
  9. softmax回归的从零开始实现-09-p4
  10. [转载] 康威的人生游戏与轻量级模式
  11. 机器人收集 + Keypose 算法:准确估计透明物体的 3D 姿态
  12. Arduino--电容式土壤湿度传感器使用及原理
  13. 腾讯云GPU云服务器配置初体验
  14. ffmepg安装yasm之后还是出现nasm/yasm not found or too old. Use --disable-x86asm for
  15. acm-(dp计数)Educational Codeforces Round 97 (Rated for Div. 2) F. Emotional Fishermen
  16. 基于matlab山脊线,基于Matlab的标记分水岭分割算法
  17. 「兔了个兔」福兔贺春,纯CSS实现超精美月兔404界面(附源码)
  18. python进行邮件发送以及django中利用邮件注册激活功能
  19. 线上引流方法有哪些?怎么做线上引流推广?线上引流推广方法
  20. 如何检测隐藏在Magisk背后的ROOT及外挂

热门文章

  1. apollo配置mysql_携程apollo配置中心搭建
  2. SqlLocalDB使用笔记
  3. sqlserver数据库导入
  4. matlab中单独存图_[转载]matlab中保存图片的方法
  5. qfp封装能够linux,MCU的封装也是很有门道的...
  6. 怎么搭建个人私有网盘(高速企业网盘源码平台搭建教程)
  7. 【嵌入式系统设计与实现】4 十字路口交通灯控制(简易版)
  8. 数据库、表、基本增删改查
  9. geany配置python_Geany中怎么配置python?
  10. java时间解析错误_java.lang.IllegalArgumentException:解析错误-日期格式错误?