1665A - GCD vs LCM

1665B - Array Cloning Technique

1665C - Tree Infection(贪心)(模拟)

最小次数,使所有点感染。每一秒钟,1)可以感染一个新的节点,2)兄弟群(拥有同一个父亲的点)会新增一位被感染(-> 注意这里,即使这个兄弟群中主动感染了2个以上,一秒也只能多一个新感染的)

首先统计兄弟群,兄弟群大小为sum[i],i为他们共同的父亲。接下来就是这串数字进行处理。我想的是先去感染大的兄弟群,让感染人在内部扩散。

但是我忽略了一点,如果每个兄弟群都感染完了一个之后,但是全部人还没被感染完,这里有一段时间差,可以继续去感染新的点,减少一点总时间。

要处理这段时间也很容易,哪个兄弟群未感染人数最多,给上一个感染就好,也是一个贪心做法。

如果题目看清的话,应该思路能顺利的想到这里。(可惜我不时会想当然,理解错题目)

这题还有一个学到的点,就是由于∑sum[i]=n\sum sum[i]=n∑sum[i]=n的,所以可以一个人一个人地模拟被感染的过程,时间复杂度O(N)O(N)O(N)。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;int sum[N];bool cmp(int x,int y)
{return x>y;
}int main()
{int QwQ;cin>>QwQ;while(QwQ--){int n;cin>>n;sum[n+1]=1;for(int i=2;i<=n;i++){int x;cin>>x;sum[x]++;}sort(sum+1,sum+n+2,cmp);int m;for(m=1;;m++){if(sum[m]==0){m--;break;}}for(int i=1;i<=m;i++){sum[i]=sum[i]-m+i-1;}sort(sum+1,sum+m+1,cmp);int mx=sum[1]>0?1:0,ans=m;while(1)//for(int i=1;i<=m;i++)  debug{if(sum[mx]==0) break;//if(mx==0) break;  debugsum[mx]--;mx=0;ans++;for(int j=1;j<=m;j++){if(sum[j]<=0) break;sum[j]--;if(sum[mx]<=sum[j]) mx=j;}}cout << ans << endl;for(int i=1;i<=n;i++) sum[i]=0;}
}

1665D - GCD Guess(数学)(交互)

有最多30次猜的机会,提问(a,b)(a,b)(a,b)会回答gcd⁡(x+a,x+b)\gcd(x+a, x+b)gcd(x+a,x+b),猜一猜x是多少?

OI生涯第一次碰到交互题 :): ):)

解法一很有意思,『原来是用这种方法解决的吗』。

显然,如果m>xm>xm>x,那么有x%m=xx\% m= xx%m=x,那答案就出来了。如果我们可以从小做起,先判断x%2=?x \% 2=?x%2=?,再判断x%22=?x\%2^2=?x%22=?,……,最后直到x%230=?x\%2^{30}=?x%230=?结果不就出来了吗。

是啊,如果有模运算固然简单,但是题目给的是gcdgcdgcd。所以下面我们想想怎么用gcd实现对2n2^n2n取模。

第一目标是解决 %2\%2%2 。等价于判断奇偶数。可以尝试一下,发现gcd⁡(x+2,x+4)=2\gcd(x+2,x+4)=2gcd(x+2,x+4)=2则x为偶数,否则为奇数。构造的思路是,让x+ax+ax+a和x+bx+bx+b都拥有2这个因子。

第二目标是解决 %4\%4%4 。不难想到,(接上面)应该讨论%4=0还是%4=2的情况,想检验第一种情况,可以构造gcd⁡(x+4,x+8)\gcd(x+4,x+8)gcd(x+4,x+8)。如果gcd是4就是%4=0的情况,如果gcd是2,就是第二种情况。(这种情况下只会有2和4哦,可以自己举例试一试)

把上述过程代数化,就可以得到CF题解上的式子

