558c题意:给出若干数,可对数进行操作(乘2或者除以2)。求最少的操作使得所有的数都相等。

以二进制的角度看这些数和操作,目标就是使得最后的二进制相等,也就是每个位置对应的数都相等,反观操作,乘上2相当于二进制左移动而且二进制中的1的个数不会减少,而除以2相当与二进制右移但是会造成二进制中的1的个数减少。。
那么,我们找出所有数的公共前缀,从第一个不为零的数开始。
如(001010)、(101000)、(001011),公共前缀就是101,那么将每个二进制中的101之后存在的1的往后移位消除多余的1(除法),知道消除多余的1即可。经过第一步之后生下来的二进制为:1010,101000,101前两个都不需要移动。没有没有多余的1
那么经过这一步之后每个二进制都是xxx101xxx…..的形式,那么接下来把所有的二进制101对齐即可。 how.
.将每个二进制的长度视为x轴上的点,其实就是找出一个点使得这个点到所有二进制代表的点的距离相等~其实就是找中位数。
这样就解决了

#include <map>
#include <set>
#include <queue>
#include <stack>
#include <math.h>
#include <vector>
#include <cstdio>
#include <string>
#include<string.h>
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
#define exp 1e-8
#define INF 0x3f3f3f3f
#define ll long long
#define mm(a,b) memset(a,b,sizeof(a));
#define for1(a,b) for(int a=1;a<=b;a++)//1---(b)
#define rep(a,b,c) for(int a=b;a<=c;a++)//b---c
void bug(string st="bug")
{cout<<st<<endl;}
template<typename __ll>
inline void READ(__ll &m){__ll x=0,f=1;char ch=getchar();while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}m=x*f;
}
template<typename __ll>
inline void read(__ll &m){READ(m);}
template<typename __ll>
inline void read(__ll &m,__ll &a){READ(m);READ(a);}
template<typename __ll>
inline void read(__ll &m,__ll &a,__ll &b){READ(m);READ(a);READ(b);}
int num[100010];
int two[100010][22];
int idx[100010];
int cnt[100010];
int main()
{int n;read(n);for1(i,n)read(num[i]);int minn=0;for1(i,n)  //找二进制{int tmp=num[i];cnt[i]=0;while(tmp){two[i][++cnt[i]]=tmp%2;tmp/=2;}}int ccc=0;for(int j=0;j<=20;j++)  //找出前缀中一共有多少个1,,,不需要看0{int flag=1;if(cnt[1]-j<1)flag=0;if(flag==0)break;int tmp=two[1][cnt[1]-j];for(int i=2;i<=n;i++){if(cnt[i]-j<1){flag=0;break;}if(two[i][cnt[i]-j]!=tmp)flag=0;}if(flag==0)break;minn+=tmp;if(j==20){cout<<0<<endl;return 0;}}int ans=0;for1(i,n){int tmp=minn;int first=-1;for(int j=20;j>=1;j--){if(two[i][j]==1&&first==-1)first=j;tmp-=two[i][j];if(tmp==-1)  //将多余的1移除{ans+=j;  //需要移动这么多步idx[i]=first-j;break;}}if(tmp==0)idx[i]=first;}sort(idx+1,idx+1+n);int mid=idx[n/2+1];  //找出中位数for1(i,n) ans+=abs(idx[i]-mid);cout<<ans<<endl;
}

558d题意:给出若干数据,看数据是否矛盾,或者是否有多个出口。
数据有两种类型,一个是出口的若干区间,一个不是出口若干区间。
那么首先对是出口的若干区间操作合并求交集
如果合并不出一个合理的区间,那么Game cheated!。
如果有一个合理的区间,exit肯定在这个区间,设为区间A。
但还要根据第二种数据操作。
对不是出口的若干区间操作合并求并集
那么exit一定存在与这个并集的补集里,补集设为B,总集合为子叶
那么如果A与B没有交集,那么Game cheated!。
如果A与B有交集,但有若干个,Data not sufficient!
否则,只有一个exit

