写在前面

昨天忘写了来补上

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

\[ans_{v} = ans_{u} - siz_{v} \times e_{i}.w + (point - siz_{v}) \times e_{i}.w
\]

最后求一下和就是答案

/*
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模拟赛解题报告的更多相关文章

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

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

  2. 2018.10.26NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 70\) 实际得分:\(40 + 100 + 70\) 妈妈我又挂分了qwq..T1过了大样例就没管,直到临考试结束前\(10min\)才发现大样例是假 ...

  3. 2018.10.17NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 +100\) 实际得分:\(100 + 100 + 60\) 辣鸡模拟赛.. 5min切掉T1,看了一下T2 T3,感觉T3会被艹爆因为太原了.. 淦了20 ...

  4. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  5. 20201101gryz模拟赛解题报告

    写在前面 2020rp++ 停课的第一场模拟赛 拿上一年的上一年的day1来考的, 结果得分期望220pts,实际135pts,rank3,太菜了 考着考着机房灯突然灭了,当时慌的一批 以为断电代码要 ...

  6. 11.1NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 50\) 实际得分:\(100 + 100 + 50\) 感觉老师找的题有点水呀. 上来看T1,woc?裸的等比数列求和?然而我不会公式呀..感觉要凉 ...

  7. 20201115gryz模拟赛解题报告

    写在前面 T1:期望100pts,实际0pts(7:50 ~ 8:50 T2:期望0pts,实际0pts(10:00 ~ 10:35 T3:期望20pts,实际40pts( 9:10 ~ 10:00, ...

  8. 20201102gryz模拟赛解题报告

    简述我的苦逼做题经历 考的是NOIP2017day1原题, 开始看到小凯的疑惑时感觉特水,因为这题初中老师讲过, 很nice的秒切 T2发现是个大模拟,虽然字符串不太会用,但起码题意很好理解 边打代码 ...

  9. 20161022 NOIP模拟赛 解题报告

     好元素 [问题描述] 小A一直认为,如果在一个由N个整数组成的数列{An}中,存在以下情况: Am+An+Ap = Ai (1 <= m, n, p < i <= N ,  m,n ...

随机推荐

  1. idea2020 没有 Autoscroll from Source

    2018版本: 2020版本: 最后在官网的网站中找到了解决方案,原来是改名了: 网址:https://intellij-support.jetbrains.com/hc/en-us/communit ...

  2. 【探索之路】机器人篇(4)-根据3D文件来优化自己的机器人模型

    此章节不是必须做的!!!! 因为我已经用solidworks画了机器人的3D模型,那我就直接导入已经画好的三维模型. 如果大家没有画也是可以直接使用上一章节我们已经构建的机器人模型.我这里只是一个对显 ...

  3. 为了搞清楚类加载,竟然手撸JVM!

    作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...

  4. mysql-font1251错误

    控制台中先连接mysql: ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; ALTER US ...

  5. JavaCV FFmpeg采集麦克风PCM音频数据

    前阵子用一个JavaCV的FFmpeg库实现了YUV视频数据地采集,同样的采集PCM音频数据也可以采用JavaCV的FFmpeg库. 传送门:JavaCV FFmpeg采集摄像头YUV数据 首先引入 ...

  6. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 更新和删除)--学习笔记

    2.5.4 MongoDB -- 更新和删除 整体更新 更新字段 字段操作 数组操作 删除 https://docs.mongodb.com/manual/reference/operator/upd ...

  7. 买卖股票的最佳时机 III

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的 ...

  8. wdcp的一个安全漏洞 2015 9 月

    wdcp的一个安全漏洞,非常严重,请大家及时升级和检查 在九月份的时候,wdcp出了一个很严重的安全漏洞,当时也出了补丁更新,具体可看http://www.wdlinux.cn/bbs/thread- ...

  9. 测试如何区分前后端bug

    当我们测试到前后端分离的项目时,可能就会想这个bug我到底应该指给谁,是前端的问题还是后端的呢,为了让自己更专业,分清前后端问题还是很重要的. 1.如图商品详情中显示[件装:1,中包装:2 ]但是在后 ...

  10. python后端开发面试总结

    网络协议 通信计算机双方必须共同遵从的一组约定,只有遵守这个约定,计算机之间才能相互通信交流 TCP / IP TCP/IP(传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇.TC ...