【AtCoder】ARC065
ARC065
C - 白昼夢 / Daydream
直接递推就好
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
string s;
int dp[MAXN];
void Solve() {
cin >> s;
dp[0] = 1;
for(int i = 1 ; i <= s.length() ; ++i) {
if(i >= 5) {
dp[i] |= (dp[i - 5] && s.substr(i - 5,5) == "dream");
dp[i] |= (dp[i - 5] && s.substr(i - 5,5) == "erase");
}
if(i >= 6) {
dp[i] |= (dp[i - 6] && s.substr(i - 6,6) == "eraser");
}
if(i >= 7) {
dp[i] |= (dp[i - 7] && s.substr(i - 7,7) == "dreamer");
}
}
if(dp[s.length()]) puts("YES");
else puts("NO");
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
D - 連結 / Connectivity
把图两次染色,然后标号,会得到一个点对,这个点对相同的点才在两个图里都连通
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 200005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
map<pii,int> zz;
int N,K,L;
int fa[MAXN],col[MAXN][2],tot;
int getfa(int x) {
return fa[x] == x ? x : fa[x] = getfa(fa[x]);
}
void Solve() {
read(N);read(K);read(L);
for(int i = 1 ; i <= N ; ++i) fa[i] = i;
int a,b;
for(int i = 1 ; i <= K ; ++i) {
read(a);read(b);
fa[getfa(a)] = getfa(b);
}
tot = 0;
for(int i = 1 ; i <= N ; ++i) {
if(getfa(i) == i) col[i][0] = ++tot;
}
for(int i = 1 ; i <= N ; ++i) col[i][0] = col[getfa(i)][0];
for(int i = 1 ; i <= N ; ++i) fa[i] = i;
for(int i = 1 ; i <= L ; ++i) {
read(a);read(b);
fa[getfa(a)] = getfa(b);
}
tot = 0;
for(int i = 1 ; i <= N ; ++i) {
if(getfa(i) == i) col[i][1] = ++tot;
}
for(int i = 1 ; i <= N ; ++i) col[i][1] = col[getfa(i)][1];
for(int i = 1 ; i <= N ; ++i) {
zz[mp(col[i][0],col[i][1])]++;
}
for(int i = 1 ; i <= N ; ++i) {
out(zz[mp(col[i][0],col[i][1])]);space;
}
enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
E - へんなコンパス / Manhattan Compass
曼哈顿转切比雪夫
然后把点对排序,每个点用横坐标相连就是
\(x_{a} - x_{b} = D\)
并且$ -D<= y_{a} - y_{b} <= D$
这是一段区间,我们可以把区间里的点两两相连,再和a点相连,是等价的
然后记录每个点连出去的边有多少,和初始的两个点连通的所有点之间的边数加起来就是答案
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
struct node {
int to,next;
}E[MAXN * 10];
int head[MAXN],sumE;
int N,a,b;
int x[MAXN],y[MAXN],D,id[MAXN],cnt[MAXN];
pii p[MAXN],tmp[MAXN];
int st[MAXN],ed[MAXN];
int fa[MAXN];
int getfa(int x) {
return fa[x] == x ? x : fa[x] = getfa(fa[x]);
}
void Merge(int x,int y) {
fa[getfa(x)] = getfa(y);
}
void AddE(int on) {
for(int i = 1 ; i <= N ; ++i) {
id[i] = i;
}
sort(id + 1,id + N + 1,[](int a,int b){return p[a] < p[b];});
memset(st,0,sizeof(st));memset(ed,0,sizeof(ed));
for(int i = 1 ; i <= N ; ++i) {
tmp[i] = p[id[i]];
}
for(int i = 1 ; i <= N ; ++i) {
int l = lower_bound(tmp + 1,tmp + N + 1,mp(tmp[i].fi + D,tmp[i].se - D + on)) - tmp;
int r = upper_bound(tmp + 1,tmp + N + 1,mp(tmp[i].fi + D,tmp[i].se + D - on)) - tmp - 1;
if(l <= r) {
st[l]++;ed[r]++;
Merge(id[i],id[l]);
cnt[id[i]] += r - l + 1;
}
}
int pre = 0;
for(int i = 1 ; i < N ; ++i) {
pre += st[i];pre -= ed[i];
if(pre) Merge(id[i],id[i + 1]);
}
}
void Solve() {
read(N);read(a);read(b);
for(int i = 1 ; i <= N ; ++i) {
read(x[i]);read(y[i]);
fa[i] = i;
}
D = abs(x[a] - x[b]) + abs(y[a] - y[b]);
for(int i = 1 ; i <= N ; ++i) p[i] = mp(x[i] + y[i],x[i] - y[i]);
AddE(0);
for(int i = 1 ; i <= N ; ++i) swap(p[i].fi,p[i].se);
AddE(1);
int64 ans = 0;
for(int i = 1 ; i <= N ; ++i) {
if(getfa(i) == getfa(a)) ans += cnt[i];
}
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
F - シャッフル / Shuffling
就是对于一个区间,记录能用a个0和b个1
然后对于某个位置填0还是填1
由于能用的数是总和是确定的,我们只要记录当前有a个0没用就可以了
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 3005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 1000000007;
int ri[MAXN],f[2][MAXN];
int N,M;
char s[MAXN];
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void update(int &x,int y) {
x = inc(x,y);
}
void Solve() {
read(N);read(M);
scanf("%s",s + 1);
int l,r;
for(int i = 1 ; i <= M ; ++i) {
read(l);read(r);
ri[l] = max(ri[l],r);
}
int p = 0,all = 0;
int cur = 0;
f[cur][0] = 1;
for(int i = 1 ; i <= N ; ++i) {
if(p < i - 1) {p = i - 1;}
if(ri[i] > p) {
all += ri[i] - p;
int a = 0,b = 0;
for(int j = p + 1 ; j <= ri[i] ; ++j) {
if(s[j] == '0') ++a;
else ++b;
}
p = ri[i];
memset(f[cur ^ 1],0,sizeof(f[cur ^ 1]));
for(int j = a ; j <= N ; ++j) f[cur ^ 1][j] = f[cur][j - a];
cur ^= 1;
}
if(!all) continue;
memset(f[cur ^ 1],0,sizeof(f[cur ^ 1]));
for(int j = 0 ; j <= all ; ++j) {
if(j < all) update(f[cur ^ 1][j],f[cur][j]);
if(j >= 1) update(f[cur ^ 1][j - 1],f[cur][j]);
}
--all;
cur ^= 1;
}
out(f[cur][0]);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
【AtCoder】ARC065的更多相关文章
- 【AtCoder】ARC092 D - Two Sequences
[题目]AtCoder Regular Contest 092 D - Two Sequences [题意]给定n个数的数组A和数组B,求所有A[i]+B[j]的异或和(1<=i,j<=n ...
- 【Atcoder】CODE FESTIVAL 2017 qual A D - Four Coloring
[题意]给定h,w,d,要求构造矩阵h*w满足任意两个曼哈顿距离为d的点都不同色,染四色. [算法]结论+矩阵变换 [题解] 曼哈顿距离是一个立着的正方形,不方便处理.d=|xi-xj|+|yi-yj ...
- 【AtCoder】ARC 081 E - Don't Be a Subsequence
[题意]给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串. http://arc081.contest.atcoder.jp/tasks/arc081_c [算法]字 ...
- 【AtCoder】AGC022 F - Leftmost Ball 计数DP
[题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...
- 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT
[题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...
- 【AtCoder】ARC067 F - Yakiniku Restaurants 单调栈+矩阵差分
[题目]F - Yakiniku Restaurants [题意]给定n和m,有n个饭店和m张票,给出Ai表示从饭店i到i+1的距离,给出矩阵B(i,j)表示在第i家饭店使用票j的收益,求任选起点和终 ...
- 【AtCoder】ARC095 E - Symmetric Grid 模拟
[题目]E - Symmetric Grid [题意]给定n*m的小写字母矩阵,求是否能通过若干行互换和列互换使得矩阵中心对称.n,m<=12. [算法]模拟 [题解]首先行列操作独立,如果已确 ...
- 【Atcoder】AGC022 C - Remainder Game 搜索
[题目]C - Remainder Game [题意]给定n个数字的序列A,每次可以选择一个数字k并选择一些数字对k取模,花费2^k的代价.要求最终变成序列B,求最小代价或无解.n<=50,0& ...
- 【Atcoder】AGC 020 B - Ice Rink Game 递推
[题意]n个人进行游戏,每轮只保留最大的a[i]倍数的人,最后一轮过后剩余2人,求最小和最大的n,或-1.n<=10^5. [算法]递推||二分 [题解]令L(i),R(i)表示第i轮过后的最小 ...
随机推荐
- error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const
类中包含信号槽在在类的声明中一定得使用Q_OBJECT.当编译出现问题上述问题时. 解决方法: 1.删除项目中的头文件以及源文件,再添加. 2.在头文件中对该类进行声明,不是使用class mycla ...
- Luogu5369 [PKUSC2018]最大前缀和
题目链接:洛谷 题目大意:给定一个长为$n$的整数序列,求全排列的最大前缀和(必须包含第一个数)之和. 数据范围:$1\leq n\leq 20,1\leq \sum_{i=1}^n|a_i|\leq ...
- 使用zabbix-proxy
事情背景: vt上两个vps,只提供ipv6.(因为便宜嘛).而我的zabbix服务器在腾讯云.它丫的没有ipv6. 那么我没法监控它们了呀... 这咋个行呢? 想办法... 我还有另外的vps 可以 ...
- Zabbix+Grafana 展示示例1
Zabbix+Grafana 展示示例 Grafana是一个跨平台的开源度量分析和可是化的工具,可以通过该将采集的数据查询然后可视化的展示,并及时通知. 1. Grafana 特性 1. 展示方式:快 ...
- Mybatis——更新DB表的字段时,应该注意的点
1.记录下哪些表发生了字段更新. 2.利用Navicat将最新的数据库(schema)转储SQL文件到项目的sql目录下,作为备份 3.依次更新 被记录表所对应的Po类,确保类的域和表的字段一一对应, ...
- shell 重定向0,1,2
.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出,比如 >a.txt 表示将错误信息输出到文件a.txt中. #将1,2输出转发给/dev/null设 ...
- 二十三、Linux任务计划及周期性任务执行:at、crontab命令
一.概述 未来的某时间点执行一次某任务:at, batch周期性运行某任务:crontab 这两个任务的执行结果:会通过邮件发送给用户 (本地终端用户之间的邮件通知) centos 5,6,7默认开启 ...
- MySQL inodb cluster部署
innodb cluster是基于组复制来实现的. 搭建一套MySQL的高可用集群innodb. 实验环境: IP 主机名 系统 软件 192.168.91.46 master RHEL7.4 mys ...
- Python语法 - 生成器
生成器基本概念 1 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束 2 生成器表达式能做的事情列表解析基本都能处理,只不 ...
- 重读APUE(2)-read返回值少于要求读取字节数
返回值: 成功返回读到的字节数,如果达到文件尾,则返回0:注意:如果有数据第一次读取会返回全部读到的字节数,下一次读取才会返回0: 出错返回-1: 返回值少于要求读取字节数的情况: 1. 读取普通文件 ...