Day5下午解题报告1
时间:2022-05-08
本文章向大家介绍Day5下午解题报告1,主要内容包括预计分数:100+60+30=190、实际分数:100+60+30=190、终于有一道无脑T1了哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈、T2、T3、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
预计分数:100+60+30=190
实际分数:100+60+30=190
终于有一道无脑T1了哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
T1
https://www.luogu.org/problem/show?pid=T15744
无脑暴力,直接模拟就能水过
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<queue>
6 #include<algorithm>
7 #define Ll long long
8 using namespace std;
9 const int MAXN=1011;
10 const int INF=0x7fffff;
11 inline int read()
12 {
13 char c=getchar();int flag=1,x=0;
14 while(c<'0'||c>'9') {if(c=='-') flag=-1;c=getchar();}
15 while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();return x*flag;
16 }
17 int n,p,k;
18 struct node
19 {
20 int l;
21 int change[MAXN];
22 }lun[MAXN];
23 int now[MAXN];//每一个位置的值
24 int pos[MAXN];//每一个值的位置
25 int main()
26 {
27 //freopen("rotate.in","r",stdin);
28 // freopen("rotate.out","w",stdout);
29 n=read();p=read();k=read();
30 for(int i=1;i<=n;i++) now[i]=i,pos[i]=i;//每一个数现在是什么
31 for(int i=1;i<=p;i++)
32 {
33 lun[i].l=read();
34 for(int j=1;j<=lun[i].l;j++) lun[i].change[j]=read();
35 lun[i].l++;lun[i].change[lun[i].l]=lun[i].change[1];
36 }
37 for(int i=p;i>=1;i--)
38 {
39 for(int j=1;j<=lun[i].l-1;j++)
40 now[ pos[ lun[i].change[j] ] ]= lun[i].change[j+1];
41 for(int j=1;j<=n;j++) pos[now[j]]=j;
42 }
43 for(int i=1;i<=n;i++)
44 printf("%d ",now[i]);
45
46 return 0;
47 }
48 /*
49 (4,1)*(3,1)*(2,1)的话1变成2然后一直是2
50 2变成1然后变成3
51 3变成1然后变成4
52 4变成1
53
54 4 3 2
55 2 4 1
56 2 3 1
57 2 2 1
58 // 2 3 4 1
59
60 4 3 3
61 2 4 2
62 3 1 2 3
63 2 1 4
64 // 2 3 1 4
65
66 5 2 4
67 3 1 2 5
68 4 3 4 1 2
69 //5 3 4 2 1
70 */
T2
不会,根据&和|的性质骗了60分
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<queue>
6 #include<algorithm>
7 #define Ll long long
8 using namespace std;
9 const int MAXN=1e6+10;
10 const int INF=0x7fffff;
11 const int mod=1e9+7;
12 inline int read()
13 {
14 char c=getchar();int flag=1,x=0;
15 while(c<'0'||c>'9') {if(c=='-') flag=-1;c=getchar();}
16 while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();return x*flag;
17 }
18 int n,a,b,c,d;
19 int sz[MAXN];
20 int ans=0;
21 int main()
22 {
23 // freopen("range.in","r",stdin);
24 // freopen("range.out","w",stdout);
25 n=read();a=read();b=read();c=read();d=read();
26 for(int i=1;i<=n;i++) sz[i]=read();
27 for(int i=1;i<=n;i++)
28 {
29 int yu=sz[i],huo=sz[i];
30 for(int j=i;j<=n;j++)
31 {
32 yu=yu&sz[j];
33 huo=huo|sz[j];
34 if(yu>=a&&yu<=b&&huo>=c&&huo<=d)
35 ans=(ans+1)%mod;
36 if(yu<a||huo>d) break;
37 }
38 }
39 printf("%d",ans%mod);
40 return 0;
41 }
正解:
尝试固定左端点,观察右端点有什么性质
可以看出 and运算的值是递减的,or运算的值是递增的
用st表维护and和or的值||线段树||直接找结果
1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <cmath>
5 #include <algorithm>
6 #include <cassert>
7
8 using namespace std;
9 typedef long long LL;
10 LL mod = 1e9+7;
11 LL cnt;
12 int s[100005],n,a,b,c,d;
13 int sta[100005][20],sto[100005][20];
14 int aska(int l,int r){
15 int L=r-l+1;
16 int t = log2(L);
17 return sta[l][t] & sta[r-(1<<t)+1][t];
18 }
19 int asko(int l,int r){
20 int L=r-l+1;
21 int t = log2(L);
22 return sto[l][t] | sto[r-(1<<t)+1][t];
23 }
24 int main(){
25 freopen("range.in","r",stdin);
26 freopen("range.out","w",stdout);
27 scanf("%d%d%d%d%d",&n,&a,&b,&c,&d);
28 for(int i=1;i<=n;i++) scanf("%d",&s[i]),sta[i][0]=sto[i][0]=s[i];
29 // puts("aaa");
30 for(int j=1;j<20;j++)
31 for(int i=1;i<=n;i++){
32 if(i+(1<<j) -1 <=n){
33 sta[i][j] = sta[i][j-1] & sta[i+(1<<(j-1))][j-1];
34 sto[i][j] = sto[i][j-1] | sto[i+(1<<(j-1))][j-1];
35 }
36 }
37 for(int i=1;i<=n;i++){
38 int andsum = s[i], orsum = s[i];
39
40
41 for(int j=i;j<=n;j++){
42 int L=j,R=n+1;
43 andsum = aska(i,j);
44 orsum = asko(i,j);
45 while(R-L>1){
46 int mid = (L+R)/2;
47 if(aska(i,mid) == andsum && asko(i,mid) == orsum){
48 L=mid;
49 }else R=mid;
50 }
51 if(a <= andsum && andsum <= b && c <= orsum && orsum <= d){
52 cnt += L-j+1;
53 }
54 j=L;
55 }
56
57 }
58 cout<<cnt%mod<<endl;
59
60
61 return 0;
62 }
T3
不会,打30分暴力走人
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<queue>
6 #include<algorithm>
7 #define Ll long long
8 using namespace std;
9 const int MAXN=1e6+10;
10 const int INF=0x7fffff;
11 const int mod=1e9+7;
12 inline int read()
13 {
14 char c=getchar();int flag=1,x=0;
15 while(c<'0'||c>'9') {if(c=='-') flag=-1;c=getchar();}
16 while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();return x*flag;
17 }
18 int n,k;
19 int a[MAXN];
20 struct node
21 {
22 int u,v,w,f,nxt;
23 }edge[MAXN];
24 int head[MAXN];
25 int num=1;
26 inline void add_edge(int x,int y)
27 {
28 edge[num].u=x;
29 edge[num].v=y;
30 edge[num].nxt=head[x];
31 head[x]=num++;
32 }
33 int ans=0;
34 int deep[MAXN];
35 void pd()
36 {
37 queue<int>q;q.push(1);
38 int now=a[1];
39 while(q.size()!=0)
40 {
41 int p=q.front();q.pop();
42 for(int i=head[p];i!=-1;i=edge[i].nxt)
43 {
44 if(edge[i].f==0&&deep[edge[i].v]>deep[edge[i].u])
45 {
46 now+=a[edge[i].v];
47 q.push(edge[i].v);
48 }
49 }
50 }
51 if(now==k) ans=(ans+1)%mod;
52 }
53 void dfs(int now)
54 {
55 if(now==num)
56 {
57 pd();
58 return ;
59 }
60 edge[now].f=1;
61 edge[now+1].f=1;
62 dfs(now+2);
63 edge[now].f=0;
64 edge[now+1].f=0;
65 dfs(now+2);
66 }
67 void make_deep(int now)
68 {
69 for(int i=head[now];i!=-1;i=edge[i].nxt)
70 if(deep[edge[i].v]==0)
71 deep[edge[i].v]=deep[now]+1,make_deep(edge[i].v);
72 }
73 int main()
74 {
75 //freopen("fruit.in","r",stdin);
76 // freopen("fruit.out","w",stdout);
77 memset(head,-1,sizeof(head));
78 n=read();k=read();
79 for(int i=1;i<=n;i++) a[i]=read();
80 for(int i=1;i<=n-1;i++)
81 {
82 int x=read(),y=read();
83 add_edge(x,y);
84 add_edge(y,x);
85 }
86 deep[1]=1;
87 make_deep(1);
88 edge[1].f=1;//断
89 edge[2].f=1;
90 dfs(3);
91 edge[1].f=0;
92 edge[2].f=0;
93 dfs(3);//没断
94 printf("%d",ans%mod);
95 return 0;
96 }
97
98 /*
99 5 3
100 2 1 0 1 1
101 1 2
102 1 3
103 3 4
104 3 5
105 //7
106
107 3 1
108 1 1 1
109 1 2
110 2 3
111 //2
112 */
f[i][j] 表示i 号节点在子树中拿j 个果子的方案数
DFS 时可以直接把父节点状态传下去,减少一维合并复杂度
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<queue>
6 #include<algorithm>
7 #define Ll long long
8 using namespace std;
9 const int MAXN=1e6+10;
10 const int INF=0x7fffff;
11 const int mod=1e9+7;
12 inline int read()
13 {
14 char c=getchar();int flag=1,x=0;
15 while(c<'0'||c>'9') {if(c=='-') flag=-1;c=getchar();}
16 while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();return x*flag;
17 }
18 int n,k;
19 int a[MAXN];
20 struct node
21 {
22 int u,v,w,f,nxt;
23 }edge[MAXN];
24 int head[MAXN];
25 int num=1;
26 inline void add_edge(int x,int y)
27 {
28 edge[num].u=x;
29 edge[num].v=y;
30 edge[num].nxt=head[x];
31 head[x]=num++;
32 }
33 int ans=0;
34 int deep[MAXN];
35 void pd()
36 {
37 queue<int>q;q.push(1);
38 int now=a[1];
39 while(q.size()!=0)
40 {
41 int p=q.front();q.pop();
42 for(int i=head[p];i!=-1;i=edge[i].nxt)
43 {
44 if(edge[i].f==0&&deep[edge[i].v]>deep[edge[i].u])
45 {
46 now+=a[edge[i].v];
47 q.push(edge[i].v);
48 }
49 }
50 }
51 if(now==k) ans=(ans+1)%mod;
52 }
53 void dfs(int now)
54 {
55 if(now==num)
56 {
57 pd();
58 return ;
59 }
60 edge[now].f=1;
61 edge[now+1].f=1;
62 dfs(now+2);
63 edge[now].f=0;
64 edge[now+1].f=0;
65 dfs(now+2);
66 }
67 void make_deep(int now)
68 {
69 for(int i=head[now];i!=-1;i=edge[i].nxt)
70 if(deep[edge[i].v]==0)
71 deep[edge[i].v]=deep[now]+1,make_deep(edge[i].v);
72 }
73 int main()
74 {
75 //freopen("fruit.in","r",stdin);
76 // freopen("fruit.out","w",stdout);
77 memset(head,-1,sizeof(head));
78 n=read();k=read();
79 for(int i=1;i<=n;i++) a[i]=read();
80 for(int i=1;i<=n-1;i++)
81 {
82 int x=read(),y=read();
83 add_edge(x,y);
84 add_edge(y,x);
85 }
86 deep[1]=1;
87 make_deep(1);
88 edge[1].f=1;//断
89 edge[2].f=1;
90 dfs(3);
91 edge[1].f=0;
92 edge[2].f=0;
93 dfs(3);//没断
94 printf("%d",ans%mod);
95 return 0;
96 }
97
98 /*
99 5 3
100 2 1 0 1 1
101 1 2
102 1 3
103 3 4
104 3 5
105 //7
106
107 3 1
108 1 1 1
109 1 2
110 2 3
111 //2
112 */
总结
就喜欢这种题目区分度大的考试。
拿满暴力分就有一个不错的名次23333
- 2017"百度之星"程序设计大赛 - 复赛1001&&HDU 6144 Arithmetic of Bomb【java大模拟】
- Java面向对象抽象类实例练习
- 经典JS闭包面试题
- Java面向对象接口的应用实例练习
- 【机器学习笔记之八】使用朴素贝叶斯进行文本的分类
- 【Java学习笔记之二十二】解析接口在Java继承中的用法及实例分析
- 扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi(续)
- Java面向对象抽象类案例分析
- 【Java学习笔记之二十三】instanceof运算符的用法小结
- 基础才是重中之重~多线程的代价~我的内存都被吃了!
- 【Java学习笔记之二十八】深入了解Java8新特性
- 【Java学习笔记之二十四】对Java多态性的一点理解
- 【Java学习笔记之二十六】深入理解Java匿名内部类
- 【Java学习笔记之二十五】初步认知Java内部类
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- shell脚本快速入门之-----函数
- shell脚本快速入门之-----循环(for、while、until)
- ThreadPoolExecutor系列三——ThreadPoolExecutor 源码解析
- shell脚本快速入门之-----数组
- JSTL
- shell脚本快速入门之-----正则三剑客之三awk用法大全!!!
- 一起来看看1stOpt到底有多强大?
- shell脚本快速入门之-----深入介绍Expect免交互
- shell脚本快速入门之-----Here document使用方法总结
- spring框架应用系列一:annotation-config自动装配
- 弄它!!!2020年了你还不懂ACL嘛,小编带你走进ACL的世界,分分钟搞定!!!
- jsp实用过滤器写法
- 搞它!!! Linux 查看CPU信息,机器型号,内存等信息
- shell脚本快速入门之----sort、uniq和tr
- 社区开源框架网络模块:ConnectionManager详解