\(T1\)

题目描述

给出一个 \(n × n\) 的, 元素为自然数的矩阵.

这个矩阵有许许多多个子矩阵, 定义它的所有子矩阵形成的集合为 \(S\) .

对于一个矩阵 \(k\) , 定义 \(f(k)\) 为 \(k\) 中所有元素的 \(AND\) 值 (按位与).

对于一个矩阵 \(k\) , 定义 \(g(k)\) 为 \(k\) 中所有元素的 \(OR\) 值 (按位或).

请求出所有子矩阵的 \(f(k)\) 之和与所有子矩阵的 \(g(k)\) 之和, 即 \(\prod_{k∈S}f(k)\) 与 \(\prod_{k∈S}g(k)\) .

由于答案可能很大, 只需要输出答案对 \(998244353\) 取模的结果.

\(Solution\)

期望得分-\(30pts\),结果错了三个地方:

\(1.\)文件输入输出把题目名字写错了...

\(2.\)把看成了异或...

\(3.\)递推的顺序错误,推前面的用到了后面还没推的

这种令人降智的错误犯一次就不可以第二次了啊。。。

\(100pts\)做法:

把每个数拆成二进制,第 \(k\) 位上的数对答案贡献为 \(2^k * ans\)

\(ans_{add}\) 可以看作全 \(1\) 的矩阵个数,\(ans_{or}\) 可看作所有矩阵减去全 \(0\) 矩阵个数

枚举每一列,用单调栈更新这一列的矩阵个数

时间复杂度:\(O(n^2)\),但是有个 \(31\) 的常数(二进制位数)

\(Code\)

#include<bits/stdc++.h>
#define ll long long
#define F(i, x, y) for(int i = x; i <= y; ++ i)
using namespace std;
int read();
const int mod = 998244353;
const int N = 1e3 + 5;
int n, top;
int ma[N][N], mb[N][N];
ll sta[N], pos[N], s[N], f[N][N][2];
ll ans, ans1, ans2;
int main()
{
freopen("mob.in","r",stdin);
freopen("mob.out","w",stdout);
n = read();
F(i, 1, n) F(j, 1, n) mb[i][j] = read();
F(k, 0, 31)
{
F(i, 1, n) F(j, 1, n) ma[i][j] = mb[i][j] & 1, mb[i][j] >>= 1;
F(i, 1, n) F(j, 1, n)
if(ma[i][j]) f[i][j][1] = f[i][j - 1][1] + 1, f[i][j][0] = 0;
else f[i][j][1] = 0, f[i][j][0] = f[i][j - 1][0] + 1;
ans = 0;
F(j, 1, n)
{
top = 0;
F(i, 1, n)
{
while(top && f[i][j][1] <= sta[top]) -- top;
sta[++ top] = f[i][j][1], pos[top] = i;
s[top] = (s[top - 1] + (i - pos[top - 1]) * f[i][j][1] % mod) % mod;
ans = (ans + s[top]) % mod;
}
}
ans1 = (ans1 + ans * (1 << k) % mod) % mod;
ans = 0;
F(j, 1, n)
{
top = 0;
F(i, 1, n)
{
while(top && f[i][j][0] <= sta[top]) -- top;
sta[++ top] = f[i][j][0], pos[top] = i;
s[top] = (s[top - 1] + (i - pos[top - 1]) * f[i][j][0] % mod) % mod;
ans = (ans + i * j % mod + mod - s[top]) % mod;
}
}
ans2 = (ans2 + ans * (1 << k) % mod) % mod;
//printf("%lld\n%lld", ans1, ans2);
}
printf("%lld\n%lld", ans1, ans2);
return 0;
}
int read()
{
int x = 0, f = 1;
char c = getchar();
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}

\(T2\)

题目描述

有 \(n\) 个人想要加入圣战, 每个人需要选择一个阵营加入.

但他们私下有 \(m\) 对敌对关系, 有敌对关系的两个人不会加入同一个阵营.

很快, 他们发现这会让他们难以加入到圣战中, 于是有一对敌人和好了, 即去除了一对敌对关系.

