首页 > 其他分享 >CF 2004 D. Colored Portals (*1600) 二分

CF 2004 D. Colored Portals (*1600) 二分

时间:2024-09-02 13:49:12浏览次数:10  
标签:Portals return Colored int 1600 st 传送门 const define

CF 2004 D. Colored Portals (*1600) 二分

题目链接

题意

有 \(n\) 座城市,编号从 \(1\) 到 \(n\) 。传送门一共有 \(4\) 种颜色,每个城市有两种不同颜色的传送门。若城市 \(i\) 和城市 \(j\) 有相同颜色的传送门。那么就可以花费 \(|i-j|\) 枚金币从城市 \(i\) 到城市 \(j\) 。

\(q\) 次询问,计算从 \(x\) 到 \(y\) 的最小花费。

思路

如果 \(x\) 和 \(y\) 有相容颜色的传送门,那么直接一步到达即可。否则,我们一定只需要到达一个中间点,然后再到达 \(y\) 即可。其他多走不会使结果更优。接下来考虑中间点如何选取。

那么只需要找到离 \(x\) 最近的即可。本题思维很简单,难点在于实现上,这里参考 cuppyy 大佬的写法,采用 \(2\) 进制表示状态,让代码清晰很多。

代码

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 1;

void Showball(){
   int n,q;
   cin>>n>>q;

   auto get=[&](char c){
     if(c=='B') return 0;
     if(c=='G') return 1;
     if(c=='R') return 2;
     if(c=='Y') return 3;
     return -1;
   };

   vector<int> st(n);
   vector<int> pos[16];
   vector<int> cand;
   for(int i=0;i<16;i++){
    if(__builtin_popcount(i)==2) cand.pb(i);
   }

   for(int i=0;i<n;i++){
      string s;
      cin>>s;
      for(auto c:s) st[i]|=1<<get(c);
      pos[st[i]].pb(i);
   }

   while(q--){
    int x,y;
    cin>>x>>y;
    if(x>y) swap(x,y);
    x--,y--;
    if(st[x]&st[y]) cout<<abs(x-y)<<endl;
    else{
      int ans=inf;
      for(auto u:cand){
        if((u&st[x])&&(u&st[y])){
          auto it=lower_bound(all(pos[u]),x);
          if(it!=pos[u].end()){
            ans=min(ans,abs(x-*it)+abs(y-*it));
          }
          if(it!=pos[u].begin()){
            it--;
            ans=min(ans,abs(x-*it)+abs(y-*it));
          }
        }
      }
      if(ans==inf) ans=-1;
      cout<<ans<<endl;
    }
   }

}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

标签:Portals,return,Colored,int,1600,st,传送门,const,define
From: https://www.cnblogs.com/showball/p/18392560

相关文章

  • CF1741F-Multi-ColoredSegments
    https://www.luogu.com.cn/problem/CF1741Fhttps://codeforces.com/contest/1741/problem/F参考:https://www.luogu.com.cn/article/bb54tb8m考虑用线段树维护每个点被几条线段覆盖,然后按照颜色分类,每次做其中一类,把同类颜色从线段树中去掉,然后先区间求和看有没有重叠,再左端点往......
  • D. Colored Portals
    https://codeforces.com/contest/2004/problem/D题意:给定n个字符串,每个字符串有2个字符,如果两个字符串中有相同的字符,则这两个位置互相到达,到达的代价为坐标距离。并且所有字符串的种类只有6种,给定m个查询,求两个地方到达的最小代价。思路:直接暴力,为6种字符串编号。如果查询位置......
  • D. Bicolored RBS
    原题链接题解真的是无中生有了从左到右遍历,维护两个颜色的嵌套深度(如果把左括号看成+1,右括号看成-1,那就是维护最大和)如果遇到右括号,给目前和较大的那个,如果遇到左括号,给较小的那个code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;voidsolve(){......
  • ColoredBox child 是 Scaffold 颜色失效
    在Flutter中,Scaffold小部件有自己的一组属性来管理其外观,包括背景颜色。当你将Scaffold作为ColoredBox的子小部件时,Scaffold的backgroundColor属性将覆盖ColoredBox的颜色。要解决这个问题,你可以直接设置Scaffold的backgroundColor属性,而不是使用ColoredBox。如......
  • MDS800-16-ASEMI整流模块800A 1600V
    编辑:llMDS800-16-ASEMI整流模块800A1600V型号:MDS800-16品牌:ASEMI封装:MDS批号:2024+分类:整流模块特性:整流模块、整流桥平均正向整流电流(Id):800A最大反向击穿电压(VRM):1600V恢复时间:>2000ns正向峰值电压:1.25V引脚数量:5芯片个数:6芯片尺寸:MILMDS800-16特点芯片与底板电气......
  • 【源码翻译之交互式对象包 AIS-AIS_ColoredShape.hxx文件 多颜色交互式对象
    类AIS_ColoredShape形状的呈现具有可自定义的子形状属性。此类可以将topods的子拓扑分别设置不同的颜色然后作为一个整体显示成员类型定义文档◆DataMapOfDrawerCompdtypedefNCollection_IndexedDataMap<Handle<AIS_ColoredDrawer>,TopoDS_Compound,TColStd_MapT......
  • CF1600~1700
    1731C\(a\)的质因子为奇数个,当且仅当\(a\)是平方数。我们考虑如何处理出有多少段的异或和为平方数。枚举平方数\(p\),枚举左端点\(l\),问题就变成了有多少\(r\)使得\(\oplus_l^ra_i=p\),处理出异或前缀和\(s_i=\oplus_1^ia_i\),查询有多少\(r\)使得\(s_r\opluss_{l-1}......
  • Oracle RAC备库启动service报"ORA-16000: database open for read-only access"
     OracleRAC备库启动service报"ORA-16000:databaseopenforread-onlyaccess" 还是2019.03.01那天的事了,当时在KFT客户就遇到这个问题,最近在规整一些资料看到当时待整理的文档,就抽空做做实验整理下。报错信息如下,ADG备库:[oracle@xxxprdoradb01~]$srvctlstartservic......
  • Colored Balls
    这道题目的模型倒是可以记住我们发现这个配对很像摩尔投票,所以考虑原数列是否有主元素对于一个集合,我们选出其中最大的\(a_i\),假设剩余的\(a\)的和小于等于\(a_i\)(此时有主元素),那么比较显而易见的就是最终会分出\(a_i\)个组;否则的话,我们考虑下界\(\lceil\frac{\suma}{2}\rcei......
  • D. Colored Balls
    D.ColoredBallsThereareballsof$n$differentcolors;thenumberofballsofthe$i$-thcoloris$a_i$.Theballscanbecombinedintogroups.Eachgroupshouldcontainatmost$2$balls,andnomorethan$1$ballofeachcolor.Considerall$2^n$set......