比赛传送门

T1

Triangular Relationship

分析之后发现有两种情况:

1. n为奇数,那么所有数都是k的倍数。

2. n为偶数,那么所有数都是k/2的倍数。

然后就可以愉快A题了。

代码:

  1. #include<bits/stdc++.h>
  2. #define N 200005
  3. #define ll long long
  4. using namespace std;
  5. inline ll read(){
  6. ll ans=0;
  7. char ch=getchar();
  8. while(!isdigit(ch))ch=getchar();
  9. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  10. return ans;
  11. }
  12. ll n,k;
  13. int main(){
  14. n=read(),k=read();
  15. if(k&1){
  16. ll tmp=n/k;
  17. cout<<tmp*tmp*tmp;
  18. }
  19. else{
  20. ll tmp1=n/k,tmp2=tmp1;
  21. if(n%k>=k/2)++tmp2;
  22. cout<<tmp1*tmp1*tmp1+tmp2*tmp2*tmp2;
  23. }
  24. return 0;
  25. }

T2

All Your Paths are Different Lengths

图的构造需要二进制拆分的思想。

我们把L拆分成1+2+4+…+2^n+tmp的形式。

然后对于i,i+1号点,我们连两条边,边权分别是0和2^(i-1)。

但这样有可能凑不出答案,因此需要将trnp二进制不唯一的位提出来建边。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int l,cnt=0,tot=0,res,tmp,first[30];
  4. struct edge{int u,v,w,next;}e[65];
  5. inline void add(int u,int v,int w){e[++tot].u=u,e[tot].v=v,e[tot].w=w,e[tot].next=first[u],first[u]=tot;}
  6. int main(){
  7. cin>>l,tmp=l,res=l;
  8. while(tmp)tmp>>=1,++cnt;
  9. for(int i=1;i<cnt;++i)add(i,i+1,0),add(i,i+1,(1<<(i-1)));
  10. res-=1<<(cnt-1);
  11. tmp=1<<(cnt-1);
  12. for(int i=0;i<=20;++i)if(((res>>i)&1))add(i+1,cnt,tmp),tmp+=1<<i;
  13. cout<<cnt<<' '<<tot<<'\n';
  14. for(int i=1;i<=tot;++i)cout<<e[i].u<<' '<<e[i].v<<' '<<e[i].w<<'\n';
  15. return 0;
  16. }

T3

Stop. Otherwise…

感觉这题比T4难啊。。。

容斥原理+组合数。

我们将问题转化成对于每一个数,有多少种凑出来的方法。

这个东西可以用组合数算出来。

最终可以推出一个式子:

ansi=∑j=0,j≤k2(−1)j(k1+k2−j−1N+k1+k2−j−1)∗2k2−j∗(jk2)" role="presentation" style="position: relative;">ansi=∑j=0,j≤k2(−1)j(k1+k2−j−1N+k1+k2−j−1)∗2k2−j∗(jk2)ansi=∑j=0,j≤k2(−1)j(k1+k2−j−1N+k1+k2−j−1)∗2k2−j∗(jk2)

其中k2" role="presentation" style="position: relative;">k2k2是和为i的时候矛盾的对数,k1" role="presentation" style="position: relative;">k1k1是没有影响的种类数,j是方案中没有用的矛盾对数。

代码:

  1. #include<bits/stdc++.h>
  2. #define N 2005
  3. #define mod 998244353
  4. #define ll long long
  5. using namespace std;
  6. ll C[N<<1][N<<1],mul[N<<1];
  7. int n,k;
  8. inline ll calc(int i,int tot){
  9. int k2=min(k-i/2,(i-1)/2),k1=k-(k2<<1)-((i&1)==0);
  10. ll f=1,ret=0;
  11. for(int j=k2;j+k1>0&&j>=0;--j,f=-f)(ret+=f*C[j+k1+tot-1][j+k1-1]*mul[j]%mod*C[k2][j]%mod)%=mod;
  12. return (ret+mod)%mod;
  13. }
  14. inline ll read(){
  15. ll ans=0;
  16. char ch=getchar();
  17. while(!isdigit(ch))ch=getchar();
  18. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  19. return ans;
  20. }
  21. int main(){
  22. k=read();
  23. n=read();
  24. mul[0]=1;
  25. for(int i=1;i<=4000;++i)mul[i]=(mul[i-1]<<1)%mod;
  26. C[0][0]=1;
  27. for(int i=1;i<=4000;++i){
  28. C[i][0]=1;
  29. for(int j=1;j<=i;++j)C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
  30. }
  31. ll tmp=0;
  32. for(int i=2;i<=2*k;++i){
  33. if(!(i&1))tmp=(calc(i,n)+calc(i,n-1))%mod;
  34. else tmp=calc(i,n);
  35. cout<<tmp<<'\n';
  36. }
  37. return 0;
  38. }

T4

Revenge of BBuBBBlesort!

考试时只能用假算法过掉93个点,剩下的真没办法了。

其实很简单。

