这个帖子,是在自己学知识点累了的时候就看看\(AGC\)的题目来休息。

而且白天上课可以做(

AGC-001

\(A\ BBQ Easy\)

考虑从小到大排,相邻两个取为一对。

BBQ Easy
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define N 100000 ll n;
ll num[N],ans; int main(){
scanf("%lld",&n);
for(int i = 1;i <= 2 * n;++i)
scanf("%lld",&num[i]);
std::sort(num + 1,num + 2 * n + 1);
for(int i = 2 * n - 1;i >= 1;i -= 2)
ans += num[i];
std::cout<<ans<<std::endl;
}

\(B\ Mysterious Light\)

光线实则是在平行四边形里游走的。

Mysterious Light
#include<cstdio>
#include<algorithm>
#define LL long long
using namespace std;
LL n,x,ans,x1,x2;
int main()
{
scanf("%lld%lld",&n,&x);
ans=n;
x1=x,x2=n-x;
while(1)
{
if(x1<x2) swap(x1,x2);
if(!x2) break;
if(x1%x2==0) ans-=x2;
ans+=x2*(x1/x2)*2;
x1-=x2*(x1/x2);
}
printf("%lld\n",ans);
}

\(C\ Shorten Diameter\)

考虑\(n\)很小,考虑枚举直径中间的那个点/边,以他为中间的树高不能超过\(\frac{k}{2}\)

暴力\(dfs\)就行了。

明天机房要封起来,什么体育机考。。。

明天安心卷文化课吧。

Shorten Diameter
#include<iostream>
#include<cstdio>
#define ll long long
#define N 40005 struct P{int fr,to,next;}e[N]; ll n,k,head[N],cnt; inline void add(ll x,ll y){
e[++cnt].to = y;
e[cnt].fr = x;
e[cnt].next = head[x];
head[x] = cnt;
} ll tot,ans; inline void dfs(ll u,ll fa,ll st){
tot ++ ;
if(st == 0)
return ;
for(int i = head[u];i;i = e[i].next){
int v = e[i].to;
if(v == fa)
continue;
dfs(v,u,st - 1);
}
} int main(){
scanf("%lld%lld",&n,&k);
for(int i = 1;i <= n - 1;++i){
ll x,y;
scanf("%lld%lld",&x,&y);
add(x,y);
add(y,x);
}
if(k % 2 == 1){
for(int i = 1;i <= cnt;++i){
tot = 0;
ll u = e[i].fr,v = e[i].to;
dfs(u,v,k / 2);
dfs(v,u,k / 2);
ans = std::max(ans,tot);
}
}
if(k % 2 == 0){
for(int i = 1;i <= n;++i)
tot = 0,dfs(i,0,k / 2),ans = std::max(ans,tot);;
}
std::cout<<n - ans<<std::endl;
}

\(D\ Arrays and Palindrome\)

回来了。

这题是看题解做的。

因为没有怎么看懂题目。

考虑把相等的点连上边,那么要求的是让所有点连上一起。

然后发现如果说出现一个长度为奇数的回文串,最中间的那个点就会没有线连,然后为了让它和其他的点连上,这个点的度数必须是1,然后为了保证一笔画,这样的点必须至多出现两个,所以奇数长度的回文串至多只能有两个,否则就无解了,然后多画几组会发现。。如果出现奇数长度的回文串它们还必须出现在一头一尾

那么就开始构造

那么剩下的就是构造啦

当全部都是偶数的时候,我们在最开头先放一个1,这样后面就错开了,然后第1到m−1都可以直接复制下来,至于最后一个回文串,我们可以放一堆2中间夹一个1这样(具体自己画一下就知道了)

当有一个奇数的时候,我们把它放在A的最后,B的前面部分的构造方式同上,最后一个长度为奇数的回文串就简单一些,直接全部上2就好了

当有两个奇数的时候,我们将其放在一头一尾,然后B的第一个元素设成\(A1+1\),这样后面的情况就和只有一个奇数、并且已经放了一个1的情况一样了,剩下的构造同上

这些都其他人的题解,自己果真是不会做构造题的。

