高一考试的题解

本学校高一同学又迎来了一次考试。
本蒟蒻身为验题人,自然要写一个题解来帮助大家(骗访问量)啦。

T1:
显然满足条件的数mod m相同,这样我们开m个vector把mod m相同的数放进同一个vector里。能否有解判断size即可。
答案要求字典序最小,我们比较这些vector的第一个元素(最小的),显然它们两两不可能相同,所以判断它们的大小即可比较字典序。
(话说这题后70分数据是我造的,前面30分队长说有两个"No",某人排序反了只有20,说明我还把他WA了,嗯,没出锅)
代码:

 1 #include<bits/stdc++.h>
 2 const int maxe=1e6+1e2;
 3
 4 std::vector<int> v[maxe];
 5
 6 int main() {
 7     static int n,m,k,t,sel=-1;
 8     scanf("%d%d%d",&n,&k,&m) , assert(m&&m<=1e6);
 9     while(n--) scanf("%d",&t) , v[t%m].push_back(t);
10     for(int i=0;i<m;i++) {
11         if( v[i].size() ) std::sort(v[i].begin(),v[i].end() );
12         if( (signed) v[i].size() >= k && ( !~sel || *v[sel].begin() > *v[i].begin() ) ) sel = i;
13     }
14     if( !~sel ) return puts("No"),0;
15     puts("Yes");
16     for(int i=0;i<k;i++) printf("%d%c",v[sel][i],i!=k-1?‘ ‘:‘\n‘);
17     return 0;
18 }

T2:
这不是裸的三维偏序吗?
一开始队长说256mb内存于是我花了10分钟写了一发树套树。
然后队长说32mb内存于是我又花了10分钟写了一发cdq。
然后队长说数据范围卡cdq,我......
这个三维偏序很特殊,全都是一个排列,我们考虑能否找到什么特殊性质。
一个二元组在三个排列中出现,要么三个顺序,要么有且只有一个顺序(你说两个顺序?我们把这两个元素交换一下就成一个顺序了)。于是我们考虑补集转化,求出非顺序的对数,用C(n,2)去减就是答案。
怎么计算?我们把排列转置一下(a[in[i]]=i),然后两两一组求逆序对。显然一对非顺序的(i,j)会被算且仅算两遍。然后就能得出答案了。
(队长朝我要正好卡掉cdq的数据范围,我说开O2跑1s正解可过1e6,然后他把数据范围设置为2e6开了2s,于是我过了标程TLE了......)
实际上这题复杂度全在IO,于是fread快读大法好。
树套树代码:

 1 #include<bits/stdc++.h>
 2 typedef long long int lli;
 3 const int maxn=1e5+1e2,maxe=1e7+1e2;
 4
 5 int n;
 6 lli ans;
 7
 8 struct SegmentTree {
 9     int lson[maxe],rson[maxe],sum[maxe],cnt;
10     inline void insert(int &pos,int l,int r,const int &tar) {
11         if( !pos ) pos = ++cnt;
12         ++sum[pos];
13         if( l == r ) return;
14         const int mid = ( l + r ) >> 1;
15         tar <= mid ? insert(lson[pos],l,mid,tar) : insert(rson[pos],mid+1,r,tar);
16     }
17     inline int query(int pos,int l,int r,const int &ll,const int &rr) {
18         if( !pos || ( ll <= l && r <= rr ) ) return sum[pos];
19         const int mid = ( l + r ) >> 1;
20         if( rr <= mid ) return query(lson[pos],l,mid,ll,rr);
21         else if( ll > mid ) return query(rson[pos],mid+1,r,ll,rr);
22         else return query(lson[pos],l,mid,ll,rr) + query(rson[pos],mid+1,r,ll,rr);
23     }
24 }sgt;
25
26 struct BinaryIndexTree {
27     int rt[maxn];
28     #define lowbit(x) (x&-x)
29     inline void update(int x,int y) {
30         while( x <= n ) sgt.insert(rt[x],1,n,y) , x += lowbit(x);
31     }
32     inline int query(int x,int y) {
33         int ret = 0; --x , --y;
34         while( x ) ret += sgt.query(rt[x],1,n,1,y) , x -= lowbit(x);
35         return ret;
36     }
37 }bit;
38
39 struct Point {
40     int z,x,y;
41     friend bool operator < (const Point &a,const Point &b) {
42         return a.z < b.z;
43     }
44 }ps[maxn];
45
46 int main() {
47     scanf("%d",&n);
48     for(int i=1,t;i<=n;i++) scanf("%d",&t) , ps[t].z = i;
49     for(int i=1,t;i<=n;i++) scanf("%d",&t) , ps[t].x = i;
50     for(int i=1,t;i<=n;i++) scanf("%d",&t) , ps[t].y = i;
51     std::sort(ps+1,ps+1+n);
52     for(int i=1;i<=n;i++) ans += bit.query(ps[i].x,ps[i].y) , bit.update(ps[i].x,ps[i].y);
53     return printf("%lld\n",ans) , 0;
54 }