#include <algorithm>
#include <algorithm>
#include <iostream>
#include<string.h>
#include <fstream>
#include <math.h>
#include <vector>
#include <cstdio>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define exp 1e-8
#define fi first
#define se second
#define ll long long
#define INF 0x3f3f3f3f
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define bug printf("bug_here\n")
#define all(a) a.begin(),a.end()
#define mm(a,b) memset(a,b,sizeof(a));
#define for1(a,b) for(int a=1;a<=b;a++)//1---(b)
#define rep(a,b,c) for(int a=b;a<=c;a++)//b---c
using namespace std;
template<typename __ll> inline void READ(__ll &m){__ll x=0,f=1;char ch=getchar();while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}m=x*f;}
template<typename __ll>inline void read(__ll &m){READ(m);}
template<typename __ll>inline void read(__ll &m,__ll &a){READ(m);READ(a);}
template<typename __ll>inline void read(__ll &m,__ll &a,__ll &b){READ(m);READ(a);READ(b);}
template<typename __ll>inline void read(__ll &m,__ll &a,__ll &b,__ll &c){READ(m);READ(a);READ(b);READ(c);}
template < class T > T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template < class T > T lcm(T a, T b) { return a / gcd(a, b) * b; }
template < class T > inline void rmin(T &a, const T &b) { if(a > b) a = b; }
template < class T > inline void rmax(T &a, const T &b) { if(a < b) a = b; }
template < class T > T pow(T a, T b) { T r = 1; while(b > 0) { if(b & 1) r = r * a; a = a * a; b /= 2; } return r; }
template < class T > T pow(T a, T b, T mod) { T r = 1; while(b > 0) { if(b & 1) r = r * a % mod; a = a * a % mod; b /= 2; } return r; }
vector<pair<ll,int> >vec;
int main()
{int h,q;read(h,q);ll L=1,R;for1(i,h-1)L*=2LL;R=L*2LL-1;ll ansl=L,ansr=R;while(q--){int i,ans;ll l,r;read(i),read(l,r),read(ans);int ret=h-i;for1(i,ret)l*=2LL;r++;for1(i,ret)r*=2LL;r--;if(ans==1){rmax(ansl,l);rmin(ansr,r);}else vec.pb(mp(l,-1)),vec.pb(mp(r,1));}if(ansl>ansr){printf("Game cheated!\n");return 0;}vec.pb(mp(L-1,-1));vec.pb(mp(L-1,1));vec.pb(mp(R+1,-1));vec.pb(mp(R+1,1));sort(all(vec));int cnt=0;ll val=-1;bool many=0;for(int i=0;i<(int)vec.size()-1;i++){cnt+=vec[i].se;if(cnt==0){ll nl=vec[i].fi+1,nr=vec[i+1].fi-1;   //找出补集rmax(nl,ansl),rmin(nr,ansr);if(nl<nr)  //假设这个地方是有的many=1,val=nl;else if(nl==nr&&val!=-1)many=1,val=nl;else if(nl==nr&&val==-1)val=nl;//if(nl>nr) 假设没有~~~~}}if (val == -1)printf("Game cheated!\n");else if (many)printf("Data not sufficient!\n");elsecout << val << endl;
}

558e
建立26个线段树,分别对应a–z 26个字母
每次修改[l,r]区间,则先通过26课线段树查询求出这个区间内的a–z分别有多少个。然后将26课线段树内的这一区间和置为0.最后根据顺序重新给26课线段树的这一区间赋值~。
这道题觉得和557c特别相像,数组大小为200,代价特别小,就好比这里的26棵线段树。200、26都很小。。乘入复杂度基本可以忽略。。这一小部分可以通过暴力求出来

#include <algorithm>
#include <algorithm>
#include <iostream>
#include<string.h>
#include <fstream>
#include <math.h>
#include <vector>
#include <cstdio>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define exp 1e-8
#define fi first
#define se second
#define ll long long
#define INF 0x3f3f3f3f
#define lson l,mid,rt<<1
#define pb(a) push_back(a)
#define rson mid+1,r,rt<<1|1
#define mp(a,b) make_pair(a,b)
#define all(a) a.begin(),a.end()
#define mm(a,b) memset(a,b,sizeof(a));
#define for1(a,b) for(int a=1;a<=b;a++)//1---(b)
#define rep(a,b,c) for(int a=b;a<=c;a++)//b---c
#define repp(a,b,c)for(int a=b;a>=c;a--)///
using namespace std;
void bug(string m="here"){cout<<m<<endl;}
template<typename __ll> inline void READ(__ll &m){__ll x=0,f=1;char ch=getchar();while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}m=x*f;}
template<typename __ll>inline void read(__ll &m){READ(m);}
template<typename __ll>inline void read(__ll &m,__ll &a){READ(m);READ(a);}
template<typename __ll>inline void read(__ll &m,__ll &a,__ll &b){READ(m);READ(a);READ(b);}
template<typename __ll>inline void read(__ll &m,__ll &a,__ll &b,__ll &c){READ(m);READ(a);READ(b);READ(c);}
template < class T > T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template < class T > T lcm(T a, T b) { return a / gcd(a, b) * b; }
template < class T > inline void rmin(T &a, const T &b) { if(a > b) a = b; }
template < class T > inline void rmax(T &a, const T &b) { if(a < b) a = b; }
template < class T > T pow(T a, T b) { T r = 1; while(b > 0) { if(b & 1) r = r * a; a = a * a; b /= 2; } return r; }
template < class T > T pow(T a, T b, T mod) { T r = 1; while(b > 0) { if(b & 1) r = r * a % mod; a = a * a % mod; b /= 2; } return r; }
const int maxn=100010;
struct Seg_TREE
{int sum[maxn<<2],cov[maxn<<2];void push_down(int l,int r,int rt){if(cov[rt]!=-1){int mid=l+r>>1;cov[rt<<1]=cov[rt<<1|1]=cov[rt];sum[rt<<1|1]=(r-mid)*cov[rt];sum[rt<<1]=(mid-l+1)*cov[rt];cov[rt]=-1;}}void push_up(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){sum[rt]=0;cov[rt]=-1;int mid=l+r>>1;if(l==r)return ;build(lson);build(rson);}void update(int l,int r,int rt,int L,int R,int c){if(L<=l&&r<=R){cov[rt]=c;sum[rt]=(r-l+1)*c;return ;}push_down(l,r,rt);int mid=l+r>>1;if(L<=mid) update(lson,L,R,c);if(R>mid)update(rson,L,R,c);push_up(rt);}int query(int l,int r,int rt,int L,int R){if(L<=l&&r<=R)return sum[rt];push_down(l,r,rt);int mid=l+r>>1;int ret=0;if(L<=mid) ret+=query(lson,L,R);if(R>mid)ret+=query(rson,L,R);return ret;}
}dat[26];
int cnt[26];
int main()
{int n,m;read(n,m);rep(i,0,25)dat[i].build(1,n,1);  //建树for1(i,n){char ch;scanf("%c",&ch);dat[ch-'a'].update(1,n,1,i,i,1);  //初始化数,ch出现在第i个位置}while(m--){int a,b,c;read(a,b,c);mm(cnt,0);rep(i,0,25){cnt[i]+=dat[i].query(1,n,1,a,b);  //查询dat[i].update(1,n,1,a,b,0);  //置零}if(c==0){int now=a;repp(i,25,0)if(cnt[i]){dat[i].update(1,n,1,now,now+cnt[i]-1,1);  //恢复now+=cnt[i];}}else{int now=a;rep(i,0,25)if(cnt[i]){ dat[i].update(1,n,1,now,now+cnt[i]-1,1);now+=cnt[i];}}}for1(i,n)rep(j,0,25)if(dat[j].query(1,n,1,i,i)){printf("%c",char(j+'a'));break;}return 0;
}

codeforces 558c558d558e相关推荐

  1. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  2. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  3. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  4. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...

  5. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...

    题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...

  6. CodeForces 595A

    题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...

  7. codeforces A. Jeff and Digits 解题报告

    题目链接:http://codeforces.com/problemset/problem/352/A 题目意思:给定一个只有0或5组成的序列,你要重新编排这个序列(当然你可以不取尽这些数字),使得这 ...

  8. Codeforces Round #506 (Div. 3)

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

  9. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

最新文章

  1. Keypress - 捕获键盘输入的JavaScript库
  2. 写给工程师的十条精进原则
  3. 简要叙述计算机软件系统的组成,【计组第一章+答案】概论
  4. python数据库操作pymysql
  5. 述职答辩提问环节一般可以问些什么_每个优秀的人都会被看到述职晋升季buff大推送...
  6. npm工具运行Vue项目
  7. github 分支 合并
  8. Swagger写的接口的输入参数是对象的处理方法!通俗易懂(图文并茂), 小白与大佬之间的对话!
  9. Windows 10 蓝牙管理页面“添加蓝牙或其他设备“选项点击无响应的解决方案
  10. sqlServer相关
  11. XML学习之做过的实验——实验二
  12. vue—实现组织架构图(vue-org-tree插件)——技能提升
  13. C语言 第六章 指针 重点 典型题
  14. 2021年中国数据安全行业发展现状及未来发展前景分析:数据安全市场快速增长[图]
  15. 解决在ceph对象网关中使用s3fs报错“unable to access MOUNTPOINT /s3: Transport endpoint is not connected”
  16. 网络科学引论和导论网络传播章节阅读
  17. 初等数论知识(附证明)
  18. 计算机为何用二进制表示信息的最小单位,计算机中表示信息的最小单位是什么?...
  19. 李永乐复习全书概率论与数理统计 第七、八章 参数估计及假设检验
  20. 四种两轮差速驱动机器人底盘特性分析

热门文章

  1. sqlite3学习笔记
  2. 公安情报收集工作的新战场——互联网
  3. iOS开发-点击屏幕,键盘消失的极佳方法。
  4. egg extend ts_从 Egg.js 到 NestJS,爱码客后端选型之路
  5. 抢占智能家居市场,海尔迎来多个竞争对手
  6. 我的世界java版指令保留物品栏_我的世界或将在模式切换中保存物品栏
  7. Development模式是如何运作的?
  8. android微信支付问题总结
  9. Trunk端口的配置
  10. Java安卓如何添加悬浮窗_Android桌面悬浮窗效果实现