刚开始的时候被E题卡住了,不过发现是个数学题后就开始使劲推式子,幸运的是推出来了,之后的F题更是树形DP换根的模板吧,就草草的过了,看了一眼G,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完!比赛结束五分钟后,打完代码,woc,连样例都过不去,一看,确实忽略了一些情况。这个题卡的值了!

G - Isosceles Trapezium

题目中有1000个点,每个点都有一定的权值,要求你选出四个点,使得他们的权值和最大并且能够组成一个等腰梯形。

首先我们肯定是要挖掘等腰梯形的性质,来帮助我们做题。最明显的特征就是有两个平行的边,这启示我们在本题中的研究对象从点放到边上,我们可以预处理出所有的线段,考虑到等腰梯形的特殊性,我们考虑怎样的两条线段能够组成等腰梯形。发现他们的垂直平分线相同,并且他们线段的中点不是同一个点。既然这样的话,我们对于每一条线段需要一下信息:

1.它所对应的垂直平分线。

2.它的中点。

3.组成这个线段的两个点的权值和。

由于我们知道只有垂直平分线相同的线段才能组成等腰梯形,所以我们可以将所有的线段按照他们的垂直平分线分组。这就要需要我们制定一个唯一确定垂直平分线的方法,但double的精度问题可能会是这个确定有误差,所以我们用两个整数代表斜率k的分子分母,之后再用一个整数代表b的分子,三个数据就能代表一个线段,之后进行约分,符号统一等。

在组内,我们怎样找中点不同的两个线段的权值最大?我们可以建个set,权值作为第一排序关键字,之后再同一组内的所有线段之和权值最大的线段比较终点相同不相同即可。这个留作自己思考。整体代码的实现需要比较多的语法,挺拓展一个人的语法上的宽度。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1010;
int n,nx;
ll X[N],Y[N],W[N];
map<tuple<ll,ll,ll>,int>mp;//用map记录垂直平分线分的组。
set<pair<ll,pair<ll,ll> > >st[N*N];//用set储存不同组里这个线段的中点和w和。
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
int main()
{
//freopen("1.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%lld%lld%lld",&X[i],&Y[i],&W[i]);
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
{
ll dx=X[i]-X[j],dy=Y[i]-Y[j],dw=W[i]+W[j];
if(!dx||!dy)
{
if(!dx) dy=0,dx=1;
else dx=0,dy=1;
}
else
{
ll d=gcd(dx,dy);
swap(dx,dy);
dx/=d;dy/=d;//将k的分子分母化作最简。
dy*=-1;
if(dx<0&&dy<0||dx>0&&dy<0) dx=-dx,dy=-dy;//统一符号在dx上.
}
ll cx=X[i]+X[j],cy=Y[i]+Y[j];
ll b=cy*dx-cx*dy;//求得b,这只是b的分子,b的分母为2*dx,但这之前存过dx,dy,所以不必单独存储b的分母
auto sx=make_tuple(dx,dy,b);
if(mp.find(sx)==mp.end()) mp[sx]=++nx;
st[mp[sx]].insert({-dw,{cx,cy}});
}
ll ans=-1;
for(int i=1;i<=nx;++i)//对每一组进行搜索答案。
{
if(st[i].size()<2) continue;
auto sx=*(st[i].begin());
for(auto x:st[i])
{
if(x.second!=sx.second)
{
ans=max(ans,-sx.first-x.first);
break;
}
}
}
printf("%lld",ans);
return 0;
}

H - Security Camera

简化题意:给你一个无向图\(n个点,m条边\),在每个点上你都可以选择是否安装一个摄像头,问一共\(2^n\)种方案中,有多少种方案使得被监视的道路数量为偶数。当一条边的两个端点至少有一个点安装摄像头,这条边才算被监视。

