第二弾が始まる!

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. IDEA中Spark往Hbase中写数据

    import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.io.ImmutableBytesWr ...

  2. JS判断字符串中是否存在某个字符

    用String类中的indexOf函数,例如:String str="we find out sth";if(str.indexOf("o")==-1){ // ...

  3. jQuery的each内部的break,continue

    // break, continue在each等迭代器里都不可用 // return false = break // return true = continue function isClicke ...

  4. 0621补-MVC的基础整理

    包括:Model-模型.view-视图.Controller-控制器. 特点: 将功能强制分成两个部分,显示html文件,和逻辑PHP文件: 要求浏览器请求负责功能的PHP逻辑文件,该PHP逻辑文件, ...

  5. bzoj 1622: [Usaco2008 Open]Word Power 名字的能量【模拟】

    模拟即可,注意包含可以是不连续的 方便起见读入的时候全转成小写 #include<iostream> #include<cstdio> using namespace std; ...

  6. python自动化测试学习笔记-10YAML

    之前学习的编写测试用例的方法,都是从excel中编写接口的测试用例,然后通过读取excel文件进行接口自动化测试,这种方式我们叫做数据驱动的方式,由于excel操作起来不灵活,无法实现关联关系的接口测 ...

  7. [C陷阱和缺陷] 第4章 连接

    一个C程序可能是由多个分别编译的部分组成,这些不同部分通过连接器合并成一个整体.在本章中,我们将考查一个典型的连接器,注意它是如何对C程序进行处理的,从而归纳出一些由于连接器的特点而可能导致的错误. ...

  8. php 页面展示

    php 页面展示 复杂逻辑. 段落注释

  9. 18 C#中的循环执行 for循环

    在这一节练习中,我们向大家介绍一下C#中的另一种重要的循环语句,for循环. for(表达式1;表达式2;表达式3) { 循环体 } 表达式1:一般为赋值表达式,给控制变量赋初值: 表达式2:逻辑表达 ...

  10. HTML空格占位

      它叫不换行空格,全称No-Break Space,它是最常见和我们使用最多的空格,大多数的人可能只接触了 ,它是按下space键产生的空格.在HTML中,如果你用空格键产生此空格,空格是不会累加的 ...