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

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

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

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

       

然后大力枚举每个换乘站的情况。同时判断交点。$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$。

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn=;
  5. #define FOR(i,a,b) for(int i=(a);i<=(b);i++)
  6. #define ROF(i,a,b) for(int i=(a);i>=(b);i--)
  7. #define MEM(x,v) memset(x,v,sizeof(x))
  8. inline int read(){
  9. int x=,f=;char ch=getchar();
  10. while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
  11. while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
  12. return f?-x:x;
  13. }
  14. int t,n,m,tp[maxn],l[maxn],r[maxn],ans,sum,b[][maxn];
  15. inline void update(int id,int p,int v){
  16. while(p<=n){
  17. b[id][p]+=v;
  18. p+=p&-p;
  19. }
  20. }
  21. inline int query(int id,int p){
  22. int s=;
  23. while(p){
  24. s+=b[id][p];
  25. p-=p&-p;
  26. }
  27. return s;
  28. }
  29. inline int query(int id,int l,int r){return query(id,r)-query(id,l-);}
  30. void dfs(int dep){
  31. if(sum>ans) return;
  32. if(dep>m) return void(ans=sum);
  33. int t1=query(,l[dep],r[dep]),t2=query(,r[dep],n),t3=query(,l[dep],r[dep]),t4=query(,r[dep],n);
  34. update(,r[dep],);
  35. sum+=min(t1,t2+t3+t4);
  36. dfs(dep+);
  37. sum-=min(t1,t2+t3+t4);
  38. update(,r[dep],-);
  39. update(,r[dep],);
  40. sum+=min(t3,t1+t2+t4);
  41. dfs(dep+);
  42. sum-=min(t3,t1+t2+t4);
  43. update(,r[dep],-);
  44. }
  45. int main(){
  46. t=read();
  47. while(t--){
  48. m=;ans=1e9;
  49. n=read();
  50. FOR(i,,n) tp[i]=read();
  51. FOR(i,,n) FOR(j,i+,n) if(tp[i]==tp[j]) l[++m]=i,r[m]=j;
  52. dfs();
  53. printf("%d\n",ans);
  54. }
  55. }

[清华集训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. PCL学习之:将超声数据按照PCL点云方式发布出去

    前言:基于2D激光雷达的机器人,想让它跑自动导航,众所周知有2个比较明显的缺陷,1,那就是普通的激光雷达无法对玻璃或是镜面物体有反映; 2,机器人避障时只能对某一个平面的物体有反映,超过或者低于这个平 ...

  2. Algorithm: CRT、EX-CRT & Lucas、Ex-Lucas

    中国剩余定理 中国剩余定理,Chinese Remainder Theorem,又称孙子定理,给出了一元线性同余方程组的有解判定条件,并用构造法给出了通解的具体形式. \[ \begin{aligne ...

  3. tf.ConfigProto()

    tf.ConfigProto一般用在创建session的时候用来对session进行参数配置 with tf.Session(config=tf.ConfigProto(...)...) tf.Con ...

  4. HDU-1719 Friend 数学推导

    Friend HDU - 1719 Friend number are defined recursively as follows. (1) numbers 1 and 2 are friend n ...

  5. [新概念英语] Lesson 12 : GOODBYE AND GOOD LUCK

    Lesson 12 : GOODBYE AND GOOD LUCK New words and expressions : luck (n) 运气 例句 You're not having much ...

  6. SQL Server 通过“with as”方法查询树型结构

    一.with as 公用表表达式 类似VIEW,但是不并没有创建对象,WITH  AS 公用表表达式不创建对象,只能被后随的SELECT语句,其作用: 1. 实现递归查询(树形结构) 2. 可以在一个 ...

  7. redis的3种过期键删除策略

    Redis的过期键的过期时间都保存在过期字典中,过期键的删除策略有三种,分别是定时删除.惰性删除和定期删除. 定时删除 定时删除策略,是指在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时 ...

  8. WPF 通过Win32SDK修改窗口样式

    使用函数为 SetWindowLong GetWindowLong 注册函数 [DllImport("user32.dll", EntryPoint = "GetWind ...

  9. 云原生生态周报 Vol. 15 | K8s 安全审计报告发布

    业界要闻 CNCF 公布 Kubernetes 的安全审计报告 报告收集了社区对 Kubernetes.CoreDNS.Envoy.Prometheus 等项目的安全问题反馈,包含从一般弱点到关键漏洞 ...

  10. 转 OpenCV Mat 数据读写

    转:https://blog.csdn.net/u011520181/article/details/83831866 1.创建 Mat 对象: // 创建一个 320x240 的 8 位无符号型 4 ...