2019牛客多校 Round3
Solved:3
Rank:105
治哥出题了 我感动哭了
A Graph Game (分块)
题意:1e5个点 2e5条边 s(x)表示与x点直接相邻的点集合
有两种操作 1种将按输入顺序的边第l条到第r条边翻转 连接->切断 切断->链接
还有一种询问 s(x)与s(y)是否相等
题解:题解说 可以给每个点随机一个值 然后s(x)可以用与x直接相邻的点xor起来 (还有这种操作???
然后我们把边分块 翻转操作就是xor操作 每个点之间边的状态是一样的 所以可以共用
而且对一条边的修改 影响的只有两个点的信息 所以对块两边的边暴力修改他所影响的点
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5; int n, m, blo;
int bl[MAXN << 1];
int sum[MAXN][505];
int now[MAXN];
int val[MAXN];
int u[MAXN << 1];
int v[MAXN << 1];
int vis[505]; void update(int l, int r) {
for(int i = l; i <= min(r, bl[l] * blo); i++) {
now[u[i]] ^= val[v[i]];
now[v[i]] ^= val[u[i]];
} if(bl[l] != bl[r]) {
for(int i = (bl[r] - 1) * blo + 1; i <= r; i++) {
now[u[i]] ^= val[v[i]];
now[v[i]] ^= val[u[i]];
}
}
for(int i = bl[l] + 1; i < bl[r]; i++) vis[i] ^= 1;
} int main() {
srand(time(NULL));
for(int i = 1; i <= 100000; i++) val[i] = rand() + 1; int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
blo = sqrt(m);
for(int i = 1; i <= m; i++) bl[i] = (i - 1) / blo + 1;
for(int i = 1; i <= n; i++) now[i] = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= bl[m]; j++) sum[i][j] = 0;
for(int i = 1; i <= bl[m]; i++) vis[i] = 1; for(int i = 1; i <= m; i++) {
scanf("%d%d", &u[i], &v[i]);
sum[u[i]][bl[i]] ^= val[v[i]];
sum[v[i]][bl[i]] ^= val[u[i]];
} int qu; scanf("%d", &qu);
while(qu--) {
int opt, x, y;
scanf("%d%d%d", &opt, &x, &y);
if(opt == 1) update(x, y);
else if(opt == 2) {
int ans1 = now[x], ans2 = now[y];
for(int i = 1; i <= bl[m]; i++) {
if(vis[i]) {
ans1 ^= sum[x][i];
ans2 ^= sum[y][i];
}
}
if(ans1 == ans2) printf("1");
else printf("0");
}
}
puts("");
}
return 0;
}
A Graph Game
F Planting Trees
题意:500x500的矩阵 求一个最大的子矩阵 使得区间最大减最小<=M
题解:枚举纵坐标的区间 对于每一个区间 从第一行开始 单调尺取搞一搞
#include <bits/stdc++.h>
using namespace std; int a[505][505];
int zd[505];
int zx[505]; int qd[505];
int qx[505]; int main() {
int T;
scanf("%d", &T);
while(T--) {
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
} int ans = 1;
for(int j = 1; j <= n; j++) {
for(int k = 1; k <= n; k++) {
zx[k] = 1e5 + 5;
zd[k] = 0;
}
for(int k = j; k <= n; k++) {
for(int i = 1; i <= n; i++) {
zd[i] = max(zd[i], a[i][k]);
zx[i] = min(zx[i], a[i][k]);
} int lx = 1, rx = 0;
int ld = 1, rd = 0; int nowl = 1;
for(int i = 1; i <= n; i++) {
while(lx <= rx && zx[qx[rx]] >= zx[i]) rx--;
qx[++rx] = i;
while(ld <= rd && zd[qd[rd]] <= zd[i]) rd--;
qd[++rd] = i; while(nowl <= i && zd[qd[ld]] - zx[qx[lx]] > m) {
nowl++;
while(lx <= rx && qx[lx] < nowl) lx++;
while(ld <= rd && qd[ld] < nowl) ld++;
}
if(nowl <= i && zd[qd[ld]] - zx[qx[lx]] <= m) {
ans = max(ans, (k - j + 1) * (i - nowl + 1));
}
}
}
}
printf("%d\n", ans);
}
return 0;
}
F Planting Trees
G Removing Stones
题意:n堆石子 每次可以选择两堆不同的各拿走一个 如果能拿完 就表示获胜
如果石子的和为奇数 则将最少的一堆石子数-1
问有多少对区间 能获胜
题解:显然 题目等于 计算 区间max * 2 <= 区间和的个数
考虑反问题 计算max * 2 > 区间和
然后直接暴力枚举每个点作为最大值 往前搞搞 往后搞搞
巧妙的是这样的时间复杂度其实并不高 要让这样暴力枚举的时间复杂度退化到n方的数据 显然是ai >= ai+1 * 2
举个例子长度为5的数组 16 8 4 2 1 能让暴力枚举的复杂度退化到n方 但是ai < 1e9
均摊一下每个数的平均枚举到log
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[300005];
ll pre[300005]; int main() {
int T;
scanf("%d", &T);
while(T--) {
ll n;
scanf("%lld", &n);
for(int i = 1; i <= n; i++) scanf("%lld", &a[i]); ll ans = 0;
for(int i = 1; i <= n; i++) {
int cnt = 0;
pre[0] = 0;
for(int j = i + 1; j <= n; j++) {
pre[++cnt] = a[j];
pre[cnt] += pre[cnt - 1];
if(pre[cnt] >= a[i]) {
cnt--;
break;
}
} ans += cnt;
ll sum = 0;
for(int j = i - 1; j >= 1; j--) {
sum += a[j];
if(sum >= a[i]) break; ans++;
int l = 0, r = cnt;
int mid = l + r >> 1;
while(l + 1 < r) {
mid = l + r >> 1;
if(sum + pre[mid] < a[i]) l = mid;
else r = mid;
}
if(sum + pre[r] < a[i]) ans += r;
else ans += l;
}
} ans = n * (n - 1) / 2 - ans;
printf("%lld\n", ans);
} return 0;
}
G Removing Stones
2019牛客多校 Round3的更多相关文章
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
- 2019牛客多校第二场 A Eddy Walker(概率推公式)
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 2019牛客多校 Round4
Solved:3 Rank:331 B xor 题意:5e4个集合 每个集合最多32个数 5e4个询问 询问l到r个集合是不是都有一个子集的xor和等于x 题解:在牛客多校第一场学了线性基 然后这个题 ...
- 2019牛客多校第一场E ABBA(DP)题解
链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- 2019牛客多校第四场 A meeting
链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...
- [2019牛客多校第二场][G. Polygons]
题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保 ...
- 2019 牛客多校第一场 D Parity of Tuples
题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...
随机推荐
- golang遍历时修改被遍历对象
目录 前言 遍历切片 遍历map 总结 前言 很多时候需要将遍历对象中去掉某些元素,或者往遍历对象中添加元素,这时候就需要小心操作了. 对于go语言中的一些注意事项我做了总结和示例,留下点笔记. 遍历 ...
- GCC 概述:C 语言编译过程详解
Tags: C Description: 关于 GCC 的个人笔记 GCC 概述 对于 GCC 6.1 以及之后的版本,默认使用的 C++ 标准是 C++ 14:使用 -std=c++11 来指定使用 ...
- PC个人隐私保护小方法
前言 近期爆出了腾讯读取用户浏览器浏览记录的消息.话不过说直接上图,懂的自然懂. 网上也有详细的分析文章,不管它读取后用来做什么,在你不知情的情况下读取了你的浏览器浏览记录,你说气不气. 虽然在整体大 ...
- ctfhub技能树—RCE—过滤空格
打开靶机 查看页面信息 开始尝试注入 127.0.0.1 || ls 尝试绕过 127.0.0.1||ls 使用cat命令查看flag 127.0.0.11||cat<flag_10872536 ...
- oracle dg库因为standby_file_management参数导致应用停止
DG库的standby_file_management=manual,主库添加文件的时候,备库无法自动创建对应的文件而报错 File #154 added to control file as 'UN ...
- SAP中的F4帮助
今天在调试标准程序的时候,意外的发现了一个F4帮助的函数,感觉还是挺好用的. F4IF_FIELD_VALUE_REQUEST从函数名就可以看出是给字段添加F4帮助的. F4 help for fie ...
- JMM在X86下的原理与实现
JMM在X86下的原理与实现 Java的happen-before模型 众所周知 Java有一个happen-before模型,可以帮助程序员隔离各个平台多线程并发的复杂性,只要Java程序员遵守ha ...
- SQL 语法速成手册
本文针对关系型数据库的一般语法.限于篇幅,本文侧重说明用法,不会展开讲解特性.原理. 一.基本概念 数据库术语 数据库(database) - 保存有组织的数据的容器(通常是一个文件或一组文件). 数 ...
- Django orm中related_name/related_query_name区别
related_name/related_query_name区别 class Department(models.Model): title = models.CharField(verbose_n ...
- Py编程方法,尾递归优化,map函数,filter函数,reduce函数
函数式编程 1.面向过程 把大的问题分解成流程,按照流程来编写过程 2.面向函数 面向函数编程=编程语言定义的函数+数学意义上的函数先弄出数学意义上的方程式,再用编程方法编写这个数学方程式注意面向函数 ...