在这个题中,比较难处理的是:当处理一个点时,我们怎样统计它所造成的边的代价,因为每条边都有两个端点,只有两个点都没安装摄像头时,这条边才没被监控。还有一点就是边的数量是800,状态比较多,相比较之下,点的数目就只有40,我们可以思考将边的统计放到点上面去。关于这点,我们可以强制将边给定向,将边的方向定义为小的点指向大的点。这样的话,边的统计似乎有迹可循了...

但是这个题真的很难搞哎,算了,先理解一下大佬们优秀的做法吧:

设f[i][j][k]为当前处理完第i个点后,j:当前删除的边数为奇数/偶数(0/1),k:当前各个点不选这个点删除的边数为奇数/偶数(0/1)(将所有点状压)的方案数。这个状态可能比较突兀与难以理解,但仔细品品,品品....j表明当前删除的边的状态,方便我们统计最后的答案。k这一维就有点难以理解了,不选这个点删除的边数的奇偶,也就是一条边的小的端点没有选,这些边都累计到大的边上。正是这个点很好的解决了我们的后效性的问题。

为了方便期间,我们把g[x]记作点x连向的点的|起来的值。当然是先转化成状压的形式,再或起来。

我们考虑一个点x,有指向他的点sx,有它指向的点tx,若这个点选的话,这些所有的边都不用删,则无论对于哪个点的删除的边的就都不会有影响,因为滞后性的缘故,sx中选的点边没有累计到x上,没选的点也因为x选而不上了,tx因为x选了,所有边都被监控,所以他们也没有必要累计边。但若当x没选的时候,当前j就要发生变化了,因为x要删除他之前存的删除的边的奇偶,并且,他还要把x连向tx的边累计到tx上去,导致他们没选而删除的边的奇偶发生变化。这个统计答案的方式,是当一个边真正的两个点都没选时才被删除。代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=42;
int n,m;
ll g[N];
map<ll,ll>f[N][2];
int main()
{
//freopen("1.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
int x,y;scanf("%d%d",&x,&y);
x--;y--;
if(x>y) swap(x,y);
g[x]|=1ll<<y;
}
f[0][0][0]=1;//选0点,所有点因为不选要删除的边都为0,为偶数。
f[0][0][g[0]]++;//不选0点,0指向的点因为不选要删除的边为1.
for(int i=0;i<n-1;++i)
{
for(int j=0;j<2;++j)//枚举当前的删除的边数的奇偶。
{
for(auto x:f[i][j]) //枚举上一层的所有状态,进行推磨式转移。
{
ll bit=(x.first&(1ll<<i+1))?1:0;//确定因为i不选要删除的边的奇偶。
f[i+1][j][x.first^(bit<<(i+1))]+=x.second;
//选i号点,所有点(i之后的点)因为不选而删除的边数的就不变。且j的状态不变。
f[i+1][j^bit][x.first^(bit<<(i+1))^g[i+1]]+=x.second;
//不选i号点,j的状态根据当前j和因为i不选要删除的边数的就确定。
//并且改变之后的点因为不选而删除的边的奇偶。
}
}
}
ll ans=0;
for(auto x:f[n-1][m&1]) ans+=x.second;
printf("%lld",ans);
return 0;
}

这个题给我的启示:用map时要尽量减少状态的数量,可以选择将一些无关紧要的状态合并,这对提高时间和空间的复杂度很关键!

