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. fastjson复现项目代码

    详情请见:https://www.cnblogs.com/yunmuq/p/14268028.html 以下是代码 // FastjsonDemo.java package test; import ...

  2. Kali Debian 修改时区

    1.KaliDebian默认读取时区文件是/etc/localtime(重建软连接,达到修改时区目的) 2./etc/localtime是个软连接,连接到时区文件/usr/share/zoneinfo ...

  3. 【渲染教程】使用3ds Max和ZBrush制作卡通风格的武器模型(上)

    克里斯蒂娜·马丁(CristinaMartín)介绍了她的项目灵剑(Spirit Sword)的制作过程,并详细的展示了使用3ds Max和ZBrush制作模型,纹理绘画和最终展示的过程. 介绍 克里 ...

  4. 基于Python实现的系统SLA可用性统计

    基于Python实现的系统SLA可用性统计 1. 介绍 SLA是Service Level Agreement的英文缩写,也叫服务质量协议.根据SRE Google运维解密一书中的定义: SLA是服务 ...

  5. P1140 相似基因(字符串距离,递推)

    题目链接: https://www.luogu.org/problemnew/show/P1140 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C, ...

  6. 洛谷P1972 [SDOI2009]HH的项链(树状数组)

    题目链接: https://www.luogu.org/problemnew/show/P1972 题目描述: HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后 ...

  7. MyBatis初级实战之四:druid多数据源

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. 使用Intelij 运行Android 程序导致的无法安装

    前几天的时候更换了开发工具开发Android ,终于不用忍受Android studio 的各种卡顿了.我决定使用一段时间Intelij 开发Android. 之前的程序代码在运行的时候也出现了异常, ...

  9. 一种获取context中keys和values的高效方法 | golang

    我们知道,在 golang 中的 context 是一个非常重要的包,保存了代码活动的上下文.我们经常使用 WithValue() 这个方法,来往 context 中 传递一些 key value 数 ...

  10. UI测试框架

    1. 从上到下共分成4层: 用例层  组件管理层  元素管理层  公共数据层 2. 用例层: 将每条用例使用参数化, 公共参数存储到"公共数据层", 中间参数通过组件层传递 3. ...