首页 > 其他分享 >AtCoder Grand Contest 063

AtCoder Grand Contest 063

时间:2023-09-15 17:35:45浏览次数:34  
标签:AtCoder 063 infty Contest int typedef long include define

Preface

AGC好难啊,这场补完最近就没啥比赛好补了,接下来去训练下专题吧

像C题这种美妙的人类智慧题感觉以我的脑子一辈子也想不出来www


A - Mex Game

对于任意一段前缀,我们可以求出对应的每个人的操作次数以及每个人拥有的位置数

考虑Alice的最优策略一定是从小到大地放入Bob对应的格子所对的下标,Bob同理

因此只要检验一下谁的格子还有剩余即可

#include<cstdio>
#include<iostream>
#include<utility>
#include<vector>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<set>
#include<array>
#include<random>
#include<bitset>
#include<ctime>
#include<limits.h>
#include<assert.h>
#include<unordered_set>
#include<unordered_map>
#define RI register int
#define CI const int&
#define mp make_pair
#define fi first
#define se second
#define Tp template <typename T>
using namespace std;
typedef long long LL;
typedef long double LDB;
typedef unsigned long long u64;
typedef __int128 i128;
typedef pair <int,int> pi;
typedef vector <int> VI;
typedef array <int,3> tri;
const int N=200005;
int n,CA,CB; char s[N];
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	RI i; if (scanf("%d%s",&n,s+1),s[1]=='A') ++CA; else ++CB;
	for (i=2;i<=n+1;++i)
	{
		if (s[i]=='A') ++CA; else ++CB;
		int OA=i/2,OB=(i-1)/2;
		puts(CA-OB>0?"Alice":"Bob");
	}
	return 0;
}

B - Insert 1, 2, 3, ...

刚开始想假了写了个线段树上二分,后面发现就是个傻逼题

首先考虑当左端点确定时,合法的右端点的取值一定是连续的一段,这就提示我们考虑如何对于每个左端点快速求出右端点

手玩一下会发现如果我们把所有无法被表示的下标扔到一个栈里,只要每次看一下能否在这次操作中把栈顶元素表示掉即可

总复杂度\(O(n)\),具体实现看代码

#include<cstdio>
#include<iostream>
#include<utility>
#include<vector>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<set>
#include<array>
#include<random>
#include<bitset>
#include<ctime>
#include<limits.h>
#include<assert.h>
#include<unordered_set>
#include<unordered_map>
#define RI register int
#define CI const int&
#define mp make_pair
#define fi first
#define se second
#define Tp template <typename T>
using namespace std;
typedef long long LL;
typedef long double LDB;
typedef unsigned long long u64;
typedef __int128 i128;
typedef pair <int,int> pi;
typedef vector <int> VI;
typedef array <int,3> tri;
const int N=500005;
int n,a[N],stk[N],top; LL ans;
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	RI i; for (scanf("%d",&n),i=1;i<=n;++i) scanf("%d",&a[i]);
	for (stk[top=1]=n+1,a[n+1]=-1,i=n;i>=1;--i)
	{
		stk[++top]=i; int lst=1;
		while (a[stk[top]]==lst) --top,++lst;
		ans+=stk[top]-i;
	}
	return printf("%lld",ans),0;
}

C - Add Mod Operations

人类智慧题,完全想不到的说

首先把无解的情况判掉,显然当出现\(\exist i,j\in[1,n],a_i=a_j\and b_i\ne b_j\)这种情况就一定不合法,否则均可以构造解

然后我们可以对\(a_i\)升序排序,考虑如果每次操作\(y=\max(a)+x\),那么总可以把序列中最大的元素变成\(0\)并将其它元素加上\(x\)

考虑先依照此法操作\(n\)次,这样我们得到的序列形如:\(0,x_n,x_n+x_{n-1},\cdots,\sum_{i=3}^n x_i,\sum_{i=2}^n x_i\)

不难发现相邻两项间的差值总是正的,那么如果\(b\)满足单调不降且\(b_1=0\)那么就可以确定一组\(\{x_n\}\)

