NOIP2014-10-30模拟赛
T1:逗比三角形
【题目描述】
小J是一名OI退役滚粗文化课选手,他十分喜欢做题,尤其是裸题。他现在有一个二维盒子和一些二维三角形,这个盒子拥有无限的高度和L的宽度。而且他的三角形也都是一些锐角三角形或者是直角三角形。现在小J想把这些三角形放入盒子里,由于小J从txt大神犇那里学会了魔法,所以小J的三角形既可以无视盒子边界又可以重叠放置,但是必须有一条边紧贴盒子底面所在的直线。
现在小J想要最大化在盒子中的被三角形覆盖的区域的面积(即三角形间的重叠部分只算一遍),请问这个最大值应该是多少?
【输入格式】
一行一个整数T,代表数据组数。下面T部分,每部分第一行两个整数N,L分别代表三角形数量与盒子的宽度。下面N行每行三个整数ai,bi,ci表示三角形i的三条边长。
【输出格式】
T行,每行一个实数代表盒子内部被三角形覆盖的区域的面积的最大值。
T2:数三角形
Description
给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4×4的网格上的一个三角形。
注意三角形的三点不能共线。
Input
输入一行,包含两个空格分隔的正整数m和n。
Output
Sample Input
Sample Output
76
数据范围
1<=m,n<=1000
T3:树上三角形
Description
Input
Output
Sample Input
1 2 3 4 5
1 2
2 3
3 4
1 5
0 1 3
0 4 5
1 1 4
0 2 5
0 2 3
Sample Output
Y
Y
N
HINT
对于100%的数据,n,q<=100000,点权范围[1,2^31-1]
附加题:同名"数三角形"
Description

