第二弾が始まる!

codechef problems 第二弹

一、Backup Functions

题面

One unavoidable problem with running a restaurant is that occasionally a menu item cannot be prepared. This can be caused by a variety of reasons such as missing ingredients or malfunctioning equipment.

There is an additional problem with such situations. A customer who has spent many minutes deciding between menu items can get quite annoyed when they place the order and the server tells them the item is not available. To mitigate this effect, the Chef declares that all servers must have what he calls a "backup function". This is a function f from menu items to menu items. For each menu item x, f(x) is an alternative menu item that the server may suggest to the customer in the event the customer requests menu item x when x is not available.

Of course, if a given item is not available then some other items make better suggestions than others. So, for some pairs of items x and y the Chef has determined a numeric value describing the effectiveness of the assignment f(x) = y. Higher values indicate the proposed substitute is similar to the original and lower values indicate the proposed substitute is not very similar to the original. Such effectiveness values are symmetric meaning that if the effectiveness of assignment f(x) = y is v, then the effectiveness of the assignment f(y) = x is also v.

You will be given a list of pairs of menu items. Each such pair will come with an associated effectiveness value. You are to compute a backup function f from these pairs. However, there is one additional constraint. For personal reasons, the Chef is opposed to using two items as backups for each other. Thus, for any two menu items x and y, it cannot be that f(x) = y and f(y) = x. Your goal is to compute a backup function of maximum possible quality. The quality of the backup function is simply defined as the sum of the effectiveness values of the assignments f(a) for each item a.

Input

The first line contains a single integer T ≤ 30 indicating the number of test cases.

Each test case begins with two integers N and M where 3 ≤ N ≤ 10,000 and 3 ≤ M ≤ 50,000 where N is the number of items in the menu. The menu items will be numbered 1 through N.

M lines follow, each containing three integers a,b, and v. Here 1 ≤ a < b ≤ N and |v| ≤ 100,000. Such a triple indicates that f(a) = b or f(b) = a (but not both) may be used in a backup function. Setting either f(a) = b or f(b) = a has effectiveness v. Each pair 1 ≤ a < b ≤ N will occur at most once in the input.

Test cases will be separated by a single blank line (including a blank line preceding the first test case).

Output

The output for each test case consists of a single line containing the maximum possible quality of a backup function f that does not assign any pair of items to each other. To be explicit, the assignment f(a) = b has effectiveness v where v is the value associated with the a,b pair in the input. Then the quality of a backup function is just the sum of the effectiveness values of the assignment for each item. If no backup function can be constructed from the given input pairs, then simply output "impossible" (note the lowercase 'i').

We may only assign f(a) = b or f(b) = a if a,b is an input pair. Furthermore, a backup function defines a single item f(a) for every item a between 1 and n. Note that f(a) = a is not valid since f(a) is supposed to be an alternative item if menu item a is not available (and all input pairs a,b have a < b anyway). Finally, based on the Chef's additional constraint we cannot have a backup function with both f(a) = b and f(b) = a for any input pair a,b.

Example

Input:

  -

  -

  -
Output:
impossible

Note, one possible solution for the first test case is f(1) = 2, f(2) = 3, and f(3) = 1. The second is impossible since the only possiblity for f(5) is 6 and the only possiblity for f(6) is 5 and both cannot be used in a backup function. Finally, a possible solution for the last test case is f(1) = 2, f(2) = 3, f(3) = 1, and f(4) = 2.

Description

给定N道菜,M个替换关系

替换关系描述为三元组(a,b,c),表示a和b两道菜可以相互作为备选菜,当a或b没法做时,b或a可以作为它的备用菜

定义函数f(x)=y,代表菜x的备选菜是y

特别地,不允许f(x)=y and f(y)=x

Solution

并查集,把关系排序后能加就加