但如果不满足的话我们也有方法,不妨搞一个很大的数\(\infty\),然后令\(b'_i=b_i+(i-1)\times \infty\),这样\(\{b'\}\)就是单调不降的

我们只需要在最后一次操作做一遍\(x_{n+1}=b_1,y_{n+1}=\infty\)即可

但题目要求的是操作次数要\(\le n\),这样就得考虑怎么样可以省下一次操作,不难发现其实最后操作\(n\)次的序列中并没有\(x_1\),这就提醒我们从这里入手

考虑把原来操作的\(x_1\)修改为\(x_1-a_1\),这样在操作\(n-1\)次后的序列就形如:\(\sum_{i=1}^{n-1} x_i,0,x_{n-1},\cdots,\sum_{i=3}^{n-1} x_i,\sum_{i=2}^{n-1} x_i\)

不妨修改\(b'_1=b_1+(n-1)\times \infty,b'_i=b_i+(i-1)\times \infty (i\in[2,n])\),这样最后一次操作\(x_n=b_2,y_n=\infty\)即可

实现中取\(\infty =2\times 10^9+1\)即可

#include<cstdio>
#include<iostream>
#include<utility>
#include<vector>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<set>
#include<array>
#include<random>
#include<bitset>
#include<ctime>
#include<limits.h>
#include<assert.h>
#include<unordered_set>
#include<unordered_map>
#define int long long
#define RI register int
#define CI const int&
#define mp make_pair
#define fi first
#define se second
#define Tp template <typename T>
using namespace std;
typedef long long LL;
typedef long double LDB;
typedef unsigned long long u64;
typedef __int128 i128;
typedef pair <int,int> pi;
typedef vector <int> VI;
typedef array <int,3> tri;
const int N=1005,INF=2e9+1;
int n,a[N],b[N],x[N],y[N]; pi d[N];
inline void work(CI x,CI y)
{
	for (RI i=1;i<=n;++i) a[i]=(a[i]+x)%y;
}
signed main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	RI i,j; for (scanf("%lld",&n),i=1;i<=n;++i) scanf("%lld",&a[i]);
	for (i=1;i<=n;++i) scanf("%lld",&b[i]),d[i]=pi(a[i],b[i]);
	for (i=1;i<=n;++i) for (j=i+1;j<=n;++j)
	if (a[i]==a[j]&&b[i]!=b[j]) return puts("No"),0;
	sort(d+1,d+n+1); n=unique(d+1,d+n+1)-d-1;
	for (i=1;i<=n;++i) a[i]=d[i].fi,b[i]=d[i].se;
	if (n==1) return printf("Yes\n1\n%lld %lld\n",(b[1]-a[1]+INF)%INF,INF),0;
	x[1]=b[1]-b[n]+INF-a[1]; x[n]=b[2]; y[n]=INF;
	for (i=2;i<=n-1;++i) x[i]=b[n-i+2]-b[n-i+1]+INF;
	for (i=1;i<=n-1;++i) y[i]=a[n-i+1]+x[i],work(x[i],y[i]);
	for (printf("Yes\n%lld\n",n),i=1;i<=n;++i) printf("%lld %lld\n",x[i],y[i]);
	return 0;
}

Postscript

感觉以后AGC先放放不补了,以我现在的水平AGC的妙处都体会不太到,后面的题目是一点做不了

标签:AtCoder,063,infty,Contest,int,typedef,long,include,define
From: https://www.cnblogs.com/cjjsb/p/17705553.html