Input
Output
Sample Input
-5 0
0 2
11 2
-11 -6
11 -5
Sample Output
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 100005
#define EPS 1e-5
using namespace std;
double a[MAXN],b[MAXN],c[MAXN];
double S[MAXN],H[MAXN];
int n;
double LL;
bool cal(double h){
double ret=;
for(int i=;i<=n;i++){
if(H[i]>h){
ret+=(H[i]-h)*a[i]/H[i];
}
}
return (ret<=LL);
}
void solve(){
scanf("%d%lf",&n,&LL);
for(int i=;i<=n;i++){
scanf("%lf%lf%lf",&a[i],&b[i],&c[i]);
if(b[i]>c[i]){
swap(b[i],c[i]);
}
if(a[i]>b[i]){
swap(a[i],b[i]);
}
double p=(a[i]+b[i]+c[i])/2.0;
S[i]=sqrt(p*(p-a[i])*(p-b[i])*(p-c[i]));
H[i]=S[i]*/a[i];
}
double L=,R=;
double mid;
while(L+EPS<R){
mid=(L+R)/2.0;
if(cal(mid)){
R=mid;
}
else{
L=mid;
}
}
double ans=;
for(int i=;i<=n;i++){
if(H[i]>L){
ans+=(H[i]-L)*a[i]/H[i]*(H[i]-L)/2.0;
}
}
ans+=L*LL;
printf("%.6f\n",ans); }
int main()
{
freopen("sbtg10.in","r",stdin);
freopen("sbtg.out","w",stdout);
int T;
scanf("%d",&T);
for(int i=;i<=T;i++){
solve();
}
return ;
}
Code1
T2:
用组合数学的知识,先把所有的情况算出来,然后减去共线的情况即可
注意斜的用gcd算,不能用组合数了
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 1005005
#define ll long long
using namespace std;
ll C[MAXN][];
int g[][];
int Gcd(int x,int y){
if(g[x][y]){
return g[x][y];
}
return g[x][y]=((y==)?x:Gcd(y,x%y));
}
void make(){
for(int i=;i<MAXN;i++){
C[i][]=;
}
for(int i=;i<MAXN;i++){
for(int j=;j<=;j++){
C[i][j]=C[i-][j]+C[i-][j-];
}
}
}
int n,m;
int main()
{
make();
ll ans=;
scanf("%d%d",&n,&m);
n++;m++;
ans+=C[n*m][];
ans-=C[n][]*m;
ans-=C[m][]*n;
///!!!
for(int i=;i<=m;i++){
for(int j=;j<=n;j++){
int t=Gcd(i-,j-)-;
ans-=t*(m-i+)*(n-j+)*;
}
}
printf("%lld\n",ans);
return ;
}
Code2
T3:
这题好坑啊
设树链上的节点为a1,a2,a3,……,an
排一下序发现:
如果存在ai+ai+1>ai+2 那么就可以构成三角形了
即较小的两条边大于最大的边
然后考虑一下,如果出题目的人很变态,故意想卡你,使得这个数列尽可能多,但偏偏构成不了三角形(QAQ)
那么肯定是1 1 2 3 5 8 13 ……
斐波拉契数列,然后第50项就炸int了,由于数据又在int范围内,所以当节点数目超过50个时,再想卡你也卡不了,一定可以构成三角形
对于小于50的,直接暴力即可
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 100005
#define ll long long
using namespace std;
int v[MAXN];
int first[MAXN],Next[MAXN*],to[MAXN*],cnt;
int dep[MAXN],fa[MAXN];
int q[MAXN],top;
//double edge
int read(){
int ret=;
char c=getchar();
do{
ret=ret*+c-'';
c=getchar();
}while(''<=c&&c<='');
return ret;
}
void Add(int x,int y){
Next[++cnt]=first[x];first[x]=cnt;to[cnt]=y;
Next[++cnt]=first[y];first[y]=cnt;to[cnt]=x;
}
int n;
void dfs(int x){
for(int e=first[x];e;e=Next[e]){
int y=to[e];
if(y==fa[x]){
continue;
}
fa[y]=x;
dep[y]=dep[x]+;
dfs(y);
}
}
int main()
{
// freopen("sdtg2.in","r",stdin);
// freopen("my.out","w",stdout);
int T;
scanf("%d%d",&n,&T);
for(int i=;i<=n;i++){
scanf("%d",&v[i]);
}
for(int i=;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
Add(x,y);
}
dfs();
for(int i=;i<=T;i++){
int k,x,y;
scanf("%d%d%d",&k,&x,&y);
if(!k){
top=;
while(top<=){
if(dep[x]<dep[y]){
swap(x,y);
}
q[++top]=v[x];
if(x==y){
break;
}
x=fa[x];
}
if(top>){
printf("Y\n");
}
else{
int ok=;
sort(q+,q+top+);
for(int i=;i<=top-;i++){
if((ll)q[i]+q[i+]>q[i+]){
ok=;
printf("Y\n");
break;
}
}
if(!ok){
printf("N\n");
}
}
}
else{
v[x]=y;
}
}
return ;
}
Code3
附加题:
这是一道平面扫描的题目
先正难则反,找非黄金三角形
按角度排序之后,对于每个点i,与原点做一条直线,然后同在直线一侧的肯定是非黄金三角形,这样用组合数就可以计算了
我们只需要考虑左侧,因为后面的点考虑左侧时会正好可以补上,做到不重不漏
顺便说一下,向量a,b的叉积大于等于0(即a.x*b.y-a.y*b.x>=0)表示b在a的左边
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 100005
#define ll long long
using namespace std;
struct Point{
ll x,y;
double angle;
Point(){
x=y=;
angle=;
}
friend bool operator < (const Point &p1,const Point &p2){
return (p1.angle<p2.angle);
}
friend bool operator > (const Point &p1,const Point &p2){
return !(p1<p2);
}
friend ll operator * (const Point &p1,const Point &p2){
return (p1.x*p2.y-p2.x*p1.y);
}
}s[MAXN];
int n;
int main()
{
// freopen("data.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lld%lld",&s[i].x,&s[i].y);
//atan222!!!
s[i].angle=atan2((double)s[i].y,(double)s[i].x);
}
sort(s+,s+n+);
int r=,t=;
ll ans=;
for(int i=;i<=n;i++){
while(r%n+!=i&&s[i]*s[r%n+]>=){
r++; t++;
}
ans+=(ll)t*(t-)/;
t--;
}
printf("%lld\n",(ll)n*(n-)*(n-)/-ans);
return ;
}
Code4
总结:还模版题,模版个鬼啊,这么难
NOIP2014-10-30模拟赛的更多相关文章
- [10.18模拟赛] 序列 (DP)
[10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...
- [10.12模拟赛] 老大 (二分/树的直径/树形dp)
[10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...
- EZ 2018 06 10 NOIP2018 模拟赛(十八)
好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...
- 2018.10.17NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 +100\) 实际得分:\(100 + 100 + 60\) 辣鸡模拟赛.. 5min切掉T1,看了一下T2 T3,感觉T3会被艹爆因为太原了.. 淦了20 ...
- 跳跳虎回家(国庆10.1模拟赛T2)
题目: [题目描述] 跳跳虎在外面出去玩忘了时间,现在他需要在最短的时间内赶回家. 跳跳虎所在的世界可以抽象成一个含有 n 个点的图(点编号从 1 到 n ),跳跳虎现在在 1 号点,跳跳虎的家在 n ...
- 10.31NOIP模拟赛解题报告
心路历程 预计得分:\(100 +100 +80\) 实际得分:\(30 + 100 + 80\) 天天挂分..感觉我noip要凉.. T1不难,但是太坑了 T2不难 T3不难,但是在小机房考试脑子都 ...
- 洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)
洛谷P1667 数列 题目描述 给定一个长度是n的数列A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的.现在你有一个操作可以改变数列,选择一个区间[X,Y]满足\(A_X +A_{ ...
- 2018.10.23NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 50 + (10 \sim 50)\) 实际得分:\(100 + 10 + 50\) 这可能是我打的最懵逼的一场考试没有之一.. T1两个小时才做出来也是醉了. T ...
- 17.2.10 NOIP模拟赛 藏妹子之处(excel)
藏妹子之处(excel) 问题描述: 今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格.但要满足如下的两个条件: ( ...
- 17.2.10 NOIP模拟赛 聪哥的工资
聪哥的工资 (money/money.in/money.out) 时限1000ms 内存256MB 题目描述 lwher: 了体验劳苦大众的生活,聪哥在暑假参加了打零工的活动,这个活动分为n个工作日, ...
随机推荐
- 《Language Implementation Patterns》之访问&重写语法树
每个编程的人都学习过树遍历算法,但是AST的遍历并不是开始想象的那么简单.有几个因素会影响遍历算法:1)是否拥有节点的源码:2)是否子节点的访问方式是统一的:3)ast是homogeneous或het ...
- Twisted UDP编程技术
实战演练1:普通UDP UDP是一种无连接对等通信协议,没有服务器和客户端概念,通信的任何一方均可通过通信原语直接和其他方通信 1.相对于TCP,UDP编程只需定义DatagramProtocol子类 ...
- logging日志
import logging logging.basicConfig(filename='log.log', format='%(asctime)s - %(name)s - %(levelname) ...
- 用js 获取url 参数 页面跳转 ? 后的参数
记得之前在原来的公司写过这个东西,但是还是忘记怎么接住参数了,只知道怎么把id传过去! 问了身边的大佬 他首先推荐了我一个链接是别人写好的方法 附上链接地址:http://blog.csdn.net/ ...
- 第二章 JavaScript核心语法
第二章 avaScript核心语法 一.变量的声明和赋值 JavaScript是一种弱类型语言,没有明确的数据类型,也就是在声明变量时不需要指定数据类型,变量的类型由赋给变量的值决定. 在Java ...
- Jenkins 安装、配置与项目新建及构建
1.Jenkins的安装与配置 1.1 java环境配置 Jenkins基于Java, Linux下安装java只要配置java环境变量即可. 首先,解压java到相应目录,我一般习惯把安装的软件放到 ...
- python全栈开发-re模块(正则表达式)应用(字符串的处理)
一.概述 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,要讲他的具体用法要讲一本书!它内嵌在Python中,并通过 re 模块实现.你可以为想要匹配的相应字符串集指定规则:该 ...
- kafka和mqtt的区别是什么?
两者都是从传统的Pub/Sub消息系统演化出来的,但是进化方向不一样,比较如下: Kafka是为了数据集成的场景,与以往Pub/Sub消息总线不一样,通过分布式架构提供了海量消息处理.高容错的方式存储 ...
- JMeter入门(01)概念和样例
一.概念 JMeter 是一款专门用于功能测试和压力测试的轻量级测试开发平台,实现了许多和互联网相关的网络测试组件,同时还保留着很强的扩展性. JMeter可以用来测试诸如:静态文件,Java Ser ...
- 高级OOP特性(6)
PHP不支持的高级OPP特性 PHP不支持通过函数重载实现多态 PHP不支持多重继承 PHP不支持根据所修改数据类型为操作符赋予新的含义 对象克隆 克隆实例 在对象前面添加clone关键字来克隆对象, ...