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)

我们根据上面的讨论很容易发现只要满足两个性质即可:

  1. \(\max(a_i)\le 2m\)
  2. \(\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的更多相关文章

  1. Atcoder Grand Contest 036 D - Negative Cycle

    Atcoder Grand Contest 036 D - Negative Cycle 解题思路 在某些情况下,给一张图加或删一些边要使图合法的题目要考虑到最短路的差分约束系统.这一题看似和最短路没 ...

  2. AtCoder Grand Contest 036 A-C

    目录 \(\bf A - Triangle\) \(\bf B - Do\ Not\ Duplicate\) \(\bf C - GP 2\) \(\bf D - Negative \ Cycle\) ...

  3. AtCoder Grand Contest 036题解

    传送门 爆炸的比较厉害--果然还是菜啊-- \(A\) 我们强制一个点为\((0,0)\),那么设剩下两个点分别为\((a,b),(c,d)\),根据叉积可以计算出面积为\(ad-bc=S\),那么令 ...

  4. AtCoder Grand Contest 036 简要题解

    从这里开始 比赛目录 Problem A Triangle 考虑把三角形移到和坐标轴相交,即 然后能够用坐标比较简单地计算面积,简单构造一下就行了. Code #include <bits/st ...

  5. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  6. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

  7. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

  8. AtCoder Grand Contest 010

    AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...

  9. AtCoder Grand Contest 009

    AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...

随机推荐

  1. java图形界面 计算器实现

    编写程序实现一个简单计算器的基本功能,具体可以模仿Windows附件中的计算器或模拟常见的实物计算器. package beizi; import java.awt.EventQueue; impor ...

  2. LeetCode 350: 两个数组的交集 II Intersection of Two Arrays II

    题目: 给定两个数组,编写一个函数来计算它们的交集. Given two arrays, write a function to compute their intersection. 示例 1: 输 ...

  3. 【文本处理命令】之find搜索命令

    一.find搜索命令 find命令用于按照指定条件查找文件.在系统工作中find命令是不可缺少的,我们一般要查找某个目录下的文件时,都是使用find命令查找,另外find命令也可以配合对查找出的文件进 ...

  4. URLDecoder异常Illegal hex characters in escape (%)

    URLDecoder对参数进行解码时候,代码如: URLDecoder.decode(param,"utf-8"); 有时候会出现类似如下的错误: URLDecoder异常Ille ...

  5. PostgreSQL 12 YUM安装

    目录 1.创建postgres用户 2.查看操作系统版本 3.配置yum源(对应CentOS 6) 4.安装客户端包 5.安装服务器端包 6.初始化数据库和设置自启动服务 7.postgres用户的b ...

  6. 【前端知识体系-NodeJS相关】对于EventLoop(事件轮询)机制你到底了解多少?

    EventLoop 1. EventLoop的执行流程图 ┌───────────────────────┐ ┌─>│ timers │<----- 执行 setTimeout().set ...

  7. oracle 中 to_date 函数的用法

    常犯错的使用方法. to_date('2019-08-12 22:05:','yyyy-MM-dd HH24:mm:ss') Oracle中会引起错误:"ORA 01810 格式代码出现两次 ...

  8. Python爬取Boss直聘,帮你获取全国各类职业薪酬榜

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 王翔 清风Python PS:如有需要Python学习资料的小伙伴 ...

  9. MySQL的5大引擎及优劣之分

    MySQL提供了多个不同的存储引擎,其中5大引擎有:innodb,myisam,memory,merge,csv. 其中优点有:灾难恢复性好.支持事务.使用行级锁.支持外键关联.支持热备份 缺点如下: ...

  10. SQLserver创建用户和给用户权限(学)

    数据库基础知识:http://blog.csdn.net/u014600432/article/details/39645701 在SQL Server中创建用户角色及授权(使用SQL语句):http ...