AtCoder Beginner Contest 220部分题(G,H)题解的更多相关文章

  1. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  2. AtCoder Beginner Contest 068 ABCD题

    A - ABCxxx Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement This contes ...

  3. AtCoder Beginner Contest 069 ABCD题

    题目链接:http://abc069.contest.atcoder.jp/assignments A - K-City Time limit : 2sec / Memory limit : 256M ...

  4. AtCoder Beginner Contest 050 ABC题

    A - Addition and Subtraction Easy Time limit : 2sec / Memory limit : 256MB Score : 100 points Proble ...

  5. AtCoder Beginner Contest 057 ABCD题

    A - Remaining Time Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Dol ...

  6. AtCoder Beginner Contest 070 ABCD题

    题目链接:http://abc070.contest.atcoder.jp/assignments A - Palindromic Number Time limit : 2sec / Memory ...

  7. AtCoder Beginner Contest 051 ABCD题

    A - Haiku Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement As a New Yea ...

  8. AtCoder Beginner Contest 137 D题【贪心】

    [题意]一共有N个任务和M天,一个人一天只能做一个任务,做完任务之后可以在这一天之后的(Ai-1)天拿到Bi的工资,问M天内最多可以拿到多少工资. 链接:https://atcoder.jp/cont ...

  9. AtCoder Beginner Contest 215 F题题解

    F - Dist Max 2 什么时候我才能突破\(F\)题的大关... 算了,不说了,看题. 简化题意:给定\(n\)个点的坐标,定义没两个点的距离为\(min(|x_i-x_j|,|y_i-y_j ...

随机推荐

  1. [Python]爬虫获取知乎某个问题下所有图片并去除水印

    获取URL 进入某个知乎问题的主页下,按F12打开开发者工具后查看network面板. network面板可以查看页面向服务器请求的资源.资源的大小.加载资源花费的时间以及哪些资源加载失败等信息.还可 ...

  2. PHP中的日期相关函数(二)

    上回文章中我们介绍了三个时间日期相关的对象,不过它们的出镜频率并不是特别地高.今天学习的对象虽说可能不少人使用过,但是它的出镜频率也是非常低的.它们其实就是我们非常常用的那些面向过程的日期函数的面向对 ...

  3. Jmeter系列(8)- 参数化:JSON提取器、全局参数化、CSV文件导入

    JSON提取器 同一个响应结果需要提取多个参数进行参数化,下方输入项用分号(;)进行间隔.请求引用时${变量名} 全局参数化 此处全局参数化用的是用户自定义的变量 CSV文件导入

  4. Django边学边记—静态文件

    概念 项目中的CSS.图片.js都是静态文件 一般会将静态文件放到一个单独的目录中,以方便管理 在html页面中调用时,也需要指定静态文件的路径,Django中提供了一种解析的方式配置静态文件路径 静 ...

  5. LR进行内外网附件上传并发——实践心得

    刚开始接触LR的时候,做了一次内外网附件上传的并发测试,比较简单,但当时理解有些欠缺.以下为当时的实践心得: 1.分内外网测试的意义: 内网测试主要看负载压力情况等,外网测试主要考虑网络带宽.网络延时 ...

  6. vivo全球商城-营销价格监控方案的探索

    一.背景 现在日常官网商城的运营中有一定概率出现以下两个问题: 1)优惠信息未对齐 官网商城促销优惠的类型越来越多,能影响最终用户实付价的优惠就有抢购.满减.优惠券.代金券等.实际业务操作中存在不同促 ...

  7. YbtOJ#883-最大的割【带修线性基】

    正题 题目链接:http://www.ybtoj.com.cn/contest/118/problem/3 解题思路 给出\(n\)个点,\(m\)次动态插入一条无向边询问:割掉一些边使得图中至少两点 ...

  8. Flask SSTI利用方式的探索

    Flask SSTI利用方式的探索 一.SSTI简介&环境搭建 ​ 一个统一风格的站点,其大多数页面样式都是一致的,只是每个页面显示的内容各不相同.要是所有的逻辑都放在前端进行,无疑会影响响应 ...

  9. Springboot在有锁的情况下如何正确使用事务

    1. 概述 老话说的好:想要赚钱,就去看看有钱人有什么需求,因为有钱人钱多,所以赚的多. 言归正传,在Java项目的研发中,"锁"这个词并不陌生,最经典的使用场景是商品的超卖问题. ...

  10. IDEA Web渲染插件开发(一)— 使用JCEF

    目前网上已经有了很多关于IDEA(IntelliJ平台)的插件开发教程了,本人觉得简书上这位作者秋水畏寒的关于插件开发的文章很不错,在我进行插件开发的过程中指导了我很多.但是综合下来看,在IDEA上加 ...