NOI2013 Day1
NOI2013 Day1
向量内积
题目描述:两个\(d\)维向量\(A\)与\(B\)的内积为其相对应维度的权值的乘积和,现有\(n\)个\(d\)维向量 ,求是否存在两个向量的内积为\(k\)(\(k=2,3\))的倍数。
solution:
考虑\(k=2\),以下为在\((mod 2)\)下运算,设矩阵\(A_1,A_2\),

设矩阵\(P=A_1 * A_2\),若非对角线出现\(0\),则有一对内积为\(0\)
\(P\)对角线上的\(0\)要处理一下
设矩阵\(F\),令\(F_{ii}+P_{ii}=1\),其余为\(0\)
设矩阵\(G\)全为\(1\)
矩阵\(T=G-F-P\),问题转为求是否有一元素在\(T\)中为\(1\)
随机一\(n * 1\)矩阵\(X\),若\(L=T * X,L_{i,1}=1\),则\(T_i\)有一元素为\(1\)
\(L=T * X=G * X-F * X-A_1 * (A_2 * X)\)
第一部分\(O(n)\), 第二部分\(O(nd)\),第三部分\(O(nd)\)。
考虑\(k=3\),\((mod 3)=0,1,2\),因为\(1 * 1=1(mod 3),2 * 2=1(mod 3)\),所以将内积结果平方就可以了。
假设两个\(d\)维向量\(A,B\)
\((A * B)^2=(A_1B_1+A_2B_2+ \cdots +A_dB_d)(A_1B_1+A_2B_2+ \cdots +A_dB_d)\)
\(=(A_1A_1+A_1A_2+ \cdots +A_1A_d+A_2A_1+ \cdots +A_2A_d+ \cdots +A_dA_d)*(B_1B_1+B_1B_2+ \cdots +B_1B_d+B_2B_1+ \cdots +B_2B_d+ \cdots +B_dB_d)\)
所以只需要将\(d\)维扩展到\(d^2\)维即可, 以上操作均在\((mod 3)\)下运算,所以只要\(L\)有非零就可以了。
时间复杂度:\(O(nd^2)\)
树的计数
题目描述:给定一个 DFS 序和 BFS 序,求符合条件的有根树中,树的高度的平均值。
solution:
这题有点求期望值的味道。
根据\(BFS\)序对\(DFS\)序重标号。\(pos[i]\)表示\(i\)在\(DFS\)的第几位,\(deep[i]\)为\(i\)的深度
for (int i=1; i<=n; ++i) w[BFS[i]]=i;
for (int i=1; i<=n; ++i) DFS[i]=w[DFS[i]];
for (int i=1; i<=n; ++i) pos[DFS[i]]=i;
约束条件:
1、\(1\)为根
2、对于\(BFS\)连续的一段\([L, R]\),如果它们在同一层,必有\(pos[L]<pos[L+1]<\cdots<pos[R]\)
3、对于\(DFS\)的相邻两个数\(d[i],d[i+1]\),必有\(deep[d[i+1]]\leq deep[d[i]]+1\)
设\(s[i]\),当\(s[i]=1\)时,\(i\)与\(i+1\)不在同一层,当\(s[i]=0\)时,可能在同一行也可能不在。
转化约束条件:
1、\(s[i]=1\)
2、若\(pos[i+1]<pos[i],s[i]=1\)
3、若\(DFS[i]<DFS[i+1]\),则\(\sum_{j=d[i]}^{d[i+1]-1} s[i]\leq1\)(若\(DFS[i]>DFS[i+1]\),从\(BFS\)得\(deep[d[i+1]]\leq deep[d[i]]\))
用打标记的方法来表示某一段的\(s[i]\)的值是否确定,不确定的\(s[i]\)可以取\(0,1\)对答案的贡献为\(0.5\)。
因为\(i+1\)可以是\(i\)的儿子或兄弟要满足一下条件:
1、\(i+1\)为儿子时,\(i\)为所在层的最后一个,当\(i+1\)做兄弟时,\(i+1\)为所在层最后一个
2、其它不在\(i\)子树或\(i+1\)子树的点的深度均不超过\(i\),否则\(BFS\)有误。
以\(i+1\)为根的子树方案数是一定的,做儿子还是做兄弟只是多\(1\)的影响,所以贡献为\(0.5\)

