AtCoder Grand Contest 036
Preface
这篇已经鸽了好久的说,AGC037都打完了才回来补所以题目可能都记不大清楚了,如有错误请指正
这场感觉难度远高于上一场,从D开始就不会了,E没写(看了题解都不会写),F就是抄曲明姐姐的
我还是太弱了
A - Triangle
刚开始想了一堆很SB的做法,后来才想到用叉积来解决
考虑构造向量\((a,b),(c,d)\),同时定下一个点在原点处,此时的三角形面积就是\(ad-bc\)
可以考虑像CXRdalao一样取一个底数\(10^9\)构造,也可以像我一样先随便搞出一个\(ad\)比\(S\)略大一些,然后暴枚一下\(bc\)即可
#include<cstdio>
#include<cmath>
#define RI register int
using namespace std;
const int LIM=1e9;
long long s; int a,b,c,d;
int main()
{
scanf("%lld",&s); a=d=(int)sqrt(s);
while (1LL*a*d<s) if (a<d) ++a; else ++d;
long long left=1LL*a*d-s; for (RI i=1;1LL*i*i<=left;++i)
if (left%i==0&&i<=LIM&&left/i<=LIM) { b=i; c=left/i; break; }
return printf("0 0 %d %d %d %d",a,b,c,d),0;
}
B - Do Not Duplicate
题意可能比较复杂。。。
稍微理解并画个图就会发现这种操作是有循环节的,然后画个图就知道循环节长度不会超过\(n\)
模拟找出循环节然后取个膜再模拟一遍233
#include<cstdio>
#define RI register int
#define CI const int&
using namespace std;
const int N=400005;
int n,a[N],nxt[N],lst[N],pos,cur,ans[N],cnt; long long k;
int main()
{
//freopen("B.in","r",stdin); freopen("B.out","w",stdout);
RI i; for (scanf("%d%lld",&n,&k),i=1;i<=n;++i)
scanf("%d",&a[i]),a[n+i]=a[i];
for (i=(n<<1);i>n;--i) lst[a[i]]=i-n;
for (i=n;i;--i) nxt[i]=lst[a[i]],lst[a[i]]=i;
//for (i=1;i<=n;++i) printf("%d ",nxt[i]);
for (pos=cur=1,i=1;i<=n;++i)
{
int pxt=nxt[pos]; if (pxt<=pos) ++cur;
pos=pxt+1; if (pos==1) { --cur; break; }
}
for (pos=1,k%=cur,cur=0;;)
{
int pxt=nxt[pos]; if (pxt<=pos) ++cur;
if (cur==k) break; pos=pxt+1;
}
for (;;)
{
int pxt=nxt[pos]; if (pxt<=pos) ans[++cnt]=a[pos++];
else pos=pxt+1; if (pos>n) break;
}
for (i=1;i<=cnt;++i) printf("%d ",ans[i]);
return 0;
}
C - GP 2
挺妙的一题,和陈指导聊天的时候突然就出来了,以下是我们聊天的过程:
CXR:这种题目肯定就是把那个操作转化成一个好统计一点的操作。
我:说的太好了,您太稳了。
CXR:所以我们考虑按等于\(1\)的数的个数讨论。
我:这显然数不清楚啊,限定的范围太小了。
CXR:那么我们按加了\(1\)的数的个数讨论。
我:这TM更加复杂了,我TM直接按多少个奇数讨论,全不全面?
(一阵沉默之后我们发现按奇数讨论十分有道理,然后就出来了233)
我们根据上面的讨论很容易发现只要满足两个性质即可:
- \(\max(a_i)\le 2m\)
- \(\sum (a_i\mod 2)\le m\)
所以我们只需要枚举奇数的个数,然后考虑剩下的都可以随便分。运用以下隔板法就可以算出满足2的序列个数
然后我们减去不满足1的序列个数即可,具体的,从\(2m+1\)到\(3m\)枚举最大值(最大值显然只有一个),然后再运用隔板法得出分配方案即可
#include<cstdio>
#define RI register int
#define CI const int&
using namespace std;
const int N=3000005,mod=998244353;
int n,m,fact[N],inv[N],ans,tp;
inline void inc(int& x,CI y)
{
if ((x+=y)>=mod) x-=mod;
}
inline void dec(int& x,CI y)
{
if ((x-=y)<0) x+=mod;
}
inline int quick_pow(int x,int p=mod-2,int mul=1)
{
for (;p;p>>=1,x=1LL*x*x%mod) if (p&1) mul=1LL*mul*x%mod; return mul;
}
inline int C(CI n,CI m)
{
if (n<m) return 0; return 1LL*fact[n]*inv[m]%mod*inv[n-m]%mod;
}
inline void init(CI n)
{
RI i; for (fact[0]=i=1;i<=n;++i) fact[i]=1LL*fact[i-1]*i%mod;
for (inv[n]=quick_pow(fact[n]),i=n-1;~i;--i) inv[i]=1LL*inv[i+1]*(i+1)%mod;
}
int main()
{
RI i; scanf("%d%d",&n,&m); init(n+3*m);
for (i=0;i<=m;++i) if (!((3*m-i)&1))
tp=(3*m-i)/2,inc(ans,1LL*C(n,i)*C(tp+n-1,n-1)%mod);
for (i=2*m+1;i<=3*m;++i) dec(ans,1LL*n*C(3*m-i+n-2,n-2)%mod);
return printf("%d",ans),0;
}
D - Negative Cycle
思路十分巧妙的一题(以下下标从\(1\)开始标号)
首先我们考虑这张图没有负环,那么就意味着我们可以跑最短路,它满足以下基本条件:
记\(d_i\)为\(1\to i\)的最短路,则对于\((x,y)\in E\),有\(d_x+w(x,y)\ge dis_y\)
然后我们发现所有的\(0\)边都不能删,因此\(d_i\ge d_{i+1}\)
然后后面的我就想不出了,ORZ曲明姐姐
我们定义一个\(q_i=d_i-d_{i+1}\),则有\(q_i\ge 0\),并且\(q_i\in[0,1]\)
那么如果有一条长度为\(1\)的边\((x,y)\),有\(d_x+1\ge d_y\),即\(\sum_{i=y}^{x-1}q_i\le 1\)
那么如果有一条长度为\(-1\)的边\((x,y)\),有\(d_x-1\ge d_y\),即\(\sum_{i=x}^{y-1}q_i\ge 1\)
那么我们就可以根据这个性质搞一个DP,令\(f_{i,j}\)表示考虑完了前\(i\)个\(q\),满足\(q_i=1\),且上一个为\(1\)的是\(j\)。我们考虑枚举下一个为\(1\)的位置\(k\)
考虑哪些边要被删掉,首先是长度为\(1\)的边,且满足\(r>k,i<l<j\)的\((r,l)\)
其次是长度为\(-1\)的边,且满足\(j<l<r\le k\)的\((l,r)\)
然后发现这两个限制的代价和都可以前缀和预处理出来,因此复杂度就是\(O(n^3)\)
#include<cstdio>
#include<iostream>
#define RI register int
#define CI const int&
using namespace std;
const int N=505;
const long long INF=1e18;
int n,a[N][N]; long long s1[N][N],s2[N][N],f[N][N],ans=INF;
int main()
{
RI i,j,k; for (scanf("%d",&n),i=1;i<=n;++i)
for (j=1;j<=n;++j) if (i!=j) scanf("%d",&a[i][j]);
for (i=1;i<=n;++i) for (j=i+1;j<=n+1;++j)
for (s1[i][j]=s1[i][j-1],k=i;k<j;++k) s1[i][j]+=a[k][j];
for (i=1;i<=n;++i) for (j=n;j>i;--j)
for (s2[i][j]=s2[i][j+1],k=1;k<=i;++k) s2[i][j]+=a[j][k];
for (i=0;i<=n+1;++i) for (j=i;j<=n+1;++j) f[i][j]=INF;
for (f[0][0]=i=0;i<=n;++i) for (j=i;j<=n;++j) if (f[i][j]!=INF)
for (k=j+1;k<=n+1;++k) f[j][k]=min(f[j][k],f[i][j]+s1[j+1][k]+s2[j][k+1]-s2[i][k+1]);
for (i=0;i<=n;++i) ans=min(ans,f[i][n+1]); return printf("%lld",ans),0;
}
E - ABC String
太仙了不会做QAQ
F - Square Constraints
完全就是抄曲明姐姐的,题解可以去她博客看
贴一下基本一样的代码
#include<cstdio>
#include<utility>
#include<cstring>
#include<algorithm>
#define RI register int
#define CI const int&
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef pair <int,int> pi;
const int N=1005;
int n,mod,f[N],c[N],cnt,ans; pi t[N];
inline void inc(int& x,CI y)
{
if ((x+=y)>=mod) x-=mod;
}
inline int Mod(int x)
{
while (x>=mod) x-=mod; while (x<0) x+=mod; return x;
}
inline int F(CI x)
{
int y=0; while (y<(n<<1)&&x*x+y*y<n*n) ++y; return y;
}
inline int G(CI x)
{
int y=0; while (y<(n<<1)&&x*x+y*y<=(n<<1)*(n<<1)) ++y; return y;
}
int main()
{
RI i,j,k; scanf("%d%d",&n,&mod);
for (i=0;i<n;++i) t[++cnt]=mp(F(i),-i);
for (i=n;i<(n<<1);++i) t[++cnt]=mp(G(i),1);
for (i=0;i<n;++i) c[i]=G(i); sort(t+1,t+cnt+1);
//for (i=1;i<=cnt;++i) printf("%d%c",t[i]," \n"[i==cnt]);
for (k=0;k<=n;++k)
{
memset(f,0,(k+1)<<2); f[0]=1; int s1=0,s2=0;
for (i=1;i<=cnt;++i) if (t[i].se==1)
{
for (j=0;j<=s2;++j) f[j]=1LL*f[j]*Mod(t[i].fi-s1-j)%mod; ++s1;
} else
{
for (j=s2;~j;--j) inc(f[j+1],1LL*f[j]*Mod(t[i].fi-s1-j)%mod),
f[j]=1LL*f[j]*Mod(c[-t[i].se]-(n+k+s2-j))%mod; ++s2;
}
//printf("%d %d\n",k,f[k]);
if (k&1) inc(ans,Mod(-f[k])); else inc(ans,f[k]);
}
return printf("%d",ans),0;
}
Postscript
完了我发现我现在什么都不会了
AtCoder Grand Contest 036的更多相关文章
- Atcoder Grand Contest 036 D - Negative Cycle
Atcoder Grand Contest 036 D - Negative Cycle 解题思路 在某些情况下,给一张图加或删一些边要使图合法的题目要考虑到最短路的差分约束系统.这一题看似和最短路没 ...
- AtCoder Grand Contest 036 A-C
目录 \(\bf A - Triangle\) \(\bf B - Do\ Not\ Duplicate\) \(\bf C - GP 2\) \(\bf D - Negative \ Cycle\) ...
- AtCoder Grand Contest 036题解
传送门 爆炸的比较厉害--果然还是菜啊-- \(A\) 我们强制一个点为\((0,0)\),那么设剩下两个点分别为\((a,b),(c,d)\),根据叉积可以计算出面积为\(ad-bc=S\),那么令 ...
- AtCoder Grand Contest 036 简要题解
从这里开始 比赛目录 Problem A Triangle 考虑把三角形移到和坐标轴相交,即 然后能够用坐标比较简单地计算面积,简单构造一下就行了. Code #include <bits/st ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
- AtCoder Grand Contest 010
AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...
- AtCoder Grand Contest 009
AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...
随机推荐
- Codeforces Round #597 (Div. 2) F. Daniel and Spring Cleaning 数位dp
F. Daniel and Spring Cleaning While doing some spring cleaning, Daniel found an old calculator that ...
- matlab中的colormap
matlab colormaps 默认颜色图是 parula ,颜色图从左往右数值不断增大. 颜色图名称 色阶 parula jet hsv hot cool spring summer autumn ...
- java之运算符的优先级
优先级 运算符 结合性 1 () [] 从左往右 2 ! +(正) -(负) ++ -- 从右往左 3 * / % 从左往右 4 << >> >>> 从左往 ...
- Linux 学习记录二(文件的打包压缩).
和 window不同,在Linux压缩文件需要注意的是,压缩后的文件会把源文件给替代,无论是gzip.bzip2.xz 均不支持压缩目录,要达到压缩目录的目的,需要用到tar指令. gzip 压缩 ...
- Java连载39-构造方法详解
一. 1.多行注释:CTRL + shift + / 2.当一个类中没有定义任何构造方法的话,系统默认给该类提供一个无参数的构造方法,这个构造方法被称为缺省构造器. public class D39 ...
- Jmeter 压测使用以及参数介绍
. 下载地址 https://jmeter.apache.org/download_jmeter.cgi Binaries¶ 下的apache-jmeter-5.2.1.zipsha512pgp . ...
- 13-scrapy中selenium的应用
一. 引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们 ...
- F5的作用
F5 F5的全称是F5-BIG-IP-GTM,是最流行的硬件负载均衡设备,其并发能力达到百万级.F5的主要特性包括: 多链路的负载均衡和冗余 可以接入多条ISP链路,在链路之间实现负载均衡和高可用. ...
- P站全新官方精选集Pixivision
P站是一个主要由日本艺术家所组成的虚拟社群,主打插画.漫画.二次元作品网上沟通. 不过好消息是,P站全新的精选网站Pixivision上线了,多种语言界面,国内用户访问毫无压力. 近期精选的一系列作品 ...
- 【转载】修改Windows下键盘按键对应功能的一些方案
原文见:https://sites.google.com/site/xiangyangsite/home/technical-tips/windows-tips/multi_media_key_cus ...