之前学长跟我说的是700-的应该都能自己做? 然后1000-的应该都能有一定的思路?

记不清了 但总之是要智力康复一下 又加上文化课比较紧 所以这个大概就会是长期计划了

————————————分鸽线————————————

今天体育中考晚上没事颓了3道题。

AGC024【至于为什么是24呢因为今天是24号233】

三道巨水的题我竟然A题WA了三发BC都1A...

A
B
C

————————————分鸽线————————————

竟然没让我们继续上课。本来以为体育中考和周六的课直接对调了的。

AGC025

A太水了不写了

B直接组合没有任何技术含量。。睿智的我RE了好几发。

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
#define mdn 998244353
#define N 900010
using namespace std; int a,b,n; ll k;
int fac[N],inv[N];
int ksm(int bs,int mi)
{
int ans=;
while(mi)
{
if(mi&)
ans=(ll)ans*bs%mdn;
bs=(ll)bs*bs%mdn; mi>>=;
}
return ans;
}
int C(int n,int m)
{
if(n<m) return ;
return (ll)fac[n]*inv[m]%mdn*inv[n-m]%mdn;
}
void upd(int &x,int y){x=(x+y)%mdn;}
int main()
{
int ans=;
scanf("%d%d%d%lld",&n,&a,&b,&k);
fac[]=inv[]=;
for(int i=;i<=n;i++) fac[i]=(ll)fac[i-]*i%mdn;
inv[n]=ksm(fac[n],mdn-);// printf("%d\n",inv[n]);
for(int i=n-;i;i--) inv[i]=(ll)inv[i+]*(i+)%mdn;
for(int i=;i<=n&&(ll)i*a<=k;i++)
{
if((k-a*i)%b==)
{
ll bi=(k-a*i)/b;
upd(ans,(ll)C(n,i)*C(n,bi)%mdn);
}
}
printf("%d\n",ans);
return ;
}
/**
300000 300000 300000 0
*/

B

C题就贪个心然后写起来巨烦不写了QAQ

滚去学文化了嘤嘤嘤

额。。晚上打了个ABC125怎么这么简单啊。。。AK了怎么才258名好菜啊。。。

还是把代码丢下吧。。。

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
using namespace std; int main()
{
int a,b,t;
scanf("%d%d%d",&a,&b,&t);
printf("%d\n",(t/a)*b);
return ;
}

A

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
using namespace std;
int c[],v[];
int main()
{
int st,top,n;
scanf("%d",&n); top=<<n;
for(int i=;i<n;i++) scanf("%d",&v[i]);
for(int i=;i<n;i++) scanf("%d",&c[i]);
int ans=;
for(int st=;st<top;st++)
{
int tmpv=,tmpc=;
for(int i=;i<n;i++) if((st>>i)&)
tmpv+=v[i],tmpc+=c[i];
ans=max(ans,tmpv-tmpc);
}
printf("%d\n",ans); return ;
}

B

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<map>
#define ll long long
#define inf 20021225
#define N 100010
using namespace std; int a[N]; int n; int pre[N],suf[N];
int gcd(int x,int y){return !y?x:gcd(y,x%y);}
void solve()
{
for(int i=;i<=n;i++)
{
if(i==) pre[i]=a[i];
else pre[i]=gcd(pre[i-],a[i]);
} for(int i=n;i;i--)
{
if(i==n) suf[i]=a[i];
else suf[i]=gcd(suf[i+],a[i]);
}
int ans=;
for(int i=;i<=n;i++)
{
if(i==) ans=max(ans,suf[]);
else if(i==n) ans=max(ans,pre[n-]);
else ans=max(ans,gcd(pre[i-],suf[i+]));
}
printf("%d\n",ans);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
solve();
return ;
}

