写在前面

昨天忘写了来补上

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. 轻松上手CSS Grid网格布局

    今天刚好要做一个好多div格子错落组成的布局,不是田字格,不是九宫格,12个格子这样子,看起来有点复杂.关键的是笔者有点懒,要写那么多div和css真是不想下手啊.多看了两眼,这布局不跟网格挺像吗?c ...

  2. [leetcode]24. Swap Nodes in Pairs交换链表的节点

    感觉这个题后台的运行程序有问题,一开始自己想的是反转链表那道题的方法,只是隔一个节点执行一次,但是没有通过,TLE了,但是很奇怪,并没有死循环,就是最后返回的时候超时. 最后的思路就是很简单的进行交换 ...

  3. 3. Longest Substring Without Repeating Characters寻找不重复的最大子串

    首先弄清楚Substring和Subsequence,前者是子串,要求连续,后者是子序列,可以不连续 public int lengthOfLongestSubstring(String s) { / ...

  4. Java学习日报7.22

    //3.2   逆向输出三位整数!    7.22 package 三个和尚比身高1; import java.util.Scanner; public class Demo1{ @SuppressW ...

  5. 跟我一起学python(1):占位符

    模板 格式化字符串时,Python使用一个字符串作为模板.模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式.Python用一个tuple将多个值传递给模板,每个值对应一个格式符 ...

  6. 如何在Nginx不绑定域名下使用SSL/TLS证书?

    前提 该文主要记录如何在没有购买域名的情况下使用SSL/TLS协议,即地址前面的http变成了https.但是这样的SSL协议是会被浏览器认为是不安全的.在开发或者测试环境可以这样搞,生产环境下还是乖 ...

  7. python 3.6 导入c++dll所遇到的坑

    1 返回值在c++里面为const char*,python 接收实际上为int类型 原因:python默认返回值为int 解决方法: import ctypes import os CUR_PATH ...

  8. springboot项目打war包流程

    目前,前后端分离的架构已成主流,因此使用springboot构建应用是非常快速的,项目发布到服务器上的时候,只需要打成一个jar包,然后通过命令 : java -jar jar包名称即可启动服务了:但 ...

  9. Docker-Compose练习

    运行一个镜像,需要添加大量的参数. 可以通过Docker-Compose编写这些参数. Docker-Compose可以帮助我们批量的管理容器. 只需要通过一个docker-compose.yml文件 ...

  10. Redis的sentinel(哨兵)部署

    1.准备文件 1.解压redis-4.0.1.tar.gz的redis文件 2.新建目录 redis-cluster以及子目录 master-6379 slave-7000 slave-7001 3. ...