首页 > 其他分享 >AtCoder Beginner Contest 264(D-E)

AtCoder Beginner Contest 264(D-E)

时间:2022-08-21 19:12:30浏览次数:88  
标签:AtCoder const Beginner fx fy ll flag 264 sum

D - "redocta".swap(i,i+1)

题意: 给一个字符串,每次交换相邻两个字符,问最少多少次变成"atcoder"

题解: 从左到右依次模拟

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=2e5+5;
const ll inf=1e18;
const ll mod=998244353;
ll a[N];
ll minn[N];
signed main(){
   ios::sync_with_stdio(false);
   cin.tie(0);cout.tie(0);
   string s;cin>>s;
   string p="atcoder";
   ll ans=0;
   for(ll i=0;i<=6;i++){
      if(s[i]==p[i]) continue;
      ll j=i;
      while(s[j]!=p[i]){
         j++;
      }
      ans+=j-i;
      for(ll z=j;z>=i;z--) s[z]=s[z-1];
      s[i]=p[i];
   }
   cout<<ans;
}

E - Blackout 2

题意: 给出N个城市,M个发电厂,K个电线,然后Q次操作 ,每次剪断一根电线,问每次操作之后,有几个城市是有点的,只有到一个城市与发电厂是连通的,才是有电的。

题解: 我们可以把这个问题换位思考。

  • 开始有K根电线,然后每次剪断一根,问剪断之后有多少城市有电
  • 开始有K-Q根电线,每次加上一根,问加上之后有多少城市有电

我们可以发现,上面这两个问题他们最后得出的答案刚好是相反的,所以,我们可以通过第二种方法求出答案然后逆序输出,明显第二种方法简单。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=5e5+5;
const ll inf=1e18;
const ll mod=998244353;
ll pre[N];
pll q[N];
ll sum[N],flag[N];   
ll p[N],vis[N],vp[N];
ll find(ll x){
   if(pre[x]==x) return x;
   return pre[x]=find(pre[x]);
}
signed main(){
   ios::sync_with_stdio(false);
   cin.tie(0);cout.tie(0);
   ll n,m,k;cin>>n>>m>>k;
   for(ll i=1;i<=k;i++){
      cin>>q[i].first>>q[i].second;
   }   
   ll t;cin>>t;  
   for(ll i=1;i<=t;i++){ cin>>p[i];vis[p[i]]=1;}//记录那些电线是剪断的
   for(ll i=1;i<=n+m;i++) pre[i]=i;
   for(ll i=1;i<=k;i++){
      if(vis[i]) continue;//遍历开始没有剪断的电线
      ll fx=find(q[i].first);
      ll fy=find(q[i].second);
      pre[fx]=fy;
   }
   for(ll i=1;i<=n;i++){
      ll fx=find(i);
      sum[fx]++;
   }
   ll ans=0;
   for(ll i=n+1;i<=m+n;i++){//求出开始的时候有多少城市有电
      ll fx=find(i);
      ans+=(flag[fx]==0?sum[fx]:0);
      flag[fx]=1;
   }
   stack<ll> lm;
   for(ll i=t;i>=1;i--){
      lm.push(ans);
      ll fx=find(q[p[i]].first);
      ll fy=find(q[p[i]].second);
      if(fx==fy) continue;//如果是连通的,就没必要处理
      if(!flag[fx]&&flag[fy]){//如果第一个是没电,第二个有电,就答案加上没电的
         flag[fx]=1;ans+=sum[fx];
      }
      else if(flag[fx]&&!flag[fy]){//同理
         flag[fy]=1;ans+=sum[fy];
      }
      else if(!flag[fx]&&!flag[fy]){//如果都没电,就让他们合并
         sum[fy]+=sum[fx];
      }
      pre[fx]=fy;
   }
   while(lm.size()){
      cout<<lm.top()<<endl;//逆序输出
      lm.pop();
   }
}

 

标签:AtCoder,const,Beginner,fx,fy,ll,flag,264,sum
From: https://www.cnblogs.com/hhzp/p/16610581.html

相关文章

  • [题解] Atcoder Regular Contest ARC 146 A B C D 题解
    点我看题A-ThreeCards先把所有数按位数从多到少排序,答案的位数一定等于位数最多的三个数的位数之和\(tot\)。对于每个i,把有i位的数排序,并记录每个i的排序结果。最后......
  • 「atcoder - agc054c」Roughly Sorted
    link。高妙题,我只会到构造下界那一步……构造下界比较容易,只需要注意到交换一次最多让序列向合法迫近一步即可。则答案下界为\(\sum_i\max\{\left(\sum_{j<i}[p'_j......
  • leetcode264-丑数 II
    丑数II优先队列维护一个优先队列。先取出最小的数字,将其乘以2、3、5,如果发现没有重复的话就装入优先队列中,需要用到set进行去重。classSolution{publicintn......
  • AtCoder 比赛记录
    ARC140打得很烂。Rank590,Performance1696。D-OnetoOne每个点都有恰好一个出边,所以这是一个外向基环森林。因此连通块数就等于环的个数,我们只需要求出所有方案中......
  • windows ffmpeg2.8 动态库和静态库32位编译(hx264,opus)
    环境所有库都是在msys中进行32位编译msys环境安装修改msys程序目录的msys2_shell.cmd的remsetMSYS2_PATH_TYPE=inherit改为setMSYS2_PATH_TYPE=inherit......
  • C++ beginner(2)- variable
    initializationintx{};//xisfilledwithzeroes,sox==0intx{123};intx(123);inta,b=123,c{},d{456},e(789);int*x,y,z;==int*x;inty;int......
  • AtCoder Beginner Contest 258
    A-When?问21:00后的第k分钟的时间#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+5;intn,a[N],cnt,k;int32_tmain(){ intn,h=21......
  • abc264 E
    题目链接:clickhereSolution:首先考虑维护连通块,但是在删边的条件下进行维护连通块显然比较复杂如果不是删边,而是增添边,那么连通块的维护难度将大大减少,那么我们如何从......
  • Atcoder ABC169
    A  直接输出\(a×b\)即可inta,b;std::cin>>a>>b;std::cout<<a*b<<"\n";B  将所有的\(N\)个数乘起来看是不是大于\(10^{18}\),很明......
  • ffmpeg cuda加速 h264->hevc(h265) 缩小存储空间
    参考的原文链接https://www.cnblogs.com/Hakurei-Reimu-Zh/p/14999269.html1.安装cuda这里我只安装最新版驱动也是可以的没有刻意去安装cuda2.下载编译好的全版本ffmpe......