#include <stdio.h>
#include <algorithm>
#define N 10010
#define M 50010
#define Buf 1<<22
#define RG register
#define Blue() ((S==T&&(T=(S=B)+fread(B,1,Buf,stdin),S==T))?0:*S++)
char B[Buf],*S=B,*T=B;
template<class Type>inline void Rin(RG Type &x)
{
x=;RG int c=Blue();RG bool b=false;
for(;c<||c>;c=Blue())
if(c==)b=true;
for(;c>&&c<;c=Blue())
x=(x<<)+(x<<)+c-;
x=b?-x:x;
}
bool r[N];
int k,n,m,f[N],a,c,tx,ty;
struct L
{
int u,v,w;
bool operator < (const L &o) const
{
return w<o.w;
}
}e[M];
inline int fd(RG int x)
{
for(;x!=f[x];x=f[x]=f[f[x]]);
return x;
}
#define FO(x) {freopen(#x".in","r",stdin);}
int main(){
FO(cc backup func);
Rin(k);
while(k--)
{
Rin(n),Rin(m);
for(RG int i=;i<=m;i++)
Rin(e[i].u),Rin(e[i].v),Rin(e[i].w);
std::sort(e+,e++m);
for(RG int i=;i<=n;i++)
f[i]=i,r[i]=;
a=c=;
while(c<n&&m)
{
tx=fd(e[m].u),ty=fd(e[m].v);
if(tx!=ty)
{
if(r[tx]|r[ty])
++c,
f[tx]=ty,
r[ty]&=r[tx],
a+=e[m].w;
}
else if(r[ty])
++c,
r[ty]=,
a+=e[m].w;
m--;
}
c==n?printf("%d\n",a):puts("impossible");
}
return ;
}

二、magic hull

题面

You are given a set of N two-dimensional non-zero vectors (X1Y1), (X2Y2), ..., (XNYN) with integer coordinates. You can choose no more than 6 vectors from this set to form a non-strictly convex polygon that have sides equal to these vectors (see paragraph below for more detailed explanation). Non-strictly convex polygon is the polygon that can have flat angles (angles of 180 degrees). You can select each vector several times if needed. Your goal is to maximize the area of this polygon. It is guaranteed that at least one such convex polygon can be constructed.

How exactly we construct a polygon from the given sequence of vectors? Suppose you've chosen the sequence of vectors (U1V1), (U2V2), ..., (UKVK), where 3 ≤ K ≤ 6. Each vector here should be equal to one of the given N vectors but some vectors in this sequence can coincide. At first, you take some point (A1B1) at the plane as the first vertex of your polygon. Then you put your first vector (U1V1) to this point to obtain the second vertex (A2B2) = (A1 + U1B1 + V1). Next you take the second vector and put it to the second vertex to obtain the third vertex and so on. Finally, at the last step you put vector (UKVK) to the Kthvertex (AKBK) to obtain the point (AK + 1BK + 1) = (AK + UKBK + VK) that should coincide with the first vertex (A1B1), otherwise we should reject this sequence of vectors. Hence in the end we obtain a polygon with vertexes (A1B1), (A2B2), ..., (AKBK). If this polygon is simple (without self-intersections) and non-strictly convex, we should consider its area as the candidate for the answer. By self-intersection we mean that either some non-consecutive sides (considered with their ends) have common point or two consecutive sides have more than one common point.

Input

The first line of the input file contains an integer N, the number of the given vectors. Each of the following N lines contains two space separated integers XiYi, coordinates of the corresponding vector.

Output

In the only line of the output file print the maximal possible area of the convex polygon that can be constructed by the rules described in the problem statement with exactly one digit after the decimal point.

Constraints

3 ≤ N ≤ 150

|Xi||Yi| ≤ 1000000

All vectors are non-zero: |Xi| + |Yi| > 0

There exists at least one sequence of at most 6 vectors from this set that forms a convex polygon.

Example

Input:

-
-
- -
Output:
2.0

Explanation

The only non-strictly convex polygon you can construct from these vectors by the rules described in the problem statement is the isosceles trapezoid that has height of length 1 and bases of length 1 and 3. It has area 2.0.

Description

给你一堆向量,求k个向量组成凸包的最大面积

其中k<=6

Solution

O(n^3)建凸壳

