世界上最不缺的就是好题。

首先考虑暴搜。(还有什么题是从这东西推到正解的……)

首先单独一个换乘站明显没用,只用考虑一对对的换乘站。

那么有八种情况:(从题解偷图)

       

然后大力枚举每个换乘站的情况。同时判断交点。$O(n\times 8^{\frac{n}{2}})$。

然后考虑这种情况:

发现对于任意一条地铁线,要么与这两个都有交点,要么可以与这两个都没有交点。(其实会有与一个有两个交点,与另一个没有交点的情况。这时也可以把这条线换个方向,答案不会更差。思考思考为什么)

那么合法状态只剩四种:

   

再考虑这两个线路:

发现,虽然对于左端点在第一个红点右边的地铁线,这两种没有区别,但是对于左端点在第一个红点左边的地铁线,它们可能有区别。
不过由于我们搜索是按左端点从小到大搜的,所以可以贪心取目前这两条线最优的一条,不会影响后面的值。

最后每次合法状态只剩两个。$O(n\times 2^{\frac{n}{2}})$。

此时合法状态不可能再减少了。考虑加速求交点个数。

发现对于左端点小于当前地铁线的左端点的地铁线,与这个地铁线有交点当且仅当右端点在一个区间(具体看代码)内。

那么可以用树状数组优化。每次给右端点打个标记,然后就变成了求区间和。

$O(2^{\frac{n}{2}}\log n)$。

p.s:要调用很多次树状数组,常数也不小,我就挂了,挂成 80 分。

然而加上个普及组剪枝就过了。$sum>ans$ 时 $return$。

(普及组搜索剪枝不会了……智商越来越低了)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int t,n,m,tp[maxn],l[maxn],r[maxn],ans,sum,b[][maxn];
inline void update(int id,int p,int v){
while(p<=n){
b[id][p]+=v;
p+=p&-p;
}
}
inline int query(int id,int p){
int s=;
while(p){
s+=b[id][p];
p-=p&-p;
}
return s;
}
inline int query(int id,int l,int r){return query(id,r)-query(id,l-);}
void dfs(int dep){
if(sum>ans) return;
if(dep>m) return void(ans=sum);
int t1=query(,l[dep],r[dep]),t2=query(,r[dep],n),t3=query(,l[dep],r[dep]),t4=query(,r[dep],n);
update(,r[dep],);
sum+=min(t1,t2+t3+t4);
dfs(dep+);
sum-=min(t1,t2+t3+t4);
update(,r[dep],-);
update(,r[dep],);
sum+=min(t3,t1+t2+t4);
dfs(dep+);
sum-=min(t3,t1+t2+t4);
update(,r[dep],-);
}
int main(){
t=read();
while(t--){
m=;ans=1e9;
n=read();
FOR(i,,n) tp[i]=read();
FOR(i,,n) FOR(j,i+,n) if(tp[i]==tp[j]) l[++m]=i,r[m]=j;
dfs();
printf("%d\n",ans);
}
}

[清华集训2017]小 Y 和地铁(神奇思路,搜索,剪枝,树状数组)的更多相关文章

  1. 【清华集训】小Y和地铁

    图已挂,前往luogu 题目: 小 $\rm Y$ 是一个爱好旅行的 $\rm OIer$.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁.她发现每条地铁线路可以看成平面上的一条 ...

  2. 清华集训2017D2T1 小 Y 和地铁(metro)

    题目:https://www.luogu.org/problem/show?pid=P4005 题意:一条线段,给定n个点(n<=44)其中每个点可能对应另外一个点.如果一个点有对应点,那么就要 ...

  3. [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)

    显然有决策单调性,但由于逆序对不容易计算,考虑分治DP. solve(k,x,y,l,r)表示当前需要选k段,待更新的位置为[l,r],这些位置的可能决策点区间为[x,y].暴力计算出(l+r)/2的 ...

  4. 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)

    学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2 ...

  5. 2020牛客寒假算法基础集训营3 G.牛牛的Link Power II (树状数组维护前缀和)

    https://ac.nowcoder.com/acm/contest/3004/G 发现每个“1”对于它本身位置产生的影响贡献为0,对前面的“1”有产生贡献,对后面的"1"也产生 ...

  6. 19市赛 树状数组 第k个小的糖果

    int find_kth(int k) { , cnt = , i; ; i >= ; i--)/ { ans += ( << i); if (ans >= maxn|| cn ...

  7. [LOJ#2323]「清华集训 2017」小Y和地铁

    [LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...

  8. 【清华集训 2017】小Y的地铁 [模拟退火]

    小Y的地铁 Time Limit: 50 Sec  Memory Limit: 256 MB Description Input Output 对于每组输入数据,输出一行一个整数,表示除掉这 n 个换 ...

  9. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

随机推荐

  1. Leetcode练习题Two Sum

    1 Two Sum: Question Solution 知识点总结 常见方法 HashMap由value获得key Question: Given an array of integers, ret ...

  2. OC 字典dictionaryWithObjectsAndKeys报错

    字典dictionaryWithObjectsAndKeys crash,也没有控制台打印输出: 解决方案!! 1.检查dictionaryWithObjectsAndKeys中的object key ...

  3. fastadmin表单提交后却没有关闭弹窗

    点击操作按钮弹出窗口,操作完之后提交表单,无论操作成功还是失败,窗口都不关闭,操作之后出现一个笑脸,3秒后回到弹框刚打开的样子 而我们想要的是这个效果: 在jS那里给这个按钮绑定一个事件即可实现

  4. MySQL数据库中查询表的所有列名

    MySQL数据库中: 查询某个数据库中某个表的所有列名 SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ...

  5. 打开centos7图形化窗口

    1. yum groupinstall "X Window System" 2. export DISPLAY=172.16.4.240:0.0 3. yum -y install ...

  6. .net core中serilog的基本使用

    Serilog的基本使用 (一)  引言 (二)  导入包 (三)  配置 直接配置 配置文件配置 (四)  使用 (五)  结语 一 引言 作为一枚小白,来复习一下serilog的使用,如果有错误的 ...

  7. .net怎么使用Swagger

    目录导航 一.安装 二.配置 三.调用 四.错误记录 一.安装 新建一个没有身份验证的mvc项目 - SwaggerMvc5Demo,然后添加一个名为Remote(自定义)且包含基础读写(不想手写)的 ...

  8. Java操作zip-压缩和解压文件

    一.说明 rar格式的压缩包收费,java支持zip格式的压缩和解压 二.工具类 import java.io.*; import java.util.Enumeration; import java ...

  9. wsl下安装并运行Kafka

    0.引言 kafka是一个高性能分布式的MQ,今天我们就来玩玩 1.安装 wget http://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.3.0/kaf ...

  10. PHP开发之--安装composer

    composer是一个很好用的工具,类似于iOS开发项目中所用的cocopods,所以就想着安装下,过程也很简单: 1.切换到如下目录(在很多博客中都是这样写的,先安装,然后mv到/usr/local ...