(蓝框内不能有点,红框方案相同,最左边错误)
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <deque>
#include <queue>
#include <vector>
#include <map>
#include <complex>
using namespace std;
const int maxn=int(2e5)+100;
typedef int arr[maxn];
int n;
arr DFS, BFS, w, x, mat, sum, pos;
double ans;
void init()
{
scanf("%d", &n);
for (int i=1; i<=n; ++i) scanf("%d", &DFS[i]);
for (int i=1; i<=n; ++i) scanf("%d", &BFS[i]);
for (int i=1; i<=n; ++i) w[BFS[i]]=i;
for (int i=1; i<=n; ++i) DFS[i]=w[DFS[i]];
for (int i=1; i<=n; ++i) pos[DFS[i]]=i;
}
void solve()
{
x[1]=1;
//mat用来标记那一段是确定的
mat[1]++; mat[2]--;
for (int i=1; i<n; ++i)
if (pos[i]>pos[i+1])
{
x[i]=1;
mat[i]++; mat[i+1]--;
}
for (int i=1; i<=n; ++i) sum[i]=sum[i-1]+x[i];
for (int i=1; i<n; ++i)
if (DFS[i]<DFS[i+1])
{
if (sum[DFS[i+1]-1]-sum[DFS[i]-1])
{
mat[DFS[i]]++;
mat[DFS[i+1]]--;
}
}
for (int i=1, cnt=0; i<n; ++i)
{
cnt+=mat[i];
if (cnt) ans+=x[i];//cnt>0说明s[i]是确定的
else ans+=0.5;
}
}
int main()
{
freopen("count.in", "r", stdin);
freopen("count.out", "w", stdout);
init();
solve();
printf("%.3lf\n", ans+1.0);
return 0;
}
时间复杂度:\(O(n)\)
NOI2013 Day1的更多相关文章
- NOIp2016 Day1&Day2 解题报告
Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...
- day1
day1.py ][][: ][: ): : ]['lock'] = 0 json.dump(userlist_message, open(userlist, 'w')) break #输错次数到3次 ...
- day1作业--登录入口
作业概述: 编写一个登录入口,实现如下功能: (1)输入用户名和密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 流程图: readme: 1.程序配置文件: 黑名单文件blacklist.t ...
- luogu1003铺地毯[noip2011 提高组 Day1 T1]
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...
- Python学习路程day1
变量起名: 变量名如果太长,推荐使用下划线来分开,让人看得清晰明白.例:nums_of_alex_girl=19 .或者是驼峰写法,即首字母大写.例:NumOfAlexGf=18 注意:不合法的变量起 ...
- 团队项目——站立会议 DAY1
团队项目--站立会议 DAY1 团队成员介绍(5人):张靖颜.何玥.钟灵毓秀.赵莹.王梓萱 今日(2016/5/6)为站立会议的第一天,一起对团队项目进行讨论,并对每个人的 ...
- Day1 login
使用流程: 1.程序启动后,显示欢迎信息,提示用户输入用户名: 2.判断用户是否存在,不存在则提示重新输入,或者关闭程序:客户存在则提示客户输入密码: 3.判断密码是否正确,如果不正确则提示用户重新输 ...
- contesthunter CH Round #64 - MFOI杯水题欢乐赛day1 solve
http://www.contesthunter.org/contest/CH Round %2364 - MFOI杯水题欢乐赛 day1/Solve Solve CH Round #64 - MFO ...
- noip2011提高组day1+day2解题报告
Day1 T1铺地毯https://www.luogu.org/problem/show?pid=1003 [题目分析] 全部读入以后从最后一个往前找,找到一个矩形的范围覆盖了这个点,那这个矩形就是最 ...
随机推荐
- 各种语言中的urlencode方法
转载自:http://blog.sina.com.cn/s/blog_3f195d2501000a9b.html URLENCODE和URLDECODE是比较常用的URL参数转换方法,为以后使用方便, ...
- C语言入门(18)——数组与字符串
用来存放字符量的数组称为字符数组.字符串可以看作一个数组,它的元素是字符型的. 字符数组的定义 形式与前面介绍的数值数组相同.例如: char c[10]; 由于字符型和整型通用,也可以定义为int ...
- egret随笔-egret浅入浅出
•不知道有多人跟笔者一样,喜欢学各种技术,但是都不精,但也有一两项算是精的. 自从踏上了egret游戏开发的道路,就不得不学习各种技术了,因为,要精通egret,首先必须要会TypeScript,其次 ...
- 简单QT界面信号图形化输入输出
右键->转到槽,选择信号 就可以输入代码 右键->转到槽,选择信号 就可以输入代码 2个文本框接受输入数字,第3个文本框输出相加结果 void Dialog::on_pushButton_ ...
- 网易云课堂_程序设计入门-C语言_第七周:指针与字符串_2GPS数据处理
2 GPS数据处理(6分) 题目内容: NMEA-0183协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The N ...
- Examining the Rooms(dp,斯特灵数)
Examining the Rooms Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 机房收费系统之vb报表的模板的制作(一)
机房收费系统有报表的功能,报表对于我们来说有点陌生.这不是会计的事吗?怎么机房收费系统也參合进来了,事实上我们学会了报表的步骤.理解了代码后.报表变得不是非常难,世上无难事,仅仅怕肯登攀 ...
- 楼天城楼教主的acm心路历程(作为励志用)
楼主个人博客:小杰博客 利用假期空暇之时,将这几年GCJ,ACM,TopCoder 參加的一些重要比赛作个 回顾.昨天是GCJ2006 的回顾,今天时间上更早一些吧,我如今还清晰记得3 年 前,我刚刚 ...
- BaseAdapter 注意的关键点!
BaseAdapter 我们一般就是继承然后重写自定义,然后listview set进去即可! 数据改变的时候,我们习惯这样: public void update(List list) { ...
- 用PS绿化版出现“请卸载并重新安装该产品”的解决方法
下载了一个CS6版本的绿化版PS,解压后发现用不了,因为是不用安装的,所以这个提示明显是没用的. 我把64位破解文件 amtlib.dll和32位破解文件 amtlib.dll都放进去试了一下,结果行 ...