C

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
#define N 100010
using namespace std;
ll f[N][]; ll a[N]; int n;
void solve()
{
memset(f,-,sizeof(f)); f[][]=f[][]=;
for(int i=;i<=n;i++)
{
if(i==) f[i][]=a[i];
else
{
f[i][]=max(f[i-][],f[i-][])+a[i];// printf("QAQ %d %lld\n",i,a[i]);
f[i][]=max(f[i-][]-*a[i-],f[i-][]+*a[i-])-a[i];
}
}
printf("%lld\n",max(f[n][],f[n][]));
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld",&a[i]);
solve();
return ;
}

D

————————————分鸽线————————————

AGC026

B是个特判 就是看一下(kd+a)%b>c是否存在就行了

C是个典型的meet in the middle 模数要设的大一点不然会冲突 我直接unsigned long long了 不卡好评

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
using namespace std;
ll a,b,c,d;
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
bool okay(ll a,ll b,ll c,ll d)
{
ll g=gcd(d,b); ll x=(b-a)/g*g;
if((x+a)%b>c) return ;
x=(b-a-)/g*g;
if((x+a)%b>c) return ;
return ;
}
int main()
{
int t; scanf("%d",&t);
while(t--)
{
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
if(a<b || b>d){printf("No\n"); continue;} a%=b;
if(okay(a,b,c,d)) printf("Yes\n");
else printf("No\n");
}
return ;
}

B

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<map>
#define ll long long
#define inf 20021225
#define bs 331
#define ull unsigned long long
using namespace std;
map<ull,int> f[]; char ch[]; int col[],n; ll ans;
ull pw[];
void calc(int fl)
{
ull x=,y=;
int p=,q=n;
for (int i=;i<=n;i++)
if(col[i]>) x+=(ull)col[i]*pw[p],p++;
else y+=(ull)col[i]*pw[q],q--;
if(fl) ans+=f[p][x+y];
else f[q][x+y]++;
}
void dfs1(int x)
{
if(x>n){calc(); return;}
col[x]=ch[x]-'a'+; dfs1(x+); col[x]=-col[x]; dfs1(x+);
}
void dfs2(int x)
{
if(x<=n){calc(); return;}
col[*n-x+]=ch[x]-'a'+; dfs2(x-); col[*n-x+]=-col[*n-x+]; dfs2(x-);
}
int main()
{
scanf("%d",&n); scanf("%s",ch+); pw[]=; for(int i=;i<=n;i++) pw[i]=pw[i-]*bs;
dfs1(); dfs2(*n); printf("%lld\n",ans);
return ;
}

C

————————————分鸽线————————————

AGC034

A特判 B在整 感冒真不舒服

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
using namespace std;
char ch[]; int a,b,c,d,n;
int main()
{
scanf("%d%d%d%d%d",&n,&a,&b,&c,&d);
int f=(d<c); scanf("%s",ch+);
for(int i=b-;i<=d-;i++)
{
if(i+>n) continue;
if(ch[i]=='.'&&ch[i+]=='.'&&ch[i+]=='.')
f=;
}
for(int i=a;i<=max(c,d)-;i++)
if(ch[i]=='#'&&ch[i+]=='#'){f=;break;}
if(f==) printf("No\n");
else printf("Yes\n");
return ;
}

A

————————————分鸽线————————————

AGC028

B有点意思

就是考虑每个x的贡献 对于i~x只要都没拿的话就有贡献 那么可以推出柿子

这里写的是i在x之前 不然加abs懒得写了

意思大概是除了i~x的全排 然后i必须是i~x里最先拿走的所以剩下的可以随便排 再就是要选出一些位置来放i~x

观察到x-i一直都在 简化一下

这个显然可以预处理 然后后半部分(x+1~n)是一样的

然后就做完啦

还发现了一种非常神仙的做法 先把这个题转成期望... 然后再*n!

看起来有点闲 但是非常好想好做的说 orz forever_shi 链接:戳我

————————————分鸽线————————————

AGC030D

找sun要到了一道好题 也是计数转期望