gcd⁡(x+2k−r,2k+1)=gcd⁡(x+2k−r,x+2k−r+2k+1)\gcd(x + 2^k - r, 2^{k + 1}) = \gcd(x + 2^k - r, x + 2^k - r + 2^{k + 1})gcd(x+2k−r,2k+1)=gcd(x+2k−r,x+2k−r+2k+1)If gcd⁡=2k+1\gcd = 2^{k + 1}gcd=2k+1, then xmod2k+1=r+2k−1x \bmod 2^{k + 1} = r + 2^{k - 1}xmod2k+1=r+2k−1 else xmod2k+1=rx\mod2k+1=rxmod2k+1=r. Using this algorithm we will find xmod230x\bmod2^{30}xmod230 which is just xxx. It takes exactly 303030 queries.

然后题目还卡了一下,如果用上面的方法会产生大于1e91e91e9的数,所以不能判断前者(%4=0),得改成后者(%4=2)。代码里都写了,可以去看看。

这下就把题目做完啦~~

#include<bits/stdc++.h>
using namespace std;int main()
{int QQ;cin>>QQ;while(QQ--){int rest=0,pre,now=1;for(int i=1;i<=6;i++)//check x%2^i{pre=now;now<<=1;int a,b;/*//check resta=now-rest,b=now-rest+now;printf("? %d %d\n",a,b);int c;cin>>c;if(c==now) ;else rest+=pre;*///check rest+prea=now-rest-pre,b=now-rest-pre+now;printf("? %d %d\n",a,b);int c;cin>>c;if(c==now) rest+=pre;else ;}printf("! %d\n",rest);}
}

第二种运用CRT的方法还在学习中。。。

1665E - MinimizOR(数学)(线段树)

给出n个整数,对于每个询问(l,r)(l,r)(l,r)求出其中的min⁡i≠jai∣aj\displaystyle \min_{i \neq j} a_i | a_ji​=jmin​ai​∣aj​

这题太有意思辣!

很容易贪心的想到要让高位尽量的为0。

根据这种想法,我们很容易可以想到一种暴力解法。从高位到低位(指二进制下),
1)1)1)在区间上如果第k位有超过两个数都为0,那么第k位显然为0,接下来在第k位为0的中继续找k-1位。
2)2)2)如果小于两个为0的,那么显然这位只能是1了,就在所有中去找答案。

答案的解法找到了一个完美的性质!!!

The key idea for the solution is that the answer always lies among no more than 31 minimal numbers.

如果所有数小于2k2^{k}2k,那么需要答案一定出在区间k+1k+1k+1小的数的或运算中。

简单证明一下(计算机的证明题中,数学归纳法是一个宝贵的方法)。严格证明去看CF题解。我给出一种感性证明。

我们上面说过,一个高位要想为0,必须得有至少2个数。前k个数可以构成一串
011...111101...111110...111111...011111...101111...110011...111\\ 101...111\\ 110...111\\ 111...011\\ 111...101\\ 111...110 011...111101...111110...111111...011111...101111...110
接下来再来一个任意一个数,就可以决定答案,比如
111...110111...110 111...110
这样就可以构造一个极限需要用到k+1k+1k+1个的数据。

实现只要求求出区间最小的31个数,可以使用线段树实现。

