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 ...
随机推荐
- informix部署安装
informix部署安装 一.环境准备 Linux版本:centos7.6 Linux主机名:localhost informix安装包:ibm.ids.14.10.FC4W1.LNX.tar inf ...
- cmake - 可执行文件
1.生成可执行文件 add_executable(hello xxx.cpp xxxxx.cpp) ##根据文件xxx.cpp和xxxx.cpp生成可执行文件hello,但是这两个可执行文件如果依赖其 ...
- java中网络通信 Scoket
在客户/服务器通信模式中,客户端需要主动建立与服务器连接的Socket,服务器端收到客户端的连接请求,也会创建与客户端连接的Socket.Socket可以看做是通信连接两端的收发器,客户端和服务店都通 ...
- NAT模式/路由模式/全路由模式 (转)
route全路由NAT NAT模式.此模式下,由局域网向广域网发送的数据包默认经过NAT转换,但路由器对所有源地址与局域网接口不在同一网段的数据包均不进行处理.例如,路由器LAN口IP设置为192.1 ...
- 杭电2734----Quicksum(C++)(数字与字符的关系)
Quicksum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- ocelot 中间件的变化
ocelot 中间件的变化 Intro 之前我们使用 ocelot 的时候自定义了一些中间件来实现我们定制化的一些需求,最近博客园上有小伙伴问我怎么使用,他用的版本是 16.0 版本,16.0 和 1 ...
- 避坑 | Java8使用并行流(ParallelStream)注意事项
示例分析 /** * 避坑 | Java8使用并行流(ParallelStream)注意事项 * * @author WH.L * @date 2020/12/26 17:14 */ public c ...
- 【小菜学网络】MAC地址详解
上一小节介绍了以太网帧的结构,以及帧中各个字段的作用.参与以太网通讯的实体,由以太网地址唯一标识.以太网地址也叫做 MAC 地址,我们对它仍知之甚少. 以太网地址在不同场景,称谓也不一样,常用叫法包括 ...
- Java开发手册之数据库规约
1.不要使用 count(列名)或 count(常量)来替代 count(*),count(*)是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关. 2.cou ...
- SQLSERVER 修改数据实例的排序规则
SQL Server服务器修改排序规则的方法 操作及验证步骤: 1 登录数据库后,查看当前安装数据库默认排序规则的两种方式 方式一.使用SQL Server 2014 Management Studi ...