contest 链接:http://codeforces.com/gym/101673
A - Abstract Art
求多个多边形并的面积,板子题,记小本本
#include
using namespace std;
#define mp make_pair
typedef long long ll;
const double inf=1e200;
const double eps=1e-12;
const double pi=4*atan(1.0);
int dcmp(double x){ return fabs(x)p){
double ans=0; int sz=p.size();
for(int i=1;ipp[110];
pairs[110*60];
double polyunion(vector*p,int N){
double res=0;
for(int i=0;i=0&&c2<0) s[m++]=mp(s1/(s1-s2),1);
else if(c1<0&&c2>=0) s[m++]=mp(s1/(s1-s2),-1);
}
}
}
}
sort(s,s+m);
double pre=min(max(s[0].first,0.0),1.0),now,sum=0;
int cov=s[0].second;
for(int j=1;j
C - DRM Messages
很水的小模拟
在不知道题意的情况下听队友说步骤就过了
#include
#include
D - Game of Throwns
这也是个水题啊,用栈模拟一下就好了
但还是因为取模没考虑负数WA了两发
#include
#include
H - Sheba's Amoebas
题意:求出黑色环的个数, 数据保证不相交
解题思路:其实也就是个简单的dfs,因为要判断环,多开一个vis数组标记一下即可
#include
#include
好啦,无脑题都说完啦
G - A Question of Ingestion |
题目大意:一开始的食量为m,有n个连续的小时,每小时都有一个a[i]表示,可以选择吃或者不吃。
这个小时吃的话下个小时的食量就变成2/3,上个小时吃了这个小时不吃的话下个小时恢复到上个小时的,连续两小时不吃就能恢复到m
解题思路:开始题意理解错了,这么简单的一个记忆化搜索都没做出来,伤心。。
直接记忆化搜索枚举不吃的小时即可
#include
#include
还有一种dp写法:
dp[i][j] : 在第i个小时已经吃了j小时,获得的最大价值
#include
#include
Continuing...
================================================================================
update:
F - Keeping On Track
题目大意:给n条边,然后去掉一个影响最大的点(数据保证有且仅有一个),让你先求出当前没有联通的点的对数,再让你加一条边,求出加了之后最少的没有联通的点的对数。
解题思路:对于第一问,直接枚举删的点,维护最大值并且记录下来
对于第二问,肯定是把最大的两块合起来,一个dfs就可以解决了
身为一个菜鸡,这题妙处真的多,多说几句。
首先,很容易想到如果能够得到每一个节点作为根节点它的子树的大小,就很容易做出来了,但是这样的复杂度是n ^ 2的
那么这样考虑:边dfs边记录、更新答案。
用一个sz数组保存以0为根节点,每个点子树的大小。那么vector里面装它接下来子树的大小,那以前的怎么办呢?很巧妙的用了一个sum记录了dfs下去的和,那么n - sum就是之前的了。那么接下来,如何利用这个vector来判断不连通的点的对数呢?
比如有三个数:1, 2, 3
res = 2 * 1 + 3 * (1 + 2) = 11
验证一下: res = (1 * (2 + 3) + 2 * (1 + 3) + 3 * (1 + 2)) / 2 = 11
这个结论真的太妙了,知道了也就能理解怎么推出来的了
这样,我们只需要一个dfs就能求出枚举所有点被删除的情况了
我真是个图论小白
#pragma GCC diagnostic error "-std=c++11"
#include
#include
Continuing...