相关文章

  • AtCoder Grand Contest 058 F Authentic Tree DP
    洛谷传送门AtCoder传送门人生中第一道AtCoder问号题。设\(P=998244353\)。注意到\(f(T)\)的定义式中,\(\frac{1}{n}\)大概是启示我们转成概率去做。发现若把\(\frac{1}{n}\)换成\(\frac{1}{n-1}\)答案就是\(1\),所以\(\frac{1}{n}\)大概是要转成点数之类的。......
  • The 2021 ICPC Asia Macau Regional Contest
    目录写在前面AKFCGI写在最后写在前面比赛地址:https://codeforces.com/gym/104373当了一场口胡选手。我是彩笔。以下按个人向难度排序。A随便找条路径,检查路径是否满足条件,满足则直接输出,否则倒序输出。CodebyYRMrSu:#include<bits/stdc++.h>#defineLLlonglongusing......
  • AtCoder Beginner Contest 319 全部题解
    AtCoderBeginnerContest319全部题解ALegendaryPlayers该题只需使用判断来写出所有的答案,注意不要复制错。#include<bits/stdc++.h>usingnamespacestd;strings;intmain(){ cin>>s; if(s=="tourist")cout<<3858<<endl; if(s=="ksun4......
  • The 2020 ICPC Asia Shenyang Regional Programming Contest DFIK
    The2020ICPCAsiaShenyangRegionalProgrammingContest-CodeforcesDFIKD.JourneytoUn'Goro思路:思维+搜索一开始以为是构造,好吧但是是搜索。我们先考虑什么时候是最大值?首先考虑,题目要求我们从\(i->j\)且红色的数量是奇数被认为是好的。那么我们考虑记录\(p......
  • 2022-2023 ACM-ICPC German Collegiate Programming Contest (GCPC 2022)
    A.AlternativeArchitecture当倾斜放置时,一定可以构成直角三角形。枚举高用勾股定理算出底,然后在利用相似三角形即可算出另一条构成的直角三角形的边长,此时判断边是否都是整数即可。原图实际上点在格子上,一个常见的套路是边减一就可以转换成点在定点上。#include<bits/stdc+......
  • AtCoder Beginner Contest 044 C (背包DP、思维、*1583)
    C-TakandCards题意:给定$N$个正整数$x_1,x_2,\cdot\cdot\cdot,x_n$和一个正整数$A$,问从中选择$k$个数\((k>0)\),满足:这$k$个数的平均值是$A$的方案总数是多少?思路:......
  • Codeforces Round 819 (Div. 1 + Div. 2) and Grimoire of Code Annual Contest 2022
    给一个长为\(n\)的正整数数组,执行以下操作严格一次。选择\(l,r,(1\leql<r\leqn)\),任意一个正整数\(k\)。重复\(k\)次:让\([l,r]\)的数组成环,按顺时针走一次。希望\(a_n-a_1\)最大,找到这个数。分类讨论题。先判断\(n\)为\(1\)时\(a_n-a_1\)......
  • 2019-2020 ACM-ICPC Brazil Subregional Programming Contest
    D.DenouncingMafia给定一颗树,然后给定\(k\)个起点,对于每个起点来说,从该点到根节点的一条链都会被染色,求最多有几个点会被染色\(3\leqn\leq1e5,1\leqk\leqn\)题解我们贪心的来看,起点一定会选择在叶子节点,假设叶子节点的数量为\(cnt\),所以如果\(k\geqcnt\),那么......
  • 2022 Hubei Provincial Collegiate Programming Contest G. Brick(gym103729)
    大意给出底层高度,用1*2的砖块将总形状铺成等高矩形,使得高度最小(不能放在外面)题解奇妙做法当高度同奇偶时显然x可以的话x+2也可以,直接加一层竖的,所以首先分奇偶二分高度有解的必要条件1是,把矩形黑白方格染色之后未填的黑=白(一个1*2刚好覆盖1黑1白)然后从左往右放砖块,可以感受......
  • 2019 ICPC Universidad Nacional de Colombia Programming Contest
    A.Amazon给定\(n\)条直线(存在共线的情况),在每两条垂直的直线的交点处需要建一个交叉点,求交叉点的数量,注意需要去除共线时候的交叉点题解因为要除去共线的情况,我们考虑将一条直线以方向向量\(v\),与\(x\)轴的交点的横坐标\(x\)的方式存储注意:对于\(v\)来说需要最简形......