满足和向量互为相反向量的就可以组合成一个凸包

二分+排序

最差时间复杂度(n^3 * log n)

目前codechef上rank1最快,归功于简单短小的变量名

#include <math.h>
#include <stdio.h>
#include <algorithm>
#define L long long
#define N 155
#define U 1<<22
#define dmax(a,b) ((a)>(b)?(a):(b))
#define dabs(a) ((a)<(0)?(-a):(a))
#define F()((I==J&&(J=(I=B)+fread(B,1,U,stdin),I==J))?0:*I++)
char B[U],*I=B,*J=B;
template<class T>inline void Rin(T &x)
{
x=;int c=F();bool b=;
for(;c<||c>;c=F())
if(c==)b=;
for(;c>&&c<;c=F())
x=(x<<)+(x<<)+c-;
x=b?-x:x;
}
struct VV
{
int x,y;
VV(int _=,int __=)
{
x=_;
y=__;
}
bool operator < (VV o) const
{
return x<o.x||x==o.x&&y<o.y;
}
bool operator == (VV o) const
{
return x==o.x&&y==o.y;
}
L operator ^ (VV o) const
{
return (L)x*o.y-(L)y*o.x;
}
VV operator + (VV o) const
{
return VV(x+o.x,y+o.y);
}
VV operator - () const
{
return VV(-x,-y);
}
int p()
{
return y>||y==&&x>;
}
}V[N];
struct PP
{
VV f;
L s;
PP(VV _=,L __=)
{
f=_;
s=__;
}
bool operator < (PP o) const
{
return f<o.f||f==o.f&&s<o.s;
}
bool operator == (PP o) const
{
return f==o.f&&s==o.s;
}
}P[N*N*N/];
bool A(VV a,VV b)
{
int p=a.p();
int q=b.p();
if(p!=q)
{
return p>q;
}
return (a^b)>;
}
int n,_t,_k;
L ans;
#define FO(x) {freopen(#x".in","r",stdin);}
int main()
{
FO(cc magic hull);
Rin(n);
for(int i=;i<n;i++)
{
Rin(V[i].x);
Rin(V[i].y);
}
std::sort(V,V+n,A);
//按角度大小排序,不用atan2等库函数防止浮点误差,本题没有这样的特殊要求;
for(int i=;i<n;i++)
{
for(int j=i;j<n;j++)
{
L m=V[i]^V[j];
if(m<)
{
break;
}
m=dabs(m);
P[_t++]=PP(V[i]+V[j],m);
//P数组用于存储和向量及面积,多边形面积并直接叉积就行;
for(int k=j;k<n;k++)
{
if((V[j]^V[k])<)
{
break;
}
VV t=V[i]+V[j]+V[k];
if((V[i]^t)>=)
{
P[_t++]=PP(t,m+dabs(V[k]^t));
}
}
}
}
std::sort(P,P+_t);
for(int i=;i<_t;)
{
int j=i;
for(;j<_t&&P[i].f==P[j].f;j++)
;
P[_k++]=P[j-];
i=j;
}
for(int i=;i<_k;i++)
{
VV t=-P[i].f;
int j=std::lower_bound(P,P+_k,PP(t,-1LL))-P;
if(j<_k&&P[j].f==t)
{
ans=dmax(ans,P[i].s+P[j].s);
}
}
printf("%lld.%lld\n",ans/,ans%*);
return ;
}