Arrays and Palindrome
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e5+10;
int a[N],b[N*2],lis[3];
int n,m,cnt;
bool firstcheck(){
int cnt=0;
for (int i=1;i<=n;++i)
cnt+=a[i]&1;
return cnt<=2;
}
void get_b(){
int sum;
if (cnt==0){
b[++b[0]]=1; sum=m-1;
for (int i=1;i<n;++i) b[++b[0]]=a[i],sum-=a[i];
if (sum==0) return;
sum-=1; sum/=2;
for (int i=1;i<=sum/2;++i) b[++b[0]]=2;
b[++b[0]]=1;
for (int i=sum/2+1;i<=sum;++i) b[++b[0]]=2;
}
else if (cnt==1){
b[++b[0]]=1;
for (int i=1;i<n;++i) b[++b[0]]=a[i];
for (int i=1;i<=(a[n]-1)/2;++i) b[++b[0]]=2;
}
else{
b[++b[0]]=a[1]+1;
for (int i=2;i<n;++i) b[++b[0]]=a[i];
for (int i=1;i<=(a[n]-1)/2;++i) b[++b[0]]=2;
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d%d",&m,&n);
for (int i=1;i<=n;++i) scanf("%d",a+i);
if (!firstcheck()){printf("Impossible\n"); return 0;}
cnt=0;
for (int i=1;i<=n;++i){
if ((a[i]&1))
lis[++cnt]=i;
}
if (lis[1]) swap(a[n],a[lis[1]]);
if (lis[2]) swap(a[1],a[lis[2]]);
for (int i=1;i<=n;++i) printf("%d ",a[i]); printf("\n"); get_b();
printf("%d\n",b[0]);
for (int i=1;i<=b[0];++i) printf("%d ",b[i]); printf("\n");
}

\(E\ BBQ Hard\)

考虑求这么一个柿子。

\(\sum_i^n\sum_{j = i + 1}^n\binom{a_i + b_i + a_j + b_j}{a_i + a_j}\)

好精妙的一个题目。发现虽然\(n^2\)不在我们的承受范围内,但是\(A^2\)在,看到这种特殊的数据范围,我们应该保持敏感。

我们考虑组合意义\(\binom{a_i + b_i + a_j + b_j}{a_i + a_j}\)为\((-a_i,-b_i)\)到\((a_j,b_j)\)的方案数。

考虑直接\(dp\)求得。

然后变形柿子,

\(Ans = \frac{1}{2}(\sum_i^n\sum_{j}^n\binom{a_i + b_i + a_j + b_j}{a_i + a_j} - \binom{a_i + b_i + a_i + b_i}{a_i + a_i})\)

BBQHard
#include<iostream>
#include<cstdio>
#define ll long long
#define N 2005
#define mod 1000000007 ll f[2 * N + 5][2 * N + 5],a[N * 100],b[N * 100],s[4 * N + 5],inv[4 * N + 5];
ll n; inline ll C(ll a,ll b){return (s[a] * inv[b] % mod * inv[a - b] % mod) % mod;} inline ll pow(ll a,ll b){
ll ans = 1;
while(b){
if(b & 1)
ans = a * ans % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
} ll ans = 0; int main(){
scanf("%lld",&n);
for(int i = 1;i <= n;++i)
scanf("%lld%lld",&a[i],&b[i]),f[N - a[i]][N - b[i]] ++ ;
for(int i = 1;i <= 2 * N;++i)
for(int j = 1;j <= 2 * N;++j)
f[i][j] = (f[i - 1][j] + f[i][j - 1] + f[i][j]) % mod;
s[0] = 1;
for(int i = 1;i <= 4 * N;++i)
s[i] = (s[i - 1] * i) % mod;
inv[4 * N] = pow(s[4 * N],mod - 2);
for(int i = 4 * N - 1;i >= 1;--i)
inv[i] = (inv[i + 1] * (i + 1)) % mod;
for(int i = 1;i <= n;++i)
ans = (ans + f[N + a[i]][N + b[i]] - C(a[i] + a[i] + b[i] + b[i],a[i] + a[i]) + mod) % mod;
std::cout<<(ans * inv[2] % mod)%mod<<std::endl;
}

\(F\ Wide Swap\)

不太会做的。

题解都看了挺久的。

考虑先把这个序列变换一下成为\(Q\)

使\(Q_{p_i} = i\)

那么也是尽量让\(Q\)的排列更小。

那么对于一个\(Q_i - Q_j\)的绝对值小于\(k\)的数值\(Q_i,Q_j\)其相对位置是不变的。

这个大小关系具有传递性,所以一个点只要向他的边界连边就行了。

然后拓扑序列一下就好了(注意要把所有边反向,然后拓扑排序(也就是倒着拓扑排序),但每次优先取编号最大的点,拓扑编号也从 N 往 1 编号)。

代码鸽了。

(总算是写完一套\(AGC\)了,感觉没几题会做的。继续努力吧)

AGC-002

\(A\)

直接考虑判断。

代码不放了。

\(B\ Box and Ball\)

考虑维护这些东西,每个盒子的大小:now[x],以及当前是否有可能有红球may[x]

直接模拟维护就好,最后统计答案。

Box and Ball
#include<iostream>
#include<cstdio>
#define ll long long
#define N 100005 ll n,m,now[N];
bool may[N],out[N]; int main(){
scanf("%lld%lld",&n,&m);
may[1] = 1;
for(int i = 1;i <= n;++i)
now[i] = 1;
for(int i = 1;i <= m;++i){
ll x,y;
scanf("%lld%lld",&x,&y);
if(now[x]){
if(may[x]){
may[y] = may[x];
}
now[x] -- ,now[y] ++ ;
if(!now[x])
may[x] = 0;
}
}
ll ans = 0;
for(int i = 1;i <= n;++i)
if(may[i])
ans ++ ;
std::cout<<ans<<std::endl;
}

[AGC002C] Knot Puzzle

这题写了个不知名贪心。

正确性确实会证。

但是没过。。。

所以先鸽着。

[AGC002E] Candy Piles

开始觉得是对抗搜索,后来觉得是博弈论推结论,后来发现是神仙题。

考虑先把所有的数都排序,那么每次的操作就是把左边一列删除,或者把下面一行删除,那么很轻松的就能求出

观察性质,则有在对角线上的颜色都是一样的,且同一列和同一行的颜色交替出现,那么判断一下(0,0)是不是必胜点就行了。

[AGC002E] Candy Piles
#include <bits/stdc++.h>
using namespace std;
typedef long long LL; template <class T>
inline void read(T &x) {
x = 0;
char c = getchar();
bool f = 0;
for (; !isdigit(c); c = getchar()) f ^= c == '-';
for (; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
x = f ? -x : x;
} template <class T>
inline void write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
T y = 1;
int len = 1;
for (; y <= x / 10; y *= 10) ++len;
for (; len; --len, x %= y, y /= 10) putchar(x / y + 48);
} const int MAXN = 1e5;
int n, a[MAXN + 5]; int main() {
read(n);
for (int i = 1; i <= n; ++i) read(a[i]);
sort(a + 1, a + n + 1, greater<int>());
for (int i = 1; i <= n; ++i)
if (i + 1 > a[i + 1]) {//找到以原点为左下角的最大正方形,其右上方顶点为 (i, i)
int j = 0;
for (; a[j + i + 1] == i; ++j);
if (((a[i] - i) & 1) || (j & 1)) puts("First");
else puts("Second");
break;
}
return 0;
}

这题之后可能会另开一个博客。感觉全写在这里有点乱

【AGC板刷记录】的更多相关文章

  1. 【做题记录】AtCoder AGC做题记录

    做一下AtCoder的AGC锻炼一下思维吧 目前已做题数: 75 总共题数: 239 每一场比赛后面的字母是做完的题,括号里是写完题解的题 AGC001: ABCDEF (DEF) AGC002: A ...

  2. NOIP2018前的一些计划&记录(日更)

    先空着,等停课了再开始写. 诸位好,我是yyb.现在显然已经不再是高一的小蒟蒻了,已经升级为了高二的菜鸡了 现在已经不能再每天划划水切切题了,毕竟......已经高二了,所有的机会从高一的两倍全部除了 ...

  3. Atcoder/Topcoder 口胡记录

    Atcoder/Topcoder 理论 AC Atcoder的❌游戏示范 兴致勃勃地打开一场 AGC 看 A 题,先 WA 一发,然后花了一年时间 Fix. 看 B 题,啥玩意?这能求? 睡觉觉. e ...

  4. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

  5. FJOI2017前做题记录

    FJOI2017前做题记录 2017-04-15 [ZJOI2017] 树状数组 问题转化后,变成区间随机将一个数异或一,询问两个位置的值相等的概率.(注意特判询问有一个区间的左端点为1的情况,因为题 ...

  6. 三个 AGC D(AGC037D、AGC043D、AGC050D)

    大概就 lxr 讲了 4 个 AGC 的 D,有一个以前做过了不算,另外三个都会做罢( 为了避免开三个博客就把它们合并到一起了 AGC 037 D lxr:难度顺序排列大概是 037<043&l ...

  7. 【AGC】引导用户购买提升用户留存率

    借助AGC的云数据库.云托管.应用内消息.App Linking等服务,您可以给不同价值用户设置不同的优惠套餐活动,引导用户持续购买,增强用户黏性.判断用户价值,发送营销短信,引导用户参与营销活动,提 ...

  8. 【AGC】如何快速部署Serverless Url缩短模板

    使用场景 Serverless短URL生成模板实现您将在云数据库服务中URL缩短的诉求.使用此模板后,仅需在云数据库服务侧配置长URL值.Serverless短URL生成模板会在后台与Bitly AP ...

  9. 【AGC】如何使用认证服务与云数据库处理用户信息

    ​使用场景 华为 AGC认证服务可以为应用快速构建安全可靠的用户认证系统,可以实现多种方式关联认证登录.而如何处理这些多种登录方式的用户信息,例如在应用中发布一个活动,哪些用户参加了哪一个活动,这些信 ...

随机推荐

  1. suricata的模块和插槽

    参考资料 suricata官方文档https://suricata.readthedocs.io/en/latest/performance/runmodes.html#different-runmo ...

  2. VS Code C/C++开发环境配置

    VS Code C/C++开发环境配置 一.安装 ​ 1.前往官网下载安装即可 https://code.visualstudio.com/ ​ 2.进入VS Code安装如下插件 二.C/C++开发 ...

  3. 要想玩转FPGA,按这4个步骤来

    FPGA 作为一种高新技术,由于其结构的特殊性,可以重复编程,开发周期较短,越来越受到电子爱好者的青睐,其应用已经逐渐普及到了各行各业.因此,越来越多的学生或工程师都希望跨进FPGA的大门掌握这门技术 ...

  4. 树形DP 枚举祖宗的例题

    这类题目是真的很头疼....其实这类题目的特征也很明显,叶子结点贡献答案时和其所在链的祖宗有关,也就是说要想得知其贡献必须知道他的所有祖宗的贡献,其实处理方法也不是太难,就是在dfs枚举时顺便把祖宗的 ...

  5. Shadertoy 教程 Part 5 - 运用SDF绘制出更多的2D图形

    Note: This series blog was translated from Nathan Vaughn's Shaders Language Tutorial and has been au ...

  6. Oracle 19c 单机

    环境 vm虚拟机 双磁盘 操作系统 Oracle Linux 7.9 操作系统安装带图形 选择中文,注意不要新建用户 关闭防火墙 selinux 配置好IP 挂载系统盘镜像 修改主机名 配置hosts ...

  7. Mysql多实例搭建部署

    [部署背景] 公司测试环境需求多个数据库实例,但是只分配一台MySQL机器,所以进行多实例部署. [部署搭建] 创建软件包路径   mkdir /data/soft/package      /dat ...

  8. linux&c 进程控制 课后习题

    (声明:本篇博客只是博主自己的理解,加以整理,目的是总结刚学过的进程知识,不一定绝对正确,非常愿意听客官您提出宝贵意见.) Q1:进程中的全局数据段(全局变量),局部数据段(局部变量),静态数据段的分 ...

  9. 开源项目|Go 开发的一款分布式唯一 ID 生成系统

    原文连接: 开源项目|Go 开发的一款分布式唯一 ID 生成系统 今天跟大家介绍一个开源项目:id-maker,主要功能是用来在分布式环境下生成唯一 ID.上周停更了一周,也是用来开发和测试这个项目的 ...

  10. Docker学习:起步篇

    Docker-概述 学习资源 最好的资源在官网! Docker官方: Docker 官方主页: https://www.docker.com(opens new window) Docker 官方博客 ...