F. Monkeying Around   维护点在多少个线段上

http://codeforces.com/gym/101350/problem/F

题意:有m个笑话,每个笑话的区间是[L, R],笑话种类有1e5,一开始所有猴子都在凳子上,听到一个笑话,就倒下,但是如果是听过的笑话,就重新回到凳子上。问最终有多少个猴子在凳子上。

相当于有1e5个线段,如果我们能知道第i个猴子,被多少个线段覆盖了,那么可以找出那些线段中的最后那一条,就是最后覆盖上去的那一条,那条线段是哪一个笑话,设为k,如果这个笑话覆盖这个猴子的次数 > 1,那么这个猴子将会回到凳子上。也就是只和最后一步有关

那么,假如有线段:

按左端点排序:[1, 100], [2, 2]  ,一个扫描变量p1 = 1开始

按右端点排序:[2, 2],  [1, 100], 一个扫描变量p2 = 1开始

就能很快判断到第i个猴子被那些线段覆盖了。

按顺序枚举每一个猴子i,比如i = 2

那么,把i >= segment1[p1].L的都表明这条线段能覆盖i

吧i > segment2[p2].R的都表明这条线段已经离开了i

然后统计即可。

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = 2e5 + ;
struct Node {
int L, R, id;
}one[maxn], two[maxn];
bool cmp1(struct Node a, struct Node b) {
return a.L < b.L;
}
bool cmp2(struct Node a, struct Node b) {
return a.R < b.R;
}
int idForJoke[maxn];
int has[maxn];
set<int>ss;
void work() {
ss.clear();
memset(has, , sizeof has);
int n, m;
scanf("%d%d", &n, &m);
for (int i = ; i <= m; ++i) {
int pos, joke, dis;
scanf("%d%d%d", &pos, &joke, &dis);
one[i].L = max(, pos - dis), one[i].R = min(n, pos + dis), one[i].id = i;
two[i] = one[i];
idForJoke[i] = joke;
}
sort(one + , one + + m, cmp1);
sort(two + , two + + m, cmp2);
int ans = , p1 = , p2 = ;
for (int i = ; i <= n; ++i) {
while (p1 <= m && i >= one[p1].L) {
ss.insert(one[p1].id);
has[idForJoke[one[p1].id]]++;
++p1;
}
while (p2 <= m && i > two[p2].R) {
ss.erase(two[p2].id);
has[idForJoke[two[p2].id]]--;
++p2;
}
if (ss.size()) {
ans += has[idForJoke[*ss.rbegin()]] > ;
} else ans++;
}
printf("%d\n", ans);
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int t;
scanf("%d", &t);
while (t--) work();
return ;
}

G. Snake Rana  容斥原理 + 数学

题意是给定一个n * m(n, m <= 1e4)的地图,有k <= 20个污点,问有多少个子矩形,不包含任何一个污点

首先要知道n * m的矩形里面,一共有多少个子矩形。

对于列来说,可以选择边长是1, 2, ... m,分别有m种、m - 1种、m - 2 ... 1种选法。

对于行来说,可以选择边长是1, 2, ....n, 分别有n种、n - 1种,....1种选法。

所以一共(1 + .... + n) * (1 + .... + m) = (n + 1) * n / 2 * (m + 1) * m / 2种

1 << k暴力枚举哪一个点在里面,容斥原理奇减偶加

若包含x个点,那这x个点肯定围成一个矩形,那么有多少个矩形包含这个矩形呢?

如法炮制,算出在y方向,左右扩展能有多少个矩形,x方向,上下扩展能有多少种可能,然后相乘即可。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
LL n, m;
int k;
const int maxn = + ;
int x[maxn], y[maxn];
LL ans;
void dfs(int cur, int sel, int x1, int y1, int x2, int y2) {
if (cur == k + ) {
if (!sel) return;
LL res = (x1) * (n - x2 + ) * (y1) * (m - y2 + );
if (sel & ) ans -= res;
else ans += res;
return;
}
dfs(cur + , sel + , min(x1, x[cur]), min(y1, y[cur]), max(x2, x[cur]), max(y2, y[cur]));
dfs(cur + , sel, x1, y1, x2, y2);
} void work() {
scanf("%d%d%d", &n, &m, &k);
for (int i = ; i <= k; ++i) {
scanf("%d%d", &x[i], &y[i]);
}
ans = (n + ) * n / * (m + ) * m / ;
dfs(, , inf, inf, -inf, -inf);
cout << ans << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int t;
scanf("%d", &t);
while (t--) work();
return ;
}

I. Mirrored String II   简单manacher变种不写题解了。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
#include <time.h>
const int maxn = 5e3 + ;
char str[maxn];
bool book[maxn];
int p[maxn];
int manacher(char str[], int lenstr) {
str[] = '*';
for (int i = lenstr; i >= ; --i) {
str[i + i + ] = str[i + ];
str[i + i + ] = '#';
}
int id = , maxLen = ;
for (int i = ; i <= * lenstr + ; ++i) {
if (!book[str[i]]) {
p[i] = ;
continue;
}
if (p[id] + id > i) {
p[i] = min(p[id] + id - i, p[ * id - i]);
} else p[i] = ;
while (str[i + p[i]] == str[i - p[i]] && (book[str[i - p[i]]] || str[i - p[i]] == '#')) ++p[i];
if (p[id] + id < p[i] + i) id = i;
maxLen = max(maxLen, p[i]);
}
return maxLen - ;
}
void work() {
scanf("%s", str + );
int lenstr = strlen(str + );
bool flag = false;
for (int i = ; i <= lenstr; ++i) {
if (book[str[i]]) {
flag = true;
break;
}
}
if (!flag) {
printf("0\n");
return;
}
printf("%d\n", manacher(str, lenstr));
}