对于一个点,如果i!=a[i],那么这个点一定需要被换,否则一定不能被换,因此对于每一个点i,我们算出从i开始最多连续换的区间,然后检验这个区间能否使用某种方法换回去就行了。

时间复杂度O(n)" role="presentation" style="position: relative;">O(n)O(n)

代码:

  1. #include<bits/stdc++.h>
  2. #define N 300005
  3. using namespace std;
  4. int n,a[N];
  5. inline int read(){
  6. int ans=0;
  7. char ch=getchar();
  8. while(!isdigit(ch))ch=getchar();
  9. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  10. return ans;
  11. }
  12. inline bool check(int l,int r){
  13. int mx=0,mn=n+1;
  14. for(int i=l;i<=r;++i)mx=max(mx,a[i]),mn=min(mn,a[i]);
  15. if(mx!=r||mn!=l)return false;
  16. int mx1=0,mx2=0;
  17. for(int i=l;i<=r;i+=2){
  18. if(mx1<a[i]&&mx2<a[i])mx1=a[i];
  19. else if(mx2<a[i])mx2=a[i];
  20. else return false;
  21. }
  22. return true;
  23. }
  24. int main(){
  25. n=read();
  26. for(int i=1;i<=n;++i)a[i]=read();
  27. for(int i=1;i<=n;++i){
  28. if(a[i]==i)continue;
  29. int p=i;
  30. while(p<=n-2){
  31. if(a[p+1]!=p+1||a[p+2]==p+2)break;
  32. p+=2;
  33. }
  34. if(!check(i,p)){puts("No");return 0;}
  35. i=p;
  36. }
  37. puts("Yes");
  38. return 0;
  39. }

2018.09.02 Atcoder Regular Contest 102简要题解的更多相关文章

  1. 2018.09.08 AtCoder Beginner Contest 109简要题解

    比赛传送门 水题大赛? 全是水题啊!!! T1 ABC333 就是判断是不是两个数都是奇数就行了. 代码: #include<bits/stdc++.h> using namespace ...

  2. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

  3. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

  4. AtCoder Regular Contest 102 E Stop. Otherwise...

    题目链接:atcoder 大意:有\(n\)个骰子,每个骰子上面有\(k\)个数,分别是\(1\text ~ k\),现在求\(\forall i\in[2...2k]\),求出有多少种骰子点数的组合 ...

  5. AtCoder Regular Contest 102 (ARC102) E - Stop. Otherwise... 排列组合

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARD102E.html 题目传送门 - ARC102E 题意 有 $n$ 个取值为 $[1,k]$ 的骰子,对于 ...

  6. AtCoder Regular Contest 102 (ARC102) D All Your Paths are Different Lengths 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARC102D.html 题目传送门 - ARC102D 题意 给定 $L$,请你构造一个节点个数为 $n$ ,边 ...

  7. AtCoder Regular Contest 102 D - All Your Paths are Different Lengths

    D - All Your Paths are Different Lengths 思路: 二进制构造 首先找到最大的t,使得2^t <= l 然后我们就能构造一种方法使得正好存在 0 到 2^t ...

  8. AtCoder Grand Contest 039 简要题解

    从这里开始 比赛目录 Problem A Connection and Disconnection 简单讨论即可. Code #include <bits/stdc++.h> using ...

  9. AtCoder Grand Contest 040 简要题解

    从这里开始 比赛目录 A < B < E < D < C = F,心情简单.jpg. Problem A >< 把峰谷都设成 0. Code #include &l ...

随机推荐

  1. Invalid args, too big block

    在调试vs程序的时候 查看log 会出现下面几行log: [9064] Error - [9064] Invalid args, too big block[9064] [9064] Error - ...

  2. Rsync+sersync实现数据实时同步

    前言: 一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增 ...

  3. How to Pronounce T and D between Consonants

    How to Pronounce T and D between Consonants Share Tweet Share Tagged With: Dropped T What happens to ...

  4. 吴裕雄 实战PYTHON编程(6)

    import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['Simhei']plt.rcParams['axes.unicode ...

  5. spark cache table

    http://www.07net01.com/2015/11/961118.html http://www.cnblogs.com/charlotte77/p/5468968.html 文本读入和写出 ...

  6. Java工具类_模拟HTTP POST请求

    import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.InputStream; i ...

  7. C# split分割多个字符

    string[] myAgent = agentInfo.Split(new string[] { "$#$" }, StringSplitOptions.None);

  8. 第八章 高级搜索树 (b2)B-树:结构

  9. PS切图导出代码后出现的图片布局散乱的解决方法——table布局

    前言: 一般来说,大部分美工PS切图后导出的都是使用PS默认的table布局的页面,出现最多的异常是上传代码,替换图片后,发现图片布局散乱,完全不是想要的效果.轻微的是浏览器不兼容,只有部分浏览器可以 ...

  10. pymysql基本的使用方法

    1.导入模块+创建连接 import pymysql # 1.通过python去连接数据库 conn = pymysql.connect(host="127.0.0.1",port ...