请找出去除哪一对关系后, 能找到一种加入阵营的方案, 使得剩余有敌对关系的人都不在同一个阵营.

为了避免输出文件过大, 你只需要输出所有符合题意的关系编号的异或和.

\(Solution\)

期望得分-\(30pts\),错误:

\(1.\)要把 \(next\) 写作 \(nxt\) 之类,避免关键词

\(2.\) \(dfs\) 写错了

\(90pts\)做法:

根据观察分析可得出,拆去一条边后合法仅为剩下的图中无奇环

则做一个 \(dfs\) 找奇环,记录奇环数量 \(K\),最后枚举边,若边被奇环覆盖数 \(=\) \(K\),即合法

主要是在如何找奇环,我写的 \(dfs\) 少了一句关键的 \(vis[x] = 0\),就是在搜完这个点后要将它复原,不然会有奇环搜不到

至于为什么是 \(90pts\),emm有两个点一直不对,但是这个算法应该是没问题(题解和这个基本是一样的),还在搜索错误中

\(upd(4/11):\) 其实是对的,数据错了

\(Code\)

#include<bits/stdc++.h>
#define F(i, x, y) for(int i = x; i <= y; ++ i)
using namespace std;
int read();
const int N = 2e6 + 5;
int n, m, x, y;
int ans1, ans2, K;
int head[N], cnt = 1, ver[N << 1], nxt[N << 1];
int vis[N], dep[N], pre[N], kk[N];
void add(int x, int y)
{
ver[++ cnt] = y, nxt[cnt] = head[x], head[x] = cnt;
}
void dfs(int x, int ffa, int y)
{
if(vis[x] && (dep[ffa] - dep[x]) % 2 == 0)
{
++ K, ++ kk[y], ++ kk[y ^ 1];
while(ffa != x) ++ kk[pre[ffa]], ++ kk[pre[ffa] ^ 1], ffa = ver[pre[ffa] ^ 1];
return;
}
if(vis[x]) return;
dep[x] = dep[ffa] + 1, pre[x] = y, vis[x] = 1;
for(int i = head[x]; i; i = nxt[i])
if(ver[i] != ffa) dfs(ver[i], x, i);
vis[x] = 0;
}
int main()
{
freopen("crusade.in","r",stdin);
freopen("crusade.out","w",stdout);
n = read(), m = read();
F(i, 1, m) x = read(), y = read(), add(x, y), add(y, x);
F(i, 1, n) if(! vis[i]) dfs(i, 0, 0);
for(int i = 2; i <= cnt; i += 2) if(kk[i] == K) ++ ans1, ans2 ^= (i / 2);
printf("%d\n%d\n", ans1, ans2);
return 0;
}
int read()
{
int x = 0, f = 1;
char c = getchar();
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}

\(T3\)

题目描述

有一个长度为 \(n\) 的正整数序列 \(a\) , 你需要进行 \(m\) 次操作, 每次操作有如下两种类型:

修改: \((L, R, x)\) , 表示将区间 \([L, R]\) 内的 \(ai\) 都乘上一个正整数 \(x\) .

询问: \((L, R)\) , 询问区间 \([L, R]\) 内每个数的乘积的欧拉函数值, 即 φ(∏Ri=Lai)

\(Solution\)

300以内只有62个质数,所以可以用 \(long \ long\) 类型的数记录包含的质数,用线段树维护

提前预处理好质数,逆元,一些欧拉函数相关

\(Code\)

调了两个多小时还是错的$kk$


总结

今天考试惨烈地暴零了,原因有以下几点:

\(1.\)菜,所以花时间想正解基本上等于浪费时间了

\(2.\)连续几次看错题,例如 \(t2\) 最开始看错题花了一个小时写错误的算法,\(t1\) 把或看作异或等,还是考试不够专注,没有全身心投入

\(3.\)破罐子破摔心理不可有,一旦开考就不要想有的没的,只要多拿分,不管情况是怎样,一定要尽可能拿更高得分

\(4.\)完整地搞定一道题(至少保证它能拿到想要的分数)后再去开下一道,今天就是 \(t1\) 暴力写完了,居然放在那里没调,打算把第三题写完一起调,最后都暴零了

