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 ...
随机推荐
- Windows 64位下安装Redis 以及 可视化工具Redis Desktop Manager的安装和使用
二.下载Windows版本的Redis 由于现在官网上只提供Linux版本的下载,所以我们只能在Github上下载Windows版本的Redis Windows版本的Redis下载地址:https:/ ...
- python-scrapy框架爬取某瓣电视剧信息--异步加载页面
前期准备,首先要有python环境+scrapy环境+pycharm环境 一.建立爬虫所需的环境,在命令行输入: scrapy startproject doubantv #命名自定义就好 会生成一个 ...
- Hadoop集群模式安装出现的若干问题
一.域名解析问题 域名解析暂时失败问题 vim /etc/sysconfig/network 查看主机名 vim etc/hosts 配置IP地址与主机名 192.168.60.132 centos ...
- swing桌面四子棋程序开发过程中遇到的一些问题记录(二)
第二个遇到的问题是将JButton按钮设置成透明的按钮.首先UI给我一张透明的图片,如果我直接给Button按钮设置背景图片的话,是没有透明的效果的,只会留下白色的底,设置前后的效果如下图 制作透明的 ...
- centos7搭建sonarqube环境+jenkins部署全流程
一.简介sonarqube是一个用于代码质量管理的开源平台,用于管理源代码的质量 不遵循代码标准sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写.潜在的 ...
- Spring用了哪些设计模式?
设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结.总共有 23 种设计模式 使用设计模式是为了重用代码.让代码更容易被他人理解.保证代码可靠性. Spring用了哪些设计模 ...
- idea多模块启动
2018版本的idea 原文链接http://zhhll.icu/2020/04/07/idea/idea%E4%B9%8B%E5%A4%9A%E6%A8%A1%E5%9D%97%E5%90%AF%E ...
- Python解释器和IPython
目录 简介 Python解释器 IPython 魔法函数 运行和编辑 Debug History 运行系统命令 简介 今天给大家介绍一下Python的一个功能非常强大的解释器IPython.虽然Pyt ...
- Shiro配置Session检测时Quartz版本冲突
项目背景: shiro 1.3 + quartz 2.x 2018-9-11 22:20:35补充: 经过测试,本人发现 ,通过实现 org.apache.shiro.session.mgt.Exec ...
- node解决跨域和服务器代理详解代码
node中有很多解决服务器代理的插件,这里简介一个:express-http-proxy 之前网上查的使用node解决跨域的插件,有很多,例如,cors,koa2,这里解决跨域问题我拿原生解决的,ex ...