codechef营养题 第二弹的更多相关文章

  1. codechef 营养题 第一弹

    第一弾が始まる! 定期更新しない! 来源:http://wenku.baidu.com/link?url=XOJLwfgMsZp_9nhAK15591XFRgZl7f7_x7wtZ5_3T2peHh5 ...

  2. codechef营养题 第三弹

    第三弾が始まる! codechef problems 第三弹 一.Motorbike Racing 题面 It's time for the annual exciting Motorbike Rac ...

  3. 关于『进击的Markdown』:第二弹

    关于『进击的Markdown』:第二弹 建议缩放90%食用 众里寻他千百度,蓦然回首,Markdown却在灯火灿烂处 MarkdownYYDS! 各位早上好!  我果然鸽稿了  Markdown 语法 ...

  4. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  5. 前端学习 第二弹: JavaScript中的一些函数与对象(1)

    前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...

  6. 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)

    继上一次介绍了<神奇的六边形>的完整游戏开发流程后(可点击这里查看),这次将为大家介绍另外一款魔性游戏<跳跃的方块>的完整开发流程. (点击图片可进入游戏体验) 因内容太多,为 ...

  7. typecho流程原理和插件机制浅析(第二弹)

    typecho流程原理和插件机制浅析(第二弹) 兜兜 393 2014年04月02日 发布 推荐 1 推荐 收藏 14 收藏,3.7k 浏览 上一次说了 Typecho 大致的流程,今天简单说一下插件 ...

  8. LCA问题第二弹

    LCA问题第二弹 上次用二分的方法给大家分享了对 LCA 问题的处理,各位应该还能回忆起来上次的方法是由子节点向根节点(自下而上)的处理,平时我们遇到的很多问题都是正向思维处理困难而逆向思维处理比较容 ...

  9. 线段树+RMQ问题第二弹

    线段树+RMQ问题第二弹 上篇文章讲到了基于Sparse Table 解决 RMQ 问题,不知道大家还有没有印象,今天我们会从线段树的方法对 RMQ 问题再一次讨论. 正式介绍今天解决 RMQ 问题的 ...

随机推荐

  1. IntelliJ IDEA 安装目录的核心文件讲解

    转自:https://blog.csdn.net/qq_35246620/article/details/61916751 首先,我们回顾一下前两篇关于 IntelliJ IDEA 的博文的内容: 在 ...

  2. Linux 下編輯 PDF 檔的工具(PDF editor under Linux)(转载)

    转自:http://www.gtwang.org/2011/05/linux-pdf.html PDF 檔雖然是一個跨平台的檔案格式,但 Adobe 只有提供免費的 Adobe Reader,要看 P ...

  3. MySQL性能优化神器Explain

    本文涉及:MySQL性能优化神器Explain的使用 简介 虽然使用Explain不能够马上调优我们的SQL,它也不能给予我们一些调整建议,但是它能够让我们了解MySQL 优化器是如何执行SQL 语句 ...

  4. 例题 5-1 STL

    Raju and Meena love to play with Marbles. They have got a lot of marbles with numbers written on the ...

  5. centos 7 配置php

    对于我们的目的而言,安装 Apache 只需要在 CentOS 命令终端敲入这条命令就行了: $ sudo yum install httpd $ sudo systemctl enable http ...

  6. Poj 1236 Network of Schools (Tarjan)

    题目链接: Poj 1236 Network of Schools 题目描述: 有n个学校,学校之间有一些单向的用来发射无线电的线路,当一个学校得到网络可以通过线路向其他学校传输网络,1:至少分配几个 ...

  7. GIT学习之路第五天 分支管理

    本文参考廖雪峰老师的博客进行总结,完整学习请转廖雪峰博客 5.1创建与合并分支 首先创建dev分支,然后切换dev分支 $git checkout -b dev(包含创建并切换) 等价于<-&g ...

  8. md5加密、Des加密对称可逆加密、RSA非对称可逆加密、https单边验证、银行U盾双边认证

    1.md5不可逆的加密方式,加密成一个32位的字符串.算法是公开的,任何语言的加密结果都是一样的.总有可能是重复的.     用途:             (1)防止明文存储:可以用作密码加密    ...

  9. SQL优化器简介

    文章导读: 什么是RBO? 什么是CBO? 我们在工作中经常会听到这样的声音:"SQL查询慢?你给数据库加个索引啊".虽然加索引并不一定能解决问题,但是这初步的体现了SQL优化的思 ...

  10. Floating-point exception

    Floating-point exception 同一个程序在一台高版本Linux上运行时没有问题,而在另一台低版本机器上运行报Floating Point Exception时,那么这极有可能是由高 ...