【考试总结】欢乐模拟赛_Day1的更多相关文章

  1. 【考试总结】欢乐模拟赛_Day2

    \(T1\) 题目描述 在仙界中有着 \(n\) 位神仙, 每位神仙用一个 \(1 ∼ n\) 的特异编号表示, 老祖 \(ChitongZ\) 的编号为 \(1\) . 除去至尊至圣, 统管仙界的老 ...

  2. NOIP欢乐模拟赛 T1 解题报告

    小澳的方阵 (matrix.cpp/c/pas) [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力钻研,发现秦始皇布置兵马俑 ...

  3. NOIP欢乐模拟赛 T3 解题报告

    3.小澳的葫芦 (calabash.cpp/c/pas) [题目描述] 小澳最喜欢的歌曲就是<葫芦娃>. 一日表演唱歌,他尽了洪荒之力,唱响心中圣歌. 随之,小澳进入了葫芦世界. 葫芦世界 ...

  4. NOIP欢乐模拟赛 T2 解题报告

    小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...

  5. Test20171009 考试总结 NOIP模拟赛

    题目难度合适,区分度适中,但是本人水平不佳,没有拿到满意的分数. T1(matrix) 一种比较容易想到的想法是枚举起点求出最长全1串做预处理,这是O(n^2)的. 接着枚举列起点,列终点,通过后缀和 ...

  6. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  7. PKUSC 模拟赛 day1 下午总结

    下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...

  8. [GRYZ]寒假模拟赛

    写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...

  9. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

随机推荐

  1. nginx负载均衡例子

    upstream demo { ip_hash;//客户连接后, 一直用这个IP,直到会话结束,否则,动态程序可能会在换IP后出错 server 192.168.1.1:80 weight=5 | d ...

  2. Binder驱动理解

    1.Binder的三层架构 2.BC.BR的理解 通信模型 Binder协议包含在IPC数据中,分为两类: BINDER_COMMAND_PROTOCOL:binder请求码,以"BC_&q ...

  3. JavaScript实现图结构

    JavaScript实现图结构 一.图论 1.1.图的简介 什么是图? 图结构是一种与树结构有些相似的数据结构: 图论是数学的一个分支,并且,在数学中,树是图的一种: 图论以图为研究对象,研究顶点和边 ...

  4. unix中数据缓冲区高速缓冲的设计

    目录 1. 概述 2. 缓冲区的设计 2.1 缓冲区头部 2.2 缓冲区的结构 2.3 缓冲区的检索算法 2.3. 申请一个缓冲区算法 getblk 2.3.2 释放一个缓冲区算法 brelse 2. ...

  5. Linux下使用FastDFS

    本文所有操作均在CentOS 7.x环境下进行. 1.1.单节点FastDFS 整个安装过程非常复杂,很容易出错,建议进行多次备份. 我们这里不打算安装多台虚拟机,因此会把tracker和storag ...

  6. 使用Dism命令对Win7镜像进行操作

    在操作前,我们需要下载Win7部署工具AIK和Win7原版镜像 ★镜像迅雷链接 ed2k://|file|cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408 ...

  7. POJ 1163 数字三角形

    Portal:http://poj.org/problem?id=1163 DP经典题,IOI94考题,在各大OJ上都有 #include<iostream> #include<al ...

  8. 深入解读ES6系列(三)

    ES6字符串 哈喽小伙伴们,爱说'废'话的Z又回来了,欢迎来到Super IT曾的博客时间,上一节说了函数,解构赋值和数组的五大将,这一节我们继续我们知识的海洋,一起奋斗不秃头!不足的欢迎提问留言. ...

  9. Spring的IOC操作

    Spring的IOC操作 把对象的创建交给spring ioc操作两个部分 (1)ioc的配置文件方式 (2)ioc基于注解的方式 IOC 的底层原理 1.ioc底层原理使用技术 (1)xml配置文件 ...

  10. rem布局和使用js rem动态改变字体大小,自适应

    解决rem文字动态改变字体大小: <script> console.log(window.devicePixelRatio); var iScale = 1; iScale = iScal ...