Link:

AGC002 传送门

A:

……

#include <bits/stdc++.h>

using namespace std;
int a,b;
int main()
{
scanf("%d%d",&a,&b);
if(a>) puts("Positive");
else if(a<=&&b>=) puts("Zero");
else if((b-a)&) puts("Positive");
else puts("Negative");
return ;
}

Problem A

B:

分别用$cnt[i]$和$ok[i]$记录当前的个数以及是否可能计入答案

注意模拟时用$ok[x[i]]$来更新$ok[y[i]]$

#include <bits/stdc++.h>

using namespace std;
const int MAXN=1e5+;
int n,m,x,y,cnt[MAXN],ok[MAXN],res; int main()
{
scanf("%d%d",&n,&m);
ok[]=;
for(int i=;i<=n;i++) cnt[i]=;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
cnt[x]--;cnt[y]++;
if(ok[x]) ok[y]=true;
if(ok[x]&&!cnt[x]) ok[x]=false;
} for(int i=;i<=n;i++) res+=ok[i];
printf("%d",res);
return ;
}

Problem B

C:

又是一道构造题……

遇到输出Possible/Impossible的题目先想一想Impossible的条件是什么

对于此题,明显如果没有$dat[i]+dat[i+1]\ge  L$则无解

那么有解时从两边一路断到中间即可

#include <bits/stdc++.h>

using namespace std;
int n,l,pos,a,b; int main()
{
scanf("%d%d%d",&n,&l,&a);
for(int i=;i<=n;i++)
{
b=a;scanf("%d",&a);
if(a+b>=l) pos=i-;
}
if(!pos) return puts("Impossible"),;
puts("Possible");
for(int i=;i<=pos-;i++) printf("%d\n",i);
for(int i=n-;i>=pos;i--) printf("%d\n",i);
return ;
}

Problem C

D:

整体二分+并查集合并

等把整体二分和cdq分治学好了再来填吧……

E:

题面大意:

有$n$堆石子,每次可以选择取一整堆或选择每堆取一个

取到最后一个石子的人判负

在本蒟蒻看来是博弈里的神题了

将每堆石子按照从多到少排序后,可以发现每进行一次操作,其实就是去掉一整行或一整列

(类似于杨氏矩阵查找时的操作)

最后没有石子时下一次操作的人获胜

因此可以将模型转化为有关路径的模型:

每个人每次可以将起始点向上或向右移动一次,将点移出边界的人判负

接下来推断必胜态和必败态即可:

1、在边界外的一圈都是必胜态

2、根据必败态的定义,对于状态$(x,y)$,如果$(x,y+1),(y,x+1)$均为必胜态则$(x,y)$为必败态

3、根据必胜态的定义,对于状态$(x,y)$,如果$(x,y+1),(y,x+1)$存在必败态则$(x,y)$为必胜态

由此推出起点$(1,1)$的状态:

但$\sum_{i=1}^n a_i$的复杂度不满足要求

通过打表找规律可知:每一条斜率为1的直线上的状态相同

因此除了边界外,不在直线$y=x$上的状态是无关紧要的

于是我们找到$y=x$能延伸到的最远点,设其到上边界距离为$d_i$,到右边界距离为$d_j$

当且仅当$d_i$和$d_j$均为偶数时$(1,1)$为必败态,否则为必胜态。模拟即可

#include <bits/stdc++.h>

using namespace std;
int n,dat[];
bool cmp(int a,int b){return a>b;}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&dat[i]);
sort(dat+,dat+n+,cmp); int row=,col=;
while(dat[row+]>=row+) row++;
while(dat[row+col+]>=row) col++; printf(!((dat[row]-row)&)&&!(col&)?"Second":"First");
return ;
}

Problem E

能总结的思路还是比较多的:

1、对同类操作的合并

同类操作最好能统一处理

通过排序等方式将对每堆进行的总共$n$次操作化为一次操作

2、可以将博弈论问题转化成点的移动模型

由于要确定必胜/必败态,最好能将每一个状态简化,那么点的位置自然是最好表示的状态

3、打表找规律

很多博弈论问题为了简化$SG$函数都要打表找规律,算是要经常用的常规操作

F:

可以先通过有序化来简化问题:

钦定第$i$个0来自于第$i$中颜色,最后的结果乘上$n!$就行了

(可以将颜色序列$1,2,3....n$想成每次用$a_1,a_2,a_3.....a_n$去替换)

此时发现序列要满足:

1、第一个颜色$i$要出现在第$i$个0之后(保证合法性)

2、第一个颜色$i$要出现在第一个颜色$i-1$之后(保证有序性,否则会重复计算)

接下来直接上各种$dp$就行了,维护已有的0的个数和已处理的颜色数

官方题解提供了一种值得借鉴的思路:

由于颜色的有序性,将模型转化为求建图后拓扑排序的方案数

接下来从后往前,令$dp[i][j]$为已有$i$个0,确定了后$j$种颜色的方案数进行$dp$

分两种情况统计:$dp[i][j]=dp[i-1][j]+dp[i][j-1]*C_{i+(k-1)*j-1}^{k-2} (j>i)$