CDQ代码:

 1 #include<bits/stdc++.h>
 2 typedef long long int lli;
 3 const int maxn=1e6+1e2,maxe=1e7+1e2;
 4
 5 int n;
 6 lli ans;
 7
 8 struct BinaryIndexTree {
 9     int dat[maxn];
10     #define lowbit(x) (x&-x)
11     inline void update(int x,int y) {
12         while( x <= n ) dat[x] += y , x += lowbit(x);
13     }
14     inline int query(int x) {
15         int ret = 0; --x;
16         while(x) ret += dat[x] , x -= lowbit(x);
17         return ret;
18     }
19 }bit;
20
21 int cmp = 0;
22 struct Point {
23     int z,x,y;
24     friend bool operator < (const Point &a,const Point &b) {
25         return !cmp ? a.z < b.z : ( a.x != b.x ? a.x < b.x : a.y < b.y );
26     }
27 }ps[maxn];
28
29 inline void solve(int l,int r) {
30     if( l == r ) return;
31     const int mid = ( l + r ) >> 1;
32     solve(l,mid) , solve(mid+1,r);
33     cmp = 1 , std::sort(ps+l,ps+mid+1) , std::sort(ps+mid+1,ps+r+1);
34     int cl = l , cr = mid + 1;
35     while( cl <= mid || cr <= r ) {
36         if( cl > mid ) ans += bit.query(ps[cr++].y);
37         else if( cr > r ) bit.update(ps[cl++].y,1);
38         else if( ps[cl].x <= ps[cr].x ) bit.update(ps[cl++].y,1);
39         else ans += bit.query(ps[cr++].y);
40     }
41     for(int i=l;i<=mid;i++) bit.update(ps[i].y,-1);
42 }
43
44 int main() {
45     scanf("%d",&n);
46     for(int i=1,t;i<=n;i++) scanf("%d",&t) , ps[t].z = i;
47     for(int i=1,t;i<=n;i++) scanf("%d",&t) , ps[t].x = i;
48     for(int i=1,t;i<=n;i++) scanf("%d",&t) , ps[t].y = i;
49     cmp = 0 , std::sort(ps+1,ps+1+n) , solve(1,n);
50     return printf("%lld\n",ans) , 0;
51 }

正解代码:

 1 #pragma GCC optimize(2)
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cctype>
 6 typedef long long int lli;
 7 const int maxn=2e6+1e2;
 8
 9 int a[maxn],b[maxn],c[maxn],n;