I

A题待补,还有一题好像是防ak还没看,其他都是简单题,不过还是挺有意思

2017 ACM Arabella Collegiate Programming Contest div2的题,部分题目写个题解的更多相关文章

  1. 2017 ACM Arabella Collegiate Programming Contest(solved 11/13)

    省选考前单挑做点ACM练练细节还是很不错的嘛- 福利:http://codeforces.com/gym/101350 先来放上惨不忍睹的virtual participate成绩(中间跑去食堂吃饭于 ...

  2. 容斥 或者 单调栈 hihocoder #1476 : 矩形计数 和 G. Snake Rana 2017 ACM Arabella Collegiate Programming Contest

    先说一个简单的题目(题目大意自己看去,反正中文):hihocoder上的:http://hihocoder.com/problemset/problem/1476 然后因为这个n和m的矩阵范围是100 ...

  3. 脑洞 博弈 E. Competitive Seagulls 2017 ACM Arabella Collegiate Programming Contest

    题目链接:http://codeforces.com/gym/101350/problem/E 题目大意:给你一个长度为n的方格,方格上面都被染色成了白色.每次染色都是选择白色的,假设目前选择的这块白 ...

  4. 2017 ACM Arabella Collegiate Programming Contest(solved 9/13, complex 12/13)

    A.Sherlock Bones 题意: 给出长度为n的01串,问f(i,j)=f(j,k),(i<j<k)的i,j,k取值种数.其中f(i,j)表示[i,j]内1的个数, 且s[j]必须 ...

  5. 带权并查集:CF-2015 ACM Arabella Collegiate Programming Contest(F题)

    F. Palindrome Problem Description A string is palindrome if it can be read the same way in either di ...

  6. gym100676 [小熊骑士限定]2015 ACM Arabella Collegiate Programming Contest

    Kuma Rider久违的第二场训练,这场很水,又在vj的榜单上看到第一场的大哥了,2小时ak,大哥牛啤! A.水 #include<cstdio> #include<iostrea ...

  7. 2015 ACM Arabella Collegiate Programming Contest

    题目链接:https://vjudge.net/contest/154238#overview. ABCDE都是水题. F题,一开始分类讨论,结果似乎写挫了,WA了一发.果断换并查集上,A了. G题, ...

  8. 2017 ACM Jordanian Collegiate Programming Contest

    A. Chrome Tabs 当$n=1$时答案为$0$,当$k=1$或$k=n$时答案为$1$,否则答案为$2$. #include<cstdio> int T,n,k; int mai ...

  9. 2017 ACM Amman Collegiate Programming Contest 题解

    [题目链接] A - Watching TV 模拟.统计一下哪个数字最多即可. #include <bits/stdc++.h> using namespace std; const in ...

随机推荐

  1. Linux(Ubuntu16.04)+GitLab8.17deb安装包搭建Git仓库(代码管理系统)

    1 下载GitLab安装包 2  执行安装命令 3 验证是否安装和启动成功 4 修改管理员密码 5 其它说明 5.1修改访问URL 5.2修改邮件配置 5.3修改web端口 1下载GitLab安装包 ...

  2. Python定时任务-schedule vs. Celery vs. APScheduler

    在Python开发过程中我们经常需要执行定时任务,而此类任务我们通常有如下选项: 自己造轮子 使用schedule库 使用Celery定时任务 使用APScheduler 自己造轮子实现,最大的优势就 ...

  3. javacpp-FFmpeg系列补充:FFmpeg拉流截图实现在线演示demo(视频截图并返回base64图像,支持jpg/png/gif/bmp等多种格式)

    javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...

  4. Thrift简析

    Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的facebook来说创造thrift是为了解决faceboo ...

  5. 微软企业库的&nbsp;注入和依赖&amp;nbs…

    Working with ObjectBuilder This topic has not yet been rated - Rate this topic Retired Content This ...

  6. Jmeter JDBC Request 中文乱码问题

    在JDBC Request的SQL Query的编辑器输入中文会乱码,导入插入数据库的内容也是乱码,如下图 解决办法:JDBC Connection Configuration的Database UR ...

  7. (六)编写基类BaseDao

    在action中继承了ActionSupport和其它一些公共属性,如selectedRow等:可能以后还会产生更多公共的内容,所以应该把这些共有的抽取出来,放入到一个基本action中,我们命名为B ...

  8. ubuntu系统开root以及(su:认证失败)完美解决

    开机进入桌面,ctrl+alt+T打开终端————在此时终端显示的是 用户名@电脑名:-$   表示普通用户 在此处输入:sudo passwd root 此时提示———— [sudo] passwo ...

  9. Spring Boot错误errMsg: "request:ok"

    在把评论写到数据库并且动态刷新评论区的时候,有时候正常写入,有时候就会有“request:ok”的的错误出现,错误信息如下: data: {timestamp: , error: "Inte ...

  10. SQL 分割字符串

    USE [AppCloud] GO /****** Object: UserDefinedFunction [dbo].[splitstr] Script Date: 12/19/2013 09:33 ...