这个题当时做了 没做出来(

膜了一下题解 很有趣的问题呢

我们用f[i][x][y]来表示第i轮操作后ax>ay的概率 由于逆序对贡献是1 最后全部加起来就是期望

每次交换的概率是1/2 然后我们最后把整体*2^q就可以了

还看了一道sun的类似的题 link挂这里了:戳我

大体总结一下这类题的方法:

1.首先要对期望的贡献一样才能通过期望求概率 这个应该很显然能看出来

2.一般是关于全排列或者2^n的问题 来用期望来做

好像atcoder非常喜欢出这种东西...

代码扔这里了

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
#define N 3001
#define mdn 1000000007
#define inv 500000004ll
using namespace std; int f[N][N],a[N],n,q;
int ksm(int bs,int mi)
{
int ans=;
while(mi)
{
if(mi&) ans=1ll*ans*bs%mdn;
bs=1ll*bs*bs%mdn; mi>>=;// printf("QAQ");
}
return ans;
}
int main()
{
scanf("%d%d",&n,&q); int remq=q;
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) for(int j=;j<=n;j++)
f[i][j]=a[i]>a[j];
while(q--)
{
int x,y; scanf("%d%d",&x,&y);
f[x][y]=f[y][x]=inv*(f[x][y]+f[y][x])%mdn;
for(int i=;i<=n;i++) if(i!=x&&i!=y)
f[x][i]=f[y][i]=inv*(f[x][i]+f[y][i])%mdn,
f[i][x]=f[i][y]=inv*(f[i][x]+f[i][y])%mdn;
}
int ans=;
for(int i=;i<=n;i++) for(int j=;j<i;j++)
ans=(ans+f[j][i])%mdn;
printf("%d\n",1ll*ans*ksm(,remq)%mdn);
return ;
}

D

发现自己概率期望真的不大行... 所以接下来要开始练一练...

————————————分鸽线————————————

突然发现ABC131没有往上搬... 把EF搬上来吧

E问的是构造简单连通图 n个点 k对点对最短距离是2

萧昈黎tql orz

我们先造个菊花 然后接下来每加1条边就少一对点对 就做完了

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
using namespace std;
bool edg[][]; int n,k,m;
int main()
{
scanf("%d%d",&n,&k); m=n*(n-)/;
m-=k;
if(m<n-)
{
printf("-1"); return ;
}
printf("%d\n",m); m-=n-; for(int i=;i<=n;i++) edg[i][]=;
for(int i=;i<=n&&m;i++) for(int j=i+;j<=n&&m;j++)
edg[i][j]=,m--;
for(int i=;i<=n;i++) for(int j=;j<=n;j++)
if(edg[i][j]) printf("%d %d\n",i,j);
return ;
}

E

F是平面上n个点 如果有三个点分别位于(a,b) (a,d) (c,b)就可以添加一个新点(c,d) 问最多能操作多少次

显然新点不会产生贡献

我们可以维护联通块 对行列分别建点 然后一个点坐标是(x,y)的话就连接第x行和第y列 于是我们就可以通过维护联通块来求答案

ans=行数*列数-点数(点数是平面里的点数)

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
#define N 100010
using namespace std; int fa[N<<],val[N<<][],n;
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
struct poi{int x,y,ax,ay;}a[N];
bool cmp1(poi x,poi y){return x.x<y.x;}
bool cmp2(poi x,poi y){return x.y<y.y;}
void merge(int x,int y)
{
int fx=find(x),fy=find(y); if(fx==fy) return;
val[fx][]+=val[fy][]; val[fx][]+=val[fy][];
fa[fy]=fx;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
int xx=,yy=;
sort(a+,a+n+,cmp1);
for(int i=;i<=n;i++)
{
if(a[i].x!=a[i-].x) ++xx;
a[i].ax=xx;
}
sort(a+,a+n+,cmp2);
for(int i=;i<=n;i++)
{
if(a[i].y!=a[i-].y) ++yy;
a[i].ay=yy;
}
for(int i=;i<=xx;i++) fa[i]=i,val[i][]=;
for(int i=;i<=yy;i++) fa[i+xx]=i+xx,val[i+xx][]=;
for(int i=;i<=n;i++) merge(a[i].ax,a[i].ay+xx);
ll ans=;
for(int i=;i<=xx+yy;i++)
if(fa[i]==i) ans+=1ll*val[i][]*val[i][];
printf("%lld\n",ans-n);
return ;
}

