Link

A - Zebras

LINK

考虑一个子序列必定是以000开头,后面跟着若干个101010

然后考虑当前ai=1a_i=1ai​=1,暂时存下来,等下一个遇到的000去匹配

若ai=0a_i=0ai​=0,如果之前有111未被匹配,就匹配上去,然后接在刚好能接的某个子序列的后面

如果之前的111都被匹配了,只能以这个000开头新加一个子序列

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
char a[maxn];
vector<int>vec[maxn];
int n,q[maxn],top,now,id;
set<pair<int,int> >s;
int main()
{cin >> ( a+1 ); n = strlen( a+1 ); if( a[1]=='1' ){ cout << "-1"; return 0; }vec[++id].push_back( 1 ); s.insert( {1,id} );for(int i=2;i<=n;i++){if( a[i]=='1' ) q[++top] = i;else{if( now<top )//之前的1还没有被抵消{auto pi = s.lower_bound( { q[++now],0 } );if( pi==s.begin() ){ cout << -1; return 0; }pi--;pair<int,int>v = (*pi);vec[v.second].push_back( q[now] );vec[v.second].push_back( i );s.insert( { i,v.second } ); s.erase( pi );}else//新开一个子序列 vec[++id].push_back( i ), s.insert( { i,id } ); }}if( now!=top ) { cout << -1; return 0; }cout << id << endl;for(int i=1;i<=id;i++)    {cout << vec[i].size();for(auto v:vec[i] )    cout << " " << v;cout << endl;}
}

B. A Leapfrog in the Array

题意

nnn个数字,数字iii落在第2∗i+12*i+12∗i+1个格子的位置

每次操作会把当前最后一个数字移动到它左边第一个空格子处,重复操作直到[1,n][1,n][1,n]的格子内都有数字

现在有qqq次询问,每次问第kkk个格子中是什么数字

n<=1018,q<=2∗105n<=10^{18},q<=2*10^5n<=1018,q<=2∗105


对于一个数xxx,后面有n−xn-xn−x个数字,那么第一次移动会往左

(n−x)∗2+1(n-x)*2+1(n−x)∗2+1

然后考虑这个数字xxx上一次往左走了kkk步

说明直到下次xxx位移,右边共有k−1k-1k−1个数往左占据k−1k-1k−1个空位

所以自己只能占据左边的第kkk个空位,那么下次的位移量就是2∗k2*k2∗k

可以看到每次的位移量都是倍增的,设数字kkk共位移qqq次,最终到达xxx位置,有

(2∗k−1)−x=[(n−k)∗2+1]∗(2q−1)(2*k-1)-x=[(n-k)*2+1]*(2^q-1)(2∗k−1)−x=[(n−k)∗2+1]∗(2q−1)

化简下2∗n−x=[(n−k)∗2+1]∗2q2*n-x=[(n-k)*2+1]*2^q2∗n−x=[(n−k)∗2+1]∗2q

(n−k)∗2+1=2∗n−x2q(n-k)*2+1=\frac{2*n-x}{2^q}(n−k)∗2+1=2q2∗n−x​

观察右边式子的含义,其中qqq一定是取到最大的,且需要满足整除关系

相当于抹掉2∗n−x2*n-x2∗n−x的低位所有零,实现上可以使用lowbit(2∗n−x)lowbit(2*n-x)lowbit(2∗n−x)得到最低位除一下就好了

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 3e5+10;
int t,n,x;
int lowbit(int x){ return x&(-x); }
signed main()
{cin >> n >> t;while( t-- ){cin >> x;int right = ( 2*n-x )/ lowbit(2*n-x);cout <<  -( ( right-1 )/2-n ) << endl;}
}

C.Data Center Maintenance

题意

某土豪公司建立了n个数据中心,把m份资料每份在其中的两个数据中心备份。

每个数据中心在一天h个小时当中有一个小时需要维护,此时不提供资料下载服务。

现在土豪公司想要将其中若干个数据中心的维护时间向后推迟一小时,并要求一天中任意时刻每份资料都可以被下载,问最少选取多少个数据中心维护。

就是不允许两个数据中心的维护时间相同


一张无向图,满足相邻节点的值不相同

现在要使至少一个点的值加一,问至少选择几个点能满足条件

D.Curfew

如果一个宿舍不能有大于等于bbb个人,那我们干脆让它一个人都没有

这样多余的人可以去填补后面的宿舍

这样一来,满足条件的宿舍都会集中在中间的部分比较优秀

我们就可以二分一个fff表示让两端长fff的宿舍一个人都没有,判断中间部分是否都能大于等于bbb人即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 3e5+10;
int n,d,b,a[maxn],c[maxn];
bool isok(int f)
{int dis = d*f, p0 = 1, p1 = n, z = (n+1)>>1;for(int i=f+1;i<=z;i++){dis += d;int s = b;while( a[p0]<s )    s -= a[p0++];a[p0] -= s;if( p0-i>dis )  return 0;if( i==z && (n&1) )    break;s = b;while( a[p1]<s )    s -= a[p1--];a[p1] -= s;if( (n-i+1)-p1>dis )    return 0;}return 1;
}
signed main()
{cin >> n >> d >> b;for(int i=1;i<=n;i++)   cin >> a[i], c[i] = a[i];int l = 0, r = n+1, ans = 0;while( r>=l ){int mid = l+r>>1;memcpy( a,c,sizeof c );if( isok(mid) ) ans = mid, r = mid-1;else    l = mid+1;}cout << ans;
}

E.Binary Cards

考虑2a2^a2a最多被选择一次.如果选择两次2a,2a2^a,2^a2a,2a,明显是不如选2a,2a+12^a,2^{a+1}2a,2a+1优秀

那么知道这个以后,就会发现如果选择2a2^a2a,就不会再选2−a2^{-a}2−a

因为2a,−2a2^a,-2^{a}2a,−2a肯定是不如2a,−2a+12^{a},-2^{a+1}2a,−2a+1优秀的

这样我们就能得到对于一个aaa,要么选择2a2^a2a,要么选择2−a2^{-a}2−a

我们从a=0a=0a=0的情况开始考虑

如果存在数是奇数,显然202^020和2−12^{-1}2−1必选其一

如果都是偶数,那么没必要选,把所有数除以二进入一个相同的子问题

但是每次扫描判断是否有奇数,单次就是O(n)O(n)O(n)的,而且还有那么多分治节点

但是注意到每次值域减小一半,意味着会有很多数字重复,那就排序去重可以降低复杂度

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
int n,a[maxn];
vector<int>nm;
vector<int> solve(int mx = 0)
{if( mx>19 ) return vector<int>(0);int ok = 0;for( int &x:nm )    if( x&1 ) { ok = 1; break; }if( !ok )//不用加数字这一位{for( int &x:nm )    x >>= 1;return solve( mx+1 );}vector<int>temp = nm;for( int&x:nm ) if( x & 1 ) x = ( x + 1 ) >> 1; else x >>= 1;sort( nm.begin(),nm.end() );nm.erase( unique( nm.begin(),nm.end() ),nm.end() );vector<int>vec1 = solve( mx+1 );nm = temp;for(int&x:nm )  if( x & 1 ) x = ( x - 1 >> 1 ); else x >>= 1;nm.erase( unique( nm.begin(),nm.end() ),nm.end() );vector<int>vec2 = solve( mx+1 );vec1.push_back( -(1<<mx) ); vec2.push_back( 1<<mx );return vec1.size()<vec2.size()?vec1:vec2;
}
int main()
{cin >> n;for(int i=1;i<=n;i++)   cin >> a[i],nm.push_back( a[i] );vector<int> ans = solve();cout << ans.size() << endl;for(int v:ans ) cout << v << " ";
}

Codeforces Round #469 (Div. 1 A-E)相关推荐

  1. Codeforces Round #469 (Div. 2) A/B

    A题 http://codeforces.com/contest/950/problem/A 题意:给定三个数l,r,a,要我们求min(l+a1,r+a2)的最大值再乘以2:a1+a2<=a. ...

  2. Codeforces Round #469 (Div. 2)

    开学啦! A. Left-handers, Right-handers and Ambidexters time limit per test 1 second memory limit per te ...

  3. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  4. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  5. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  6. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  7. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  8. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  9. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  10. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

最新文章

  1. poj1511(SPFA算法)
  2. layui根据name获取对象_JavaScript对象 - 初识
  3. lazada选品,东南亚韩潮周边产品爆卖,单日销售额5万美金!
  4. Flutter 中获取地理位置[Flutter专题61]
  5. 本地代码推送到github仓库
  6. oracle 填入编号,sql – 带填充模式的Oracle to_char格式编号(FM0000)
  7. 搭建本地的git仓库
  8. mysql-备份和还原(普通还原和binlog还原)
  9. bat执行cmd命令_kettle定时任务pan.bat和kitchen.bat
  10. 偶数支足球队进行单循环比赛,按照指定算法打印每轮的对阵形势
  11. 机器学习各种分类算法比较
  12. Android TextView 字体颜色渐变
  13. python自学课堂_python自学——列表
  14. 在win10上通过usb连接树莓派
  15. Transferability vs. Discriminability: Batch Spectral Penalization for Adversarial Domain Adaptation
  16. Windows下swig安装与配置
  17. 限制百度地图拖动范围限制,当超如范围时自动返回
  18. 百度统计php,百度统计
  19. 投稿时要求注册ORCID,这张学术界身份证到底有哪些用处?
  20. java清空文件夹_java 删除文件夹中的所有内容而不删除文件夹本身的实例

热门文章

  1. Ribbon界面图标可以直接用PNG做透明图标
  2. Nagios如何配置告警短信?
  3. 【Windows】网线直连实现两台电脑共享文件夹
  4. CityEngine2016-学习笔记(2)Shape Operations
  5. ceph 写流程(1)
  6. Android日历控件
  7. cesium粒子特效
  8. 用js判断图片地址是否有效
  9. 红帽企业linux8,红帽发布企业版 Linux(RHEL) 8.0
  10. 专访AWR市场副总裁Sherry Hess:全面发力 深耕中国市场