AGC001[BCDE] 题解
A没意思 F太难 所以大概近期的AGC题解都是BCDE的
然后特殊情况再说
开始刷AGC的原因就是计数太差 没有脑子 好几个学长都推荐的AGC所以就开始刷了 = =
大概两天三篇的速度?【可能也就最开始几天能有这个速度= =】
好了不多说了 开始题解
————————我是分割线————————
B - Mysterious Light
比较有趣 画几个图就发现每次去掉两条就是平行四边形 除了第一次的两条不一样长以外 其他的都还是一样长的 然后就得到了一个类欧几里得的算法 那么把减法变成取模就搞定了= =
直接上代码好了 时间复杂度应该是O(lgn)吧
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
using namespace std;
ll N,x,ans;
int main()
{
scanf("%lld%lld",&N,&x);
ans+=N; ll a=x,b=N-x,tmp;
while(a && b)
{
if(a>b) swap(a,b);
tmp = b/a*a;
//printf("%lld %lld %lld\n",a,b,tmp);
b%=a; ans+=2*tmp;
if(!b) ans-=a;
}
printf("%lld\n",ans);
return 0;
}
C - Shorten Diameter
比较直接的一个题 很明显每次删叶子 是可以贪心的 直接统计每个点和其他点距离>k的有几个 然后set维护暴力删就可以了
预处理一下dis数组比较方便 如果倍增LCA应该也可以吧 但是多个log怕不是会T
附代码。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#define inf 20021225
#define ll long long
#define mxn 2010
#define mp make_pair
#define fs first
#define se second
#define pa pair<int,int>
using namespace std;
struct edge{int to,lt;}e[mxn<<1];
int f[mxn][mxn],in[mxn],cnt,d[mxn];
int n,k;bool del[mxn];
set<pa> st;
void add(int x,int y)
{
e[++cnt].to=y;e[cnt].lt=in[x];in[x]=cnt;
e[++cnt].to=x;e[cnt].lt=in[y];in[y]=cnt;
}
void dfs(int x,int fa,int rt)
{
for(int i=in[x];i;i=e[i].lt)
{
int y=e[i].to;if(y==fa) continue;
f[rt][y]=f[rt][x]+1; dfs(y,x,rt);
}
}
void getdis()
{
for(int i=1;i<=n;i++) dfs(i,i,i);
}
void work()
{
int ans=0,x,tmp; getdis();
for(int i=1;i<=n;i++)
{
tmp=0; if(d[i]!=1) continue;
for(int j=1;j<=n;j++)
if(f[i][j]>k) tmp++;
st.insert(mp(tmp,i));
}
while(!st.empty())
{
set<pa>::iterator it=--st.end(); pa mx=*it;
if(mx.fs<=0) break;
del[mx.se]=1; st.erase(it); x=mx.se;
for(it=st.begin();it!=st.end();it++)
{
pa cur=*it; int y=cur.se;
if(f[x][y]>k)
st.erase(it),st.insert(mp(cur.fs-1,y));
}
for(int i=in[x];i;i=e[i].lt)
{
int y=e[i].to; d[y]--;// printf("%d %d\n",y,d[y]);
if(d[y]==1)
{
tmp=0;
for(int j=1;j<=n;j++)
if(!del[j]&&f[y][j]>k) tmp++;
st.insert(mp(tmp,y));
}
}
ans++;
}
printf("%d\n",ans);
}
int main()
{
int x,y;
scanf("%d%d",&n,&k);
for(int i=1;i<n;i++) scanf("%d%d",&x,&y),add(x,y),d[x]++,d[y]++;
work();
return 0;
}
D - Arrays and Palindrome
人太咸鱼 没有理想 然后就看题解了T^T
发现有两个以上长度是奇数的就是无解
如果以下的话就两边一边一个 然后一个+1 一个-1就好了 别的细节什么的看代码吧。
就是这个整个过程其实是利用两个串不停连边【连边即为相同】然后两个串分开的时候需要用另一个串连接起来 这个过程偶数是可以做到的但是奇数不行【中间的那个元素被空出来了】所以就是这个样子啦
看一下editorial比较好emm我说的不是很严谨。。。
代码。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define mxn 110
using namespace std;
int n,a[mxn],m;
int main()
{
int cnt=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i]);
cnt+=a[i]%2;
}
if(cnt>2)
{
printf("Impossible\n");
return 0;
}
int fs=0;
for(int i=1;i<=m;i++)
{
if(a[i]%2==1)
{
if(!fs) swap(a[1],a[i]),fs=1;
else swap(a[m],a[i]);
}
}
for(int i=1;i<=m;i++) printf("%d ",a[i]);puts("");
if(m==1)
{
if(a[1]==1) printf("1\n1\n");
else printf("2\n1 %d\n",a[1]-1);
return 0;
}
a[1]--; a[m]++;
if(a[1]==0)
{
printf("%d\n",m-1);
for(int i=2;i<=m;i++) printf("%d ",a[i]);
}
else
{
printf("%d\n",m);
for(int i=1;i<=m;i++) printf("%d ",a[i]);
}
return 0;
}
E - BBQ Hard
组合计数= = 戳到软肋了 不过刷agc就是为了练这个的emm
推一下柿子 大概是这个样子的
然后我们观察到 a和b都比较小 但是n比较大所以我们可以转成Lattice path问题
然后就不会做了= =
这个题需要把柿子转换一下 大概长这个样子
就是直接全计数然后去不合法去重
观察到 后面那个柿子直接O(1)算就行了
然后前面这个是典型的Lattice Path问题
表示从走到的路径
然后扔图上dp一下就行了qwq
计数好题要码一下= =+
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define mdn 1000000007
using namespace std;
int f[4100][4100],inv2;
int fac[8100],inv[8100];
int n,a[200010],b[200010];
int ksm(int bs,int mi)
{
int ans=1;
while(mi)
{
if(mi&1) ans=(ll)ans*bs%mdn;
bs=(ll)bs*bs%mdn; mi>>=1;
}
return ans;
}
int C(int x,int y)
{
if(x<y) return 0;
return (ll) fac[x] * inv[x-y] %mdn *inv[y]%mdn;
}
bool vis[4100][4100];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]),f[2001-a[i]][2001-b[i]]+=1;
fac[0]=inv[0]=1; inv2=ksm(2,mdn-2);
for(int i=1;i<=8001;i++) fac[i]=(ll)fac[i-1]*i%mdn;
inv[8001]=ksm(fac[8001],mdn-2);
for(int i=8000;i;i--) inv[i]=(ll)inv[i+1]*(i+1)%mdn;
for(int i=1;i<=4001;i++)
for(int j=1;j<=4001;j++)
f[i][j]+=f[i-1][j]+f[i][j-1],f[i][j]%=mdn;
int mns=0,add=0;
for(int i=1;i<=n;i++)
mns = ((ll)mns + C(2*(a[i]+b[i]),2*a[i]))%mdn , add = ((ll)add + f[2001+a[i]][2001+b[i]])%mdn;
//printf("%d %d %d\n",a[i],b[i],f[2001+a[i]][2001+b[i]]);
add -= mns; if(add<0) add+=mdn;
//printf("%d\n",mns);
printf("%d\n",(ll)add*inv2%mdn);
return 0;
}
AGC001打卡(2018-12-27)
AGC001[BCDE] 题解的更多相关文章
- AGC001 E - BBQ Hard 组合数学
题目链接 AGC001 E - BBQ Hard 题解 考虑\(C(n+m,n)\)的组合意义 从\((0,0)\)走到\((n,m)\)的方案数 从\((x,y)\)走到\((x+n,y+m)\)的 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
随机推荐
- pl/sql中return和exit区别
经测试: 1.exit只能用于循环中,并且退出循环往下执行: 2.return可用于循环或非循环,并且退出整个程序模块不往下执行. declare i number :=1; j number :=1 ...
- centos7systemctl介绍
Linux中如何启动.重启.停止.重载服务以及检查服务(如 httpd.service)状态 # systemctl start httpd.service # systemctl restart ...
- MyView.java 自己画的view
package myapplication21.lum.com.mycanvas; import android.content.Context;import android.graphics.Can ...
- 奖项-MVP:MVP(微软最有价值专家)百科
ylbtech-奖项-MVP:MVP(微软最有价值专家)百科 微软最有价值专家(MVP) 是指具备一种或多种微软技术专业知识,并且积极参与在线或离线的社群活动,经常与其他专业人士分享知识和专业技能,受 ...
- mysql_DML_索引、视图
创建索引的语法格式:– 创建普通索引:• create index 索引名称 on 表名(列)• alter table 表名 add index 索引名称 (列)– 创建唯一索引:• create ...
- 【GIS数据格式】ArcInfo Binary Grid Format
最近在修改项目时发现有些提取的坡度数据在参与了下一步计算后会出错,仔细跟了代码之后发现AE生成的坡度数据和其他一些分析后的栅格都被存储为.adf文件.说起惭愧,并不了解这是什么数据,由于下层算法使用G ...
- 《图解设计模式》读书笔记1-2 Adapter模式
目录 Adapter即适配器,可以类比为将220V的电压的电源转为5V电压的手机充电器,起转换的作用. 明确概念: Adaptee:被适配者,即220v电压的电源 Adapter:适配器,即手机充电器 ...
- 【黑科技】花几分钟和孩子动手DIY,即可用手机完成全息影像!
http://baobao.sohu.com/20160902/n467277059.shtml [黑科技]花几分钟和孩子动手DIY,即可用手机完成全息影像! 杭州亲子圈2016-09-02 07:2 ...
- uni-app 云打包证书生成笔记
一.android 云打包生成证书 1.jdk和jre安装,配置环境 2.在 C:\Users\Administrator\.android 文件夹下执行:keytool -genkey -alias ...
- Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信
1.Java使用Thread类代表线程. 所有的线程对象必须是Thread类或其子类的实例. 当线程继承Thread类时,直接使用this即可获取当前线程,Thread对象的getName() ...