心情好用滚动数组优化下空间

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAXN=,MOD=1e9+;
int n,k,fac[MAXN*MAXN],inv[MAXN*MAXN],dp[MAXN]; ll quick_pow(ll a,ll b)
{
ll ret=;
for(;b;b>>=,a=a*a%MOD)
if(b&) ret=ret*a%MOD;
return ret;
}
ll C(int a,int b)
{if(a<b) return ;return 1ll*fac[a]*inv[a-b]%MOD*inv[b]%MOD;}
void inc(int &a,int b){a+b>MOD?a+=b-MOD:a+=b;} int main()
{
scanf("%d%d",&n,&k);
if(k==) return puts(""),;
fac[]=dp[]=;
for(int i=;i<=n*k;i++) fac[i]=1ll*fac[i-]*i%MOD;
inv[n*k]=quick_pow(fac[n*k],MOD-);
for(int i=n*k-;i>=;i--) inv[i]=1ll*inv[i+]*(i+)%MOD; for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
inc(dp[j],dp[j-]*C(i+(k-)*j-,k-)%MOD); ll res=1ll*dp[n]*fac[n]%MOD;
printf("%lld",res);
return ;
}

Problem F

1、如果不同颜色具有可替代性构造有序性来简化问题和思维难度

2、有序性  $<->$  拓扑排序

3、线性求阶乘逆元、对加法取模优化

用了好几次了,记得套路就行……

[Atcoder Grand Contest 002] Tutorial的更多相关文章

  1. AtCoder Grand Contest 002

    AtCoder Grand Contest 002 A - Range Product 翻译 告诉你\(a,b\),求\(\prod_{i=a}^b i\)是正数还是负数还是零. 题解 什么鬼玩意. ...

  2. AtCoder Grand Contest 002 F:Leftmost Ball

    题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...

  3. [Atcoder Grand Contest 004] Tutorial

    Link: AGC004 传送门 A: …… #include <bits/stdc++.h> using namespace std; long long a,b,c; int main ...

  4. Atcoder Grand Contest 002 F - Leftmost Ball(dp)

    Atcoder 题面传送门 & 洛谷题面传送门 这道 Cu 的 AGC F 竟然被我自己想出来了!!!((( 首先考虑什么样的序列会被统计入答案.稍微手玩几组数据即可发现,一个颜色序列 \(c ...

  5. AtCoder Grand Contest 002 D - Stamp Rally

    Description We have an undirected graph with N vertices and M edges. The vertices are numbered 1 thr ...

  6. AtCoder Grand Contest 002 (AGC002) F - Leftmost Ball 动态规划 排列组合

    原文链接https://www.cnblogs.com/zhouzhendong/p/AGC002F.html 题目传送门 - AGC002F 题意 给定 $n,k$ ,表示有 $n\times k$ ...

  7. 【想法题】Knot Puzzle @AtCoder Grand Contest 002 C/upcexam5583

    时间限制: 2 Sec 内存限制: 256 MB 题目描述 We have N pieces of ropes, numbered 1 through N. The length of piece i ...

  8. [Atcoder Grand Contest 003] Tutorial

    Link: AGC003 传送门 A: 判断如果一个方向有,其相反方向有没有即可 #include <bits/stdc++.h> using namespace std; ]; map& ...

  9. [Atcoder Grand Contest 001] Tutorial

    Link: AGC001 传送门 A: …… #include <bits/stdc++.h> using namespace std; ; ]; int main() { scanf(& ...

随机推荐

  1. 【ZJ选讲·钻石游戏】

    N×M的棋盘(M,N<=500)中,每个格子有一个颜色(颜色数1~9) P次操作(P<=1000),每次给出两个相邻的位置(保证颜色不同,两个格子有一条公共边),把这两个格子交换. 定 ...

  2. hdu1281(棋盘游戏,车的放置)

    Problem Description 给定一个n * m的棋盘,在棋盘里放尽量多的国际象棋中的车,使他们不能相互攻击 已知有些格子不能放置,问最多能放置多少个车 并计算出必须棋盘上的必须点. Inp ...

  3. JavaScript的相等(==)与全等(===)

    有段代码如下: view source   print? 1 if (![] == []) { 2     //Code 3 } ![] == [],true or false? 我们都知道,ECMA ...

  4. 你知道HTML标签设计的本意吗?

    “DIV+CSS”这个词汇不知道害了多少人,也许其提出者本意并没有错,但是跟风者从表现曲解了其意思,认为整个页面就应当是DIV+CSS文件的组合.这样做,对于视觉上并没有什么影响,因为还原了之前设计的 ...

  5. 设备VMnet0上的网络桥接当前未在运行解决办法

    问题: 今天把自己的VM从C盘挪到了D盘,然后再open所有VM都会显示网卡无法桥接了 “vmware 没有未桥接的主机网络适配器” 解决办法: 1.关闭所有VM 2.打开 编辑-虚拟网络编辑器,会发 ...

  6. ES6学习笔记(四)—— async 函数

    await 是 async wait 的简写, 是 generator 函数的语法糖. async 函数的特点: async 声明一个方法是异步的,await 则等待这个异步方法执行的完成 async ...

  7. 使用state模块部署lamp架构

    install_httpd: pkg.installed: - name: httpd httpd_running: service.running: - name: httpd - enable: ...

  8. 【BZOJ1475】方格取数 [最小割]

    方格取数 Time Limit: 5 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description 在一个n*n的方格里,每个格子里都有一 ...

  9. 愚蠢的LCAAAAA~~~~(>_<)~~~~

    很愤怒!特别愤怒!超级愤怒!!! 我LCA居然错了!!而且是那种特别愚蠢的错误 我把代码都交错了!!! silasila 话不多说,代码上特别详细了 #include<bits/stdc++.h ...

  10. [bzoj2186][Sdoi2008]沙拉公主的困惑——数论

    题目大意 求 \[\sum_{i = 1}^{N!} [gcd(i, M!) = 1]\] 题解 显然,题目就是求 \[N!(1-\frac{1}{p_1})(1-\frac{1}{p_2})...\ ...