20201103gryz模拟赛解题报告
写在前面
昨天忘写了来补上
T1位运算乱搞一会没搞出来,
打完T4floyd暴力分之后发现T2树状数组可以骗点分
打完T3暴力手模了一遍样例之后发现T3就是个线段树板子
最后就非常愉快的拿到175pts,rank3
T1:U139249 位运算之谜
https://i.cnblogs.com/preference
很显然我并不知道这个公式
因为a&b表示的是都是1的位数,a^b表示的是只有一个是1的位数,
如果都是1,a+b后会进位,否则保留,
所以可推的如上的式子:$a+b=((a&b)<<1)+(a^b) $;
由题意已知\(a&b=y\),\(a+b=x\)
故\(a^b=x-2 \times y\);
因为这个数取的是不同位,\(y\)取的是相同位,所以他俩\(&\)起来一定为\(0\)
不为 \(0\) 为不合法
/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
*/
#include<iostream>
#include<cstdio>
using namespace std;
long long T, x, y;
long long read(){
long long w = 1, s = 0;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + ch - '0', ch = getchar();
return s * w;
}
int main()
{
T = read();
while(T--){
x = read(), y = read();
if((x - 2 * y) < 0 || ((x - 2 * y) & y)) cout<<-1<<endl;
else cout<<(x - y - y)<<endl;
}
return 0;
}
T2:U139245 游戏
看到数据范围比较小,预处理一个二维前缀和
暴力枚举每个节点i,j,二分找出最长边长即可
二维树状数组的话还是太慢了
/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
*/
#include<iostream>
#include<cstdio>
using namespace std;
int n, m, K;
int sum[310][310][30];
int a[310][310][30];
int read(){
int w = 1, s = 0;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + ch - '0', ch = getchar();
return s * w;
}
bool check(int i, int j, int k, int l){
for(int a = 1; a <= 26; ++a){
if(sum[k][l][a] + sum[i - 1][j - 1][a] - sum[i - 1][l][a] - sum[k][j - 1][a] > K) return false;
}
return true;
}
int main()
{
n = read(), m = read(), K = read();
char x;
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= m; ++j){
cin>>x;
a[i][j][x - 'a' + 1]++;
for(int k = 1; k <= 26; ++k){
sum[i][j][k] = sum[i-1][j][k] + sum[i][j-1][k] - sum[i-1][j-1][k] + a[i][j][k];
}
}
}
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= m; ++j){
int l = 0, r = min(n - i, m - j), ans = 0;
while(l <= r){
int mid = (l + r) >> 1;
if(check(i, j, i + mid, j + mid)){ ans = mid; l = mid + 1; }
else{ r = mid - 1; }
}
printf("%d ", ans + 1);
}
puts("");
}
return 0;
}
T3:U139247 或和异或
手模样例发现每两个相邻的元素在每次操作后会合并成一个
可以用线段树来维护一下,最后输出树根的答案即可
修改操作对应线段树的单点修改
上传的时候注意判断是or还是xor
/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
=============================Kersen AK IOI !!!=====================================================
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#define lson i << 1
#define rson i << 1 | 1
using namespace std;
const int MAXN = 131100;
struct Tree{
long long dep;
long long sum;
}tree[MAXN << 2];
long long n, Q;
bool flag = 0;
long long a[131080];
int ecm[20] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072};
//long long b[131080];
//int wzd[30];
//long long kersen[30];
long long read(){
long long s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') {if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + ch - '0', ch = getchar();
return s * w;
}
void push_up(int i){
if(!flag){//如果n是奇数,树是n + 1层,上传的时候奇数深度进行|操作,偶数深度进行^操作
if(tree[i].dep % 2){tree[i].sum = (tree[lson].sum | tree[rson].sum);}
else{tree[i].sum = (tree[lson].sum ^ tree[rson].sum);}
}
else{//如果n是偶数,树是n + 1层,上传的时候偶数深度进行|操作,奇数深度进行^操作,与上面相反
if(tree[i].dep % 2){tree[i].sum = (tree[lson].sum ^ tree[rson].sum);}
else{tree[i].sum = (tree[lson].sum | tree[rson].sum);}
}
}
void build(long long i, long long l, long long r, long long dep){
tree[i].dep = dep;
if(l == r) {
tree[i].sum = a[l];
return ;
}
int mid = (l + r) >> 1;
build(lson, l, mid, dep + 1), build(rson, mid + 1, r, dep + 1);
push_up(i);
return ;
}
void add(long long i ,long long l, long long r, long long x, long long k){
if(l == x && r == x) {
tree[i].sum = k;
return ;
}
int mid = (l + r) >> 1;
if(x <= mid) add(lson, l, mid, x, k);
else add(rson, mid + 1, r, x, k);
push_up(i);
return ;
}
int main()
{
// freopen("xor.in","r",stdin);
// freopen("xor.out","w",stdout);
n = read(), Q = read();
if(n%2 == 0) flag = 1;//如果n是偶数,标记一下
for(long long i = 1; i <= ecm[n]; ++i) a[i] = read();
build(1, 1, ecm[n], 1);
for(long long i = 1, x, k; i <= Q; ++i){
x = read(), k = read();
add(1, 1, ecm[n], x, k);
cout<<tree[1].sum<<endl;
}
return 0;
}
T4:U139253 链接
因为边的长度随编号的增加而增加,且前i条边的和一定不会超过第i+1条边
根据这个性质,在读入边的时候直接建出最小生成树,就求完了各个点的最短路
考虑u,v这两个节点 ,假设我们已经知道了u,那么我们可以通过如下式子推得v
\]
最后求一下和就是答案
/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
*/
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
const int MAXN = 1e5+5;
const int MAXM = 2e5+5;
const int mod = 1000000007;
struct edge{
int to, w, nxt;
}e[MAXM];
int head[MAXN], num_edge;
int n, m, point;
int dis[MAXN], fath[MAXN], f[MAXN], siz[MAXN];
bool type[MAXN];
int read(){
int w = 1, s = 0;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = s* 10 + ch - '0', ch = getchar();
return s * w;
}
//bool read1(){
// bool s = 0;
// char ch = getchar();
// while(ch >= '0' && ch <= '9') s = s* 10 + ch - '0', ch = getchar();
// return s;
//}
void add(int from, int to, int w){
e[++num_edge].to = to;
e[num_edge].w = w;
e[num_edge].nxt = head[from];
head[from] = num_edge;
}
int find(int x){return fath[x] == x ? x : fath[x] = find(fath[x]); }
void dfs(int x, int fa){
for(int i = head[x]; i; i = e[i].nxt){
int v = e[i].to;
if(v == fa) continue;
dis[v] = (dis[x] + e[i].w) % mod;
dfs(v, x), siz[x] += siz[v];
}
}
void dfs2(int x, int fa){
for(int i = head[x]; i; i = e[i].nxt){
int v = e[i].to;
if(v == fa) continue;
int jia = ((point - siz[v]) % mod + mod) % mod;
int jian = siz[v] * e[i].w % mod;
jia = (jia * e[i].w) % mod;
f[v] = ((f[x] + jia - jian) % mod + mod) % mod;
dfs2(v, x);
}
}
signed main()
{
n = read(), m = read();
bool flag = 0, se = 0;
se = read();
if(se) flag = 1, type[1] = se ^ 1;
else type[1] = 0;
for(int i = 2; i <= n; ++i){
type[i] = read();
// cin>>type[i];
if(flag) type[i] = (type[i] ^ 1);
siz[i] = type[i];//顺便处理在以i为根的子树中,与1节点不同的点的个数
}
for(int i = 1; i <= n; ++i) fath[i] = i;
int x = 2, cnt = 0;
for(int i = 1, u, v; i <= m; ++i){
u = read(), v = read();
int uf = find(u), vf = find(v);
if(uf != vf){
fath[uf] = vf;
add(u, v, x), add(v, u, x);
//cnt++;
}
// if(++cnt == n - 1) break;
x = (x * 2) % mod;
}
dfs(1, 1), point = siz[1];
for(int i = 1; i <= n; ++i){
if(type[i]) f[1] = (f[1] + dis[i]) % mod;//先暴力把1与其他点的权值和加起来
}
dfs2(1, 1);
int ans = 0;
for(int i = 1; i <= n; ++i){
if(!type[i]) ans = (ans + f[i]) % mod;
}
printf("%d", ans);
return 0;
}
20201103gryz模拟赛解题报告的更多相关文章
- 10.30 NFLS-NOIP模拟赛 解题报告
总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...
- 2018.10.26NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 70\) 实际得分:\(40 + 100 + 70\) 妈妈我又挂分了qwq..T1过了大样例就没管,直到临考试结束前\(10min\)才发现大样例是假 ...
- 2018.10.17NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 +100\) 实际得分:\(100 + 100 + 60\) 辣鸡模拟赛.. 5min切掉T1,看了一下T2 T3,感觉T3会被艹爆因为太原了.. 淦了20 ...
- 2018.10.16 NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...
- 20201101gryz模拟赛解题报告
写在前面 2020rp++ 停课的第一场模拟赛 拿上一年的上一年的day1来考的, 结果得分期望220pts,实际135pts,rank3,太菜了 考着考着机房灯突然灭了,当时慌的一批 以为断电代码要 ...
- 11.1NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 50\) 实际得分:\(100 + 100 + 50\) 感觉老师找的题有点水呀. 上来看T1,woc?裸的等比数列求和?然而我不会公式呀..感觉要凉 ...
- 20201115gryz模拟赛解题报告
写在前面 T1:期望100pts,实际0pts(7:50 ~ 8:50 T2:期望0pts,实际0pts(10:00 ~ 10:35 T3:期望20pts,实际40pts( 9:10 ~ 10:00, ...
- 20201102gryz模拟赛解题报告
简述我的苦逼做题经历 考的是NOIP2017day1原题, 开始看到小凯的疑惑时感觉特水,因为这题初中老师讲过, 很nice的秒切 T2发现是个大模拟,虽然字符串不太会用,但起码题意很好理解 边打代码 ...
- 20161022 NOIP模拟赛 解题报告
好元素 [问题描述] 小A一直认为,如果在一个由N个整数组成的数列{An}中,存在以下情况: Am+An+Ap = Ai (1 <= m, n, p < i <= N , m,n ...
随机推荐
- JavaWeb代码复用
servlet部分,可能用得到的复用的代码: 1.dopost设置字符 request.setCharacterEncoding("utf-8"); response.setCha ...
- mysql数据库的连接以及增删改查Java代码实现(转载)
每天叫醒自己的不是闹钟,而是梦想 数据库: create table t1(id int primary key not null auto_increment,name varchar(32),pa ...
- TurtleBot3使用课程-第三节a(北京智能佳)
目录 1.[第5类]操纵 2 1.1 软件的安装 2 1.2 硬件设置 2 1.3 打开CR设置 4 1.4 TurtleBot3 提出 5 1.4.1运行 5 1.4.2 Turtle Bot3模型 ...
- 图解HTTP权威指南(四)| 代理
作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络等. ...
- 第二章 信号量及条件变量(三)——> 重点
2.4.4 信号量的应用 1. 利用信号量实现进程互斥 为使多个进程能互斥的访问某临界资源,只需为该资源设置一个互斥信号量mutex,并设置其初值为 1 ,然后讲个进程访问该资源的临界区CS置于w ...
- LInux之Shell工具:Cut、Sed、Awk、Sort
一. cut cut的工作就是"剪",具体的说就是在文件中负责剪切数据用的.cut 命令从文件的每一行剪切字节.字符和字段并将这些字节.字符和字段输出. 1.基本用法 cut [选 ...
- sparkStreaming实时数据处理的优化方面
1.并行度 在direct方式下,sparkStreaming的task数量是等于kafka的分区数,kakfa单个分区的一般吞吐量为10M/s 常规设计下:kafka的分区数一般为broken节点的 ...
- 打算写一些Netty的文章了,先聊聊为什么要学习Netty
微信搜索[阿丸笔记],关注Java/MySQL/中间件各系列原创实战笔记,干货满满. 2021年了,终于开始系统性总结Netty相关的东西了. 这会是Netty系列的第一篇,我想先聊聊 "为 ...
- Java 使用线程池执行若干任务
在执行一系列带有IO操作(例如下载文件),且互不相关的异步任务时,采用多线程可以很极大的提高运行效率.线程池包含了一系列的线程,并且可以管理这些线程.例如:创建线程,销毁线程等.本文将介绍如何使用Ja ...
- 几幅图,拿下 HTTPS
我很早之前写过一篇关于 HTTP 和 HTTPS 的文章,但对于 HTTPS 介绍还不够详细,只讲了比较基础的部分,所以这次我们再来深入一下 HTTPS,用实战抓包的方式,带大家再来窥探一次 HTTP ...