10 lli ans;
11
12 struct BinaryIndexTree {
13     int dat[maxn];
14     #define lowbit(x) (x&-x)
15     inline void update(int x) {
16         while( x <= n ) ++dat[x] , x += lowbit(x);
17     }
18     inline int query(int x) {
19         int ret = 0;
20         while(x) ret += dat[x] , x -= lowbit(x);
21         return ret;
22     }
23     inline void reset() {
24         memset(dat,0,sizeof(dat));
25     }
26 }bit;
27
28 struct Point {
29     int x,y;
30     friend bool operator < (const Point &a,const Point &b) {
31         return a.x < b.x;
32     }
33 }ps[maxn];
34
35 inline lli C(lli n) {
36     return n * ( n - 1 ) / 2;
37 }
38
39 inline lli calc(int* a,int* b) {
40     lli ret = 0;
41     for(int i=1;i<=n;i++) ps[i] = (Point){a[i],b[i]};
42     bit.reset() , std::sort(ps+1,ps+1+n);
43     for(int i=1;i<=n;i++) bit.update(ps[i].y) , ret += i - bit.query(ps[i].y);
44     return ret;
45 }
46
47 inline char nextchar() {
48     static const int BS = 1 << 21;
49     static char buf[BS],*st=buf+BS,*ed=buf+BS;
50     if( st == ed ) ed = buf + fread(st=buf,1,BS,stdin);
51     return st == ed ? -1 : *st++;
52 }
53 inline int getint() {
54     int ret = 0;
55     char ch;
56     while( !isdigit(ch=nextchar()) );
57     do ret=ret*10+ch-‘0‘; while( isdigit(ch=nextchar()) );
58     return ret;
59 }
60
61 int main() {
62     n = getint();
63     for(int i=1;i<=n;i++) a[getint()] = i;
64     for(int i=1;i<=n;i++) b[getint()] = i;
65     for(int i=1;i<=n;i++) c[getint()] = i;
66     ans = calc(a,b) + calc(a,c) + calc(b,c);
67     ans = C(n) - ( ans >> 1 );
68     return printf("%lld\n",ans) , 0;
69 }

T3:
我能告诉你这题打表找规律可过?
我们考虑暴力找规律,发现二进制每一位被统计个数恰好为更低位(第0位为n/2)次数的一半,且上取整还是下取整与n-1在这位的值有关。于是我们就能AC了。
证明也很简单:
从边权低到高贪心。
考虑边权为2^0的边,差为1的点相互连接,这样的有n/2组,我们缩点。
考虑边权为2^1的边,差为2的点相互连接,这样的有n/2/2组,我们缩点。
以此类推即可。
代码:

 1 #include<bits/stdc++.h>
 2 typedef long long int lli;
 3
 4 lli n,cur,ans;
 5
 6 int main() {
 7     scanf("%lld",&n) , --n , cur = n;
 8     for(int i=0;n;n>>=1,i++) {
 9         if( ( cur = ( cur + ( n & 1 ) ) >> 1 ) & 1 ) ans ^= 1ll << i;
10     }
11     return printf("%lld\n",ans) , 0;
12 }

原文地址:https://www.cnblogs.com/Cmd2001/p/8986481.html

时间: 2024-10-03 14:45:42

高一考试的题解的相关文章

层序遍历二叉树

周末要给老师写个期中考试的题解 最后两道题全都是关于二叉树的一些算法 层序遍历二叉树直接输入数据,建立二叉排序树,利用队列层序输出即可,没什么难度 贴下自己的代码 //功能:层序遍历二叉树 //时间:2014-11-23 #include <iostream> #include <queue> using namespace std; //二叉链表数据结构定义 #define TElemType int typedef struct BiTNode{ TElemType data;

bzoj 4283 魔法少女伊莉雅 - 最短路

题目传送门 需要高级权限的快速通道 题目大意 给定一个$n$个点$m$条边的带正权无向图.要求找一条路径满足: 它是一条简单路径 它是一条严格次短路 对于任何一条可能存在于最短路上的边,不能包含它的反向边. 不存在这条路径输出-1. 神题orz...orz....orz....良心的最短路性质题,涵盖了大部分最短路径树和最短路径图上的常用性质. 直觉是最短路上随意判一判就好了.然后全WA了,qwq.. 然后开始讲正题. 将$d\left(u, v \right )$记为点$u$到点$v$的最短路