F

他们都好神仙 我好菜(

——————————分鸽线——————————

AGC036

口胡一时爽 一直口胡一直爽

我来先口胡一个A和B

A的做法好像很多 我的想法是一个矩形减去3个三角形 然后这个东西在sqrtn附近构造一下就应该可以了

sun给出的做法比较科学 我们可以考虑两个向量 最后的答案是1/2*(AC-BD) 我们强制B=1然后构造比较方便(诶其实好像和我那个差不多啊(?

处理一下就行了

B的做法我也口胡一个 就是我们可以发现每次最后会剩下一段然后再加进来又会把上次剩余的删掉 这个循环节显然是不超过N的 所以我们可以暴力找到循环节然后剩下的部分也不超过N 也暴力模拟就可以了

C的题解已经写了 sun好神仙啊 %sun

————————分割线————————

AGC007

————————分割线————————

arc094f

连猜两个结论= =

先是n<=3爆搜得到答案= =

n>=4 方案数是和%3与原串相等且存在相邻的是一样的(归纳可证)。

有一些细节懒得说了。

//Love and Freedom.
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<string>
#define ll long long
#define inf 20021225
#define N 200010
#define mdn 998244353
using namespace std;
int read()
{
int s=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
int f[N][][][],n,ans; char ch[N]; string gg; map<string,bool> vis;
void upd(int &x,int y){x+=x+y>=mdn?y-mdn:y;}
void dfs(string a)
{
if(vis[a]) return;
string qwq=a; ans++; vis[a]=;
for(int i=;i<n-;i++) if(qwq[i]!=qwq[i+])
{
if((qwq[i]=='a' && qwq[i+]=='b')||(qwq[i]=='b'&&qwq[i+]=='a'))
a[i]=a[i+]='c',dfs(a),a[i]=qwq[i],a[i+]=qwq[i+];
if((qwq[i]=='a' && qwq[i+]=='c')||(qwq[i]=='c'&&qwq[i+]=='a'))
a[i]=a[i+]='b',dfs(a),a[i]=qwq[i],a[i+]=qwq[i+];
if((qwq[i]=='b' && qwq[i+]=='c')||(qwq[i]=='c'&&qwq[i+]=='b'))
a[i]=a[i+]='a',dfs(a),a[i]=qwq[i],a[i+]=qwq[i+];
}
}
int main()
{
scanf("%s",ch+); n=strlen(ch+);
if(n<=)
{
for(int i=;i<=n;i++) gg=gg+ch[i];
dfs(gg),printf("%d\n",ans); return ;
}
int flag=,fs=ch[]-'a';
for(int i=;i<=n;i++) flag+=(ch[i]==ch[i-]),(fs+=ch[i]-'a')%=;
if(flag==n-) return puts(""),;
f[][][][]=; f[][][][]=; f[][][][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<;j++) for(int k=;k<;k++)
for(int s=;s<;s++) for(int p=;p<;p++)
{
int np=(j==k)|p,ns=(k+s)%;
upd(f[i][k][ns][np],f[i-][j][s][p]);
}
}
int ans=((ll)f[n][][fs][]+f[n][][fs][]+f[n][][fs][]+(!flag))%mdn;
printf("%d\n",ans);
return ;
}

ARC094F

【长期计划】Atcoder题目泛做的更多相关文章

  1. Atcoder 题目泛做

    我思维越来越菜了,这样下去感觉要退役了. 听说Atcoder的题练思维?那就试着做一做吧. 坚持每天一两道吧.(很有可能咕掉.) AGC036 官方题解 ---A-Triangle          ...

  2. 2017国家集训队作业Atcoder题目试做

    2017国家集训队作业Atcoder题目试做 虽然远没有达到这个水平,但是据说Atcoder思维难度大,代码难度小,适合我这种不会打字的选手,所以试着做一做 不知道能做几题啊 在完全自己做出来的题前面 ...

  3. 基尔霍夫矩阵题目泛做(AD第二轮)

    题目1: SPOJ 2832 题目大意: 求一个矩阵行列式模一个数P后的值.p不一定是质数. 算法讨论: 因为有除法而且p不一定是质数,不一定有逆元,所以我们用辗转相除法. #include < ...

  4. 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做

    题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...

  5. FFT与多项式、生成函数题目泛做

    题目1 COGS 很强的乘法问题 高精度乘法用FFT加速 #include <cstdlib> #include <iostream> #include <algorit ...

  6. 二维计算几何基础题目泛做(SYX第一轮)

    题目1: POJ 2318 TOYS 题目大意: 给一个有n个挡板的盒子,从左到右空格编号为0...n.有好多玩具,问每个玩具在哪个空格里面. 算法讨论: 直接叉积判断就可以.注意在盒子的边界上面也算 ...

  7. 生成树题目泛做(AD第二轮)

    题目1: NOI2014 魔法森林 LCT维护MST.解题报告见LOFTER #include <cstdio> #include <iostream> #include &l ...

  8. K-D Tree题目泛做(CXJ第二轮)

    题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...

  9. 插头DP题目泛做(为了对应WYD的课件)

    题目1:BZOJ 1814 URAL 1519 Formula 1 题目大意:给定一个N*M的棋盘,上面有障碍格子.求一个经过所有非障碍格子形成的回路的数量. 插头DP入门题.记录连通分量. #inc ...

随机推荐

  1. sso单点登录原理详解

    sso单点登录原理详解     01 单系统登录机制    1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态协议,浏览器的每一次请求,服务 ...

  2. 一、Robotframework安装步骤

    1.安装python并验证安装成功 a.安装python-2.7.14.amd64------默认路径安装即可 b.添加环境变量path:C:\Python27; C:\Python27\Script ...

  3. leetcode 240搜索二维矩阵

    /** 正常的二维搜索估计要超时,本题沿着对角线搜索,然后找到第一个大于目标数字的坐标(x,y)然后搜索(>x,<y)(<x,>y)子区域: 矩阵size() 为m,n:当i& ...

  4. 开发-日常工具:TFS(Team Foundation Server)

    ylbtech-开发-日常工具:TFS(Team Foundation Server) TFS(Team Foundation Server)是一个高可扩展.高可用.高性能.面向互联网服务的分布式文件 ...

  5. Shiro Demo 示例(SpringMVC-Mybatis-Shiro-redis)

    Shiro Demo 准备工作 运行前申明 请看完本页面的所有细节,对你掌握这个项目来说很重要,别一上来就搞,你不爽,我也不爽. 本项目需要一定的Java功底,需要对SpringMvc,Mybatis ...

  6. centos7 主从dns配置 bind服务

    一,配置前请先关闭防火墙selinux 防火墙关闭方法,参见上一篇文章. setenforce 0    #临时关闭 修改/etc/selinux/config 文件  将SELINUX=enforc ...

  7. fiddler过滤机制讲解

    1.User Fiters启用 2.Action Action:Run Filterset now是否运行,Load Filterset加载,Save Filterset保存: 3.Hosts过滤 Z ...

  8. for语句与if语句嵌套的简单应用

    1.循环语句 for(初始条件:循环条件:状态改变) { 循环体 } break为跳出循环,continue为结束此次循环. 2.死循环常用while语句 while(判断语句) { if(判断) { ...

  9. API接口设计

    1.场景描述 比如说我们要做一款APP,需要通过api接口给app提供数据.假设我们是做商城,比如我们卖书的.我们可以想象下这个APP大概有哪些内容: 1)首页:banner区域(可以是一些热门书籍的 ...

  10. CentOS7 安装dotnet sdk 2.1.401 的简单办法

    1. 下载 linux版本的tar包 路径为: https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.1.401-linux-x64 ...