#include<bits/stdc++.h>
#define fi first
#define se second
#define mk make_pair
using namespace std;
typedef pair<int,int> pii;
const int INF=(1ll<<31)-1;
const int MAXN=1e5+10;
const int MAXK=31;pii a[MAXK];
pii tr[MAXN*4];pii get(int x,int l,int r,int ql,int qr)
{if(l==ql && r==qr){return tr[x];}int mid=l+r>>1;if(qr<=mid) return get(x<<1, l, mid, ql, qr);else if(mid<ql) return get(x<<1|1, mid+1, r, ql, qr);else return min(get(x<<1, l, mid, ql, mid), get(x<<1|1, mid+1, r, mid+1, qr));
}void mod(int x,int l,int r,int pos,int val)
{if(l==pos && r==pos){tr[x]=mk(val,pos);return ;}int mid=l+r>>1;if(pos<=mid) mod(x<<1, l, mid, pos, val);else mod(x<<1|1, mid+1, r, pos, val);tr[x]=min(tr[x<<1],tr[x<<1|1]);
}int main()
{//  freopen("my.txt","w",stdout);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int Bright;cin>>Bright;while(Bright--){int rt=1;int n;cin>>n;for(int i=1;i<=n;i++){int x;cin>>x;mod(rt,1,n,i,x);}int q;cin>>q;while(q--){int l,r;cin>>l>>r;int tot=min(r-l+1,MAXK);for(int i=1;i<=tot;i++){a[i]=get(rt,1,n,l,r);mod(rt,1,n,a[i].se,INF);}int ans=INF;for(int i=1;i<=tot;i++)for(int j=i+1;j<=tot;j++) ans=min(ans,a[i].fi|a[j].fi);for(int i=1;i<=tot;i++){mod(rt,1,n,a[i].se,a[i].fi);}cout<<ans<<endl;}}return 0;
}

Codeforces Round #781 CF1665 CDE相关推荐

  1. codeforces round div2,3周赛补题计划(从开学到期末)

    1. 本学期场次 从2020.09.19-2021.01.18,一共18周. 题号 场次 日期 备注 1475 Codeforces Round #697 (Div. 3) 1.25 1474 Cod ...

  2. Codeforces Round #506 (Div. 3)

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

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

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

  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 #270

    Codeforces Round #270 题目链接 A:我是筛了下素数.事实上偶数仅仅要输出4和x - 4,奇数输出9和x - 9就可以 B:贪心的策略,把时间排序后.取每k个的位置 C:贪心.每次 ...

  6. 构造 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 的例子可以 ...

  7. [Educational Codeforces Round 16]A. King Moves

    [Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board ...

  8. Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...

  9. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...

最新文章

  1. java反射获取方法内部_公共技术点之 Java 反射 Reflection
  2. PostGIS之路——线性参考
  3. python----yield(generator)生成器
  4. 洛谷P3616 富金森林公园
  5. ASP.NET-自定义HttpModule与HttpHandler
  6. istview android:cacheColorHint,android:listSelector属性作用(转)
  7. jinja Import
  8. Entity Framework默认值字段不起作用解决方法
  9. python小结_Python小结
  10. HBase权威指南(百度云免费下载)
  11. 理光2014ad扫描服务器响应,理光mp2014ad扫描驱动和打印驱动
  12. 无人机——电池、电机、螺旋桨搭配
  13. 手机无线投屏到linux电脑,scrcpy - 手机无线投屏到电脑
  14. 为什么感觉现在电脑病毒少了?
  15. 解决问题:RuntimeError: the sip module implements API v11.0 to v11.2 but the module requires API v12.0
  16. Access 2003 的输入掩码(Input Mask)
  17. 徒步旅行中的注意事项
  18. uniapp 播放视频
  19. Python中矩阵运算中的norm范数、axis、ord参数
  20. MacBook Pro 耗电严重的终极解决办法2022年

热门文章

  1. 地球动力学类毕业论文文献都有哪些?
  2. ubuntu从tty终端模式返回到图形桌面
  3. 2020年史上最全移动端Web整理从开发基础到实战(四)
  4. 计算机使用计数制是,进位计数制
  5. 计算机用word做海报,用Word设计制作广告海报实验.doc
  6. 蓝桥杯 - 历届试题 小朋友排队 C语言实现
  7. kodi android 目录,如何在xbmc / kodi插件中创建多个目录?
  8. 华中科技大学计算机徐永兵,华中科技大学计算机学院导师及科研方向.doc
  9. linux服务器创建用户
  10. Count UVA - 1645