6.5 THUSC 考试题解

QAQ 由于并没有数据,而且没有A掉的是提交答案题目,所以并没有修改 QAQ 只能放题解了,代码还没有拿到,不过在清华听了一波习题讲评的安利 第一题 成绩单 先说暴力分 对于单调序列来说最优决策一定是把原序列分成若干段,DP即可 对于单峰序列来说最优决策一定是类似于"汉堡抽肉"一样的东西,即每次从中间抽取一段 然后这样我们就有40分辣 对于n<=20我们可以利用状压DP解决 如果常数写的好听说能过n<=30 这样加起来就有60-70分啦 最后说正解,我们采用区间DP,设f(

CCF考试真题题解

CCF考试认证:题解参考博客http://blog.csdn.net/u014578266/article/details/45221841 问题描述 试题编号: 201503-1 试题名称: 图像旋转 时间限制: 5.0s 内存限制: 256.0MB 问题描述: 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 输入的第一行包含两个整数n, m,分别表示图像矩阵

题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵

原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai& lt;=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2...Am. A1和X1可以为0 分析: 吐槽:这道题的细节问题差点坑死我. 一开始这道题想了个DP,但是状态转移太恶心. 那我们换一个思路,先用KMP构造出A的一个自动机. 然后这道题就转化成了在自动机上跑啊跑,跑N条边都没跑

9.27考试 SD_le NOIP模拟题 第三题 建造游乐场题解

这道题当时没读完题时脑部了无数种问法,然而最后还是猝不及防.一开始还以为是结论题,然而死也退不出来,就先去打第二题了.然后在想这道题时,我想到的是这样的思路(由于当时时间紧迫,尚未完善): 我每次向图中增加两个点,那么这两个点对于所有入度为偶数的点是否连接一定是一致的,如果这两个点相连,那么如果使他们分别和一个入度为单数的点相连,那么他们就是新的入度为单数的点,其他情况就不叙述了,太多了.还不是正解. 由于最后时间太紧迫了,我不得不打暴力去保分,结果还好丢人好丢人的打错了-- 正解其实还是挺有意

BZOJ4868:[SHOI2017]期末考试——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=4868 题目复制于洛谷:https://www.luogu.org/problemnew/show/P3745#sub 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布. 第i位同学希望在第ti天或之前得知所有课程的成绩.如果在第ti天,有至少一门课程的成绩没有公布,他就会等待最后公布成绩的课程公布成绩,每等待一天就会产生C不愉快度.对于第i门课程,按照原本的计划,会在

考试题解集合

某天忽然发现自己的blog里全是考试题解--那么为什么不链到一篇blog里呢?避免首页全是加密blog看起来不大友善,大概也会整齐一点.估计是个大工程但还是作死地开始啦.有些难题是单独写的,就不链了.希望总是能比过去的自己更用心! 2018 2月:21 2017 11月:1-2.4-5.6-7.8-9 10月:1.2.3-6.7-8.9-11.12.13.14-15.17-18.19-20.22-24.25-26.27-28.31 9月:10.14.20.25.27 8月:7.8.9.10.11

Contest2195 - 2019-4-25 高一noip基础知识点 测试8 题解版

(因为david_alwal太懒了,所以本期题解作者为Th Au K,码风不同请自行适应) 传送门 T1 BFS?贪心?我也说不清 反正就是对每一个“#”搜一下他的旁边有没有“#”就行了 代码 T2 excrt 注意一下边界就行了 代码 T3 BFS 出题老师很51地搞错了数据范围 给了200*150实际开了1000*1000过的 注意对于每一个传送门 要判断这个点要传送到的点是否到过 同样要在这个点要传送到的点打标记 代码 T4 二分天数(疯狂diss david_alwal的递归二分) 左边