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的更多相关文章

  1. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  2. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  3. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

  4. 2019牛客多校 Round4

    Solved:3 Rank:331 B xor 题意:5e4个集合 每个集合最多32个数 5e4个询问 询问l到r个集合是不是都有一个子集的xor和等于x 题解:在牛客多校第一场学了线性基 然后这个题 ...

  5. 2019牛客多校第一场E ABBA(DP)题解

    链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...

  6. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  7. 2019牛客多校第四场 A meeting

    链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...

  8. [2019牛客多校第二场][G. Polygons]

    题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保 ...

  9. 2019 牛客多校第一场 D Parity of Tuples

    题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...

随机推荐

  1. 【MyBatis】MyBatis 多表操作

    MyBatis 多表操作 文章源码 一对一查询 需求:查询所有账户信息,关联查询下单用户信息. 注意:因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对一查询.如果从用户 ...

  2. 【剑指 Offer】05.替换空格

    题目描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20a ...

  3. MongoDB的管理-深度长文

    (1) 启动和停止MongoDB: Ubuntu18下启动关闭MongoDB 启动MongoDB: 方法一: systemctl start mongod.service 方法二: 在MongoDB的 ...

  4. 天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟

    题目分析: 本题的要求是将n个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的 ...

  5. 在Linux系统下限制指定目录的大小以及文件/文件夹数量

    背景说明 在Linux操作系统下有时需要限制一个指定文件夹的大小和文件夹内可存储的文件数量,有可能是出于安全的考量或者定制化的配置,这里我们提供了一种方案:用dd创建一个空的img镜像,进行格式化的配 ...

  6. Docker学习笔记之Dockerfile

    Dockerfile的编写格式为<命令><形式参数>,命令不区分大小写,但一般使用大写字母.Docker会依据Dockerfile文件中编写的命令顺序依次执行命令.Docker ...

  7. 【Linux】Linux基础命令 - 目录相关的命令 ls 、cd、du

    文章目录 目录相关的命令 ls 命令:列出文件和目录 cd 命令:切换目录 du 命令:显示目录包含的文件大小 总结 参考资料 巩固和复习Linux系统基础命令知识 目录相关的命令 ls 命令:列出文 ...

  8. 【Problems】Could not set property 'id' of 'xxx' with value '' Cause argument type mismatch

    一个问题:向comment表添加记录时,报错, 无法设置值. reflection.ReflectionException: Could not set property 'id' of 'class ...

  9. python—打开图像文件报错

    今天使用python打开一张图像文件的时候报错了 UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illeg ...

  10. paramiko模块简单用法

    最简单最基本的用法 1 #__*__coding:utf-8__*__ 2 import paramiko 3 hostname = '192.168.1.1' 4 username = 'root' ...