noip2009提高组题解
NOIP2009题解
T1:潜伏者
题目大意:给出一段密文和破译后的明文,一个字母对应一个密文字母,要求破译一段密文,如果有矛盾或有未出现密文无法破译输出failed,否则输出明文。
思路:纯模拟题
T2:Hankson的趣味题
题目大意:给出a0,a1,b0,b1求满足条件的x的个数;
条件:gcd(x,a0)=a1;x,b0最小公倍数为b1;
思路:分解质因数,假设对于一个质因数y,a0含有a0c个y,a1含有a1c个y,b0含有b0c个y,b1含有b1c个y。
那么不难得到,如果a0c<a1c,那么就无解;如果a0c=a1c,那么x至少含有a1c个y;如果a0c>a1c,那么x只可能含有a1c个y。
同理,如果b1c<b0c,那么就无解;如果b1c=b0c,那么x至多含有b1c个y;如果b1c>b0c,那么x只可能含有b1c个y。
由此,可以求出对于每一个质数,x可能含有几个它,并求出一共有多少种选择方式。然后根据乘法原理,将每一个质数的选择方案数乘起来,就得到了答案。
----------------------------------------------------------
2017.5.6补充题解:
今天又做了一遍,然后对上面自己的做法一脸懵逼,估计是之前就没看懂吧然后贴了题解???
然后就各种焦虑,物色到了一个超级有道理的题解:
可以证明gcd(x/a1,a0/a1)==1,显然如果不等于1,则gcd(x,a0)<a1;
然后可以证明gcd(b1/x,b1/b0)==1,显然如果不等于1,则lcm(x,b0)<b1;
这样的话,显然就可以枚举b1的所有因数,sqrt(b1),加上gcd复杂度是logb1,所以单组数据复杂度是sqrt(b1)*log2(b1).
T3:最优贸易
题目大意:n个城市m条路,有单向和双向,水晶球在每个城市价格不同,求从城市1到n能获得的最大差价,每个城市可走多次。
思路,边数太多,所以用SPFA,正向做一次取最小,把路都反过来从n倒做一次取最大。在枚举i得到max(max[i]-min[i]);
AC代码:
#include <iostream> using namespace std; int num[]; int map[],nxt[]; int las; int head[]; int map2[],nxt2[]; int las2; int head2[]; void adad(int a,int b) { map[las]=b; nxt[las]=head[a]; head[a]=las++; } void adad2(int a,int b) { map2[las2]=b; nxt2[las2]=head2[a]; head2[a]=las2++; } #define Q_MAX 100000 int used[]; int queue[Q_MAX]; int h,r; void enq(int k) { if (used[k]) return; used[k]=; queue[r]=k; r=(r+)%Q_MAX; } int exq() { int t; t=queue[h]; used[t]=; h=(h+)%Q_MAX; return t; } int minn[]; int maxn[]; int main() { int i,j; int n,m; int a,b,c; cin >> n >> m; for (i=;i<n;i++) { head[i]=head2[i]=-; maxn[i]=-; minn[i]=0xFFFFFFF; cin >> num[i]; } for (i=;i<m;i++) { cin >> a >> b >> c; a--,b--; if (c==) { adad(a,b); adad(b,a); adad2(a,b); adad2(b,a); } else { adad(a,b); adad2(b,a); } } minn[]=num[]; enq(); while (h!=r) { i=exq(); for (a=head[i];a!=-;a=nxt[a]) { j=map[a]; if (minn[j]>minn[i]) { minn[j]=minn[i]; enq(j); } if (minn[j]>num[j]) { minn[j]=num[j]; enq(j); } } } maxn[n-]=num[n-]; enq(n-); while (h!=r) { i=exq(); for (a=head2[i];a!=-;a=nxt2[a]) { j=map2[a]; if (maxn[j]<maxn[i]) { maxn[j]=maxn[i]; enq(j); } if (maxn[j]<num[j]) { maxn[j]=num[j]; enq(j); } } } for (i=a=;i<n;i++) if (a<maxn[i]-minn[i]) a=maxn[i]-minn[i]; cout << a << "\n"; return ; }
T4:靶形数独
题目大意:解一个多解数独,从内向外分数不同,求分数最大的解法。
思路:解法肯定还是一样的,dfs。然后比较分数大小输出最大的。
然而这样会超时,codevs上可以过但是最慢的点用了2400多ms,时限4秒。
借鉴了一下某位神牛,用位运算加快运算速度(难写啊啊啊),试了一下还是能过的。
AC代码:
#include<iostream> #include<cmath> using namespace std; int h[]={},hs[]={},zs[]={},xj[][]={},hq[]={}; int ans=-,st[],a[][]; void make() { int i,j,sum=; for (i=;i<;i++) { for (j=i;j<-i;j++) sum+=(a[i][j]+a[-i][j])*(+i); for (j=i+;j<-i;j++) sum+=(a[j][i]+a[j][-i])*(+i); } sum+=a[][]*; if (sum>ans) ans=sum; } void dfs(int k) { if (k==) make(); else { int x,y,j,pos,p,i=st[k]; x=-h[i]; y=x&-x; h[i]|=y; j=(int)log2(y)+; pos=-(hs[i]|zs[j]|xj[(i-)/][(j-)/]); while (pos>) { p=pos&-pos; pos-=p; a[i][j]=(int)log2(p)+; hs[i]|=p; zs[j]|=p; xj[(i-)/][(j-)/]|=p; if (x==y) dfs(k+); else dfs(k); hs[i]-=p; zs[j]-=p; xj[(i-)/][(j-)/]-=p; } h[i]-=y; } } int main() { int i,j,p0; for (i=;i<;i++) for (j=;j<;j++) { cin >> a[i][j]; if (a[i][j]>) { h[i]|=<<(j-); p0=<<(a[i][j]-); if (((hs[i]&p0)!=)||((zs[j]&p0)!=)||((xj[(i-)/][(j-)/]&p0)!=)) { cout << "-1\n"; return ; } hs[i]|=p0; zs[j]|=p0; xj[(i-)/][(j-)/]|=p0; } else hq[i]++; } for (i=;i<;i++) st[i]=i; for (i=;i<;i++) for (j=i+;j<;j++) if (hq[st[i]]>hq[st[j]]) { st[i]^=st[j]; st[j]^=st[i]; st[i]^=st[j]; } i=; while (hq[st[i]]==) i++; dfs(i); cout << ans << "\n"; return ; }
noip2009提高组题解的更多相关文章
- noip2010提高组题解
NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...
- NOIP 2014 提高组 题解
NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...
- NOIP 2001 提高组 题解
NOIP 2001 提高组 题解 No 1. 一元三次方程求解 https://vijos.org/p/1116 看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~ 数据小 暴力枚举即 ...
- NOIP 2000 提高组 题解
NOIP2000 提高组 题解 No 1. 进制转换 https://www.rqnoj.cn/problem/295 水题 对于n和基数r, 每次用n mod r, 把余数按照逆序排列 注意 mod ...
- 【NOIP2018】提高组题解
[NOIP2018]提高组题解 其实就是把写过的打个包而已 道路铺设 货币系统 赛道修建 旅行 咕咕咕 咕咕咕
- 洛谷 P1073 最优贸易 & [NOIP2009提高组](反向最短路)
传送门 解题思路 很长的题,实际上在一个有向图(点有点权)中求一个从起点1到终点n的路径,使得这条路径上点权最大的点与点权最小的点的差值最大(要求必须从点权较小的点能够走到点权较大的点). ——最短路 ...
- [NOIP2009] 提高组 洛谷P1073 最优贸易
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- [NOIP2009] 提高组 洛谷P1071 潜伏者
题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原 ...
- [NOIP2009] 提高组 洛谷P1074 靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
随机推荐
- JavaScript对象 属性
1.ES中的对象是完全动态的,这意味着,在程序执行的时候我们可以任意的添加,修改或删除对象的属性. var stu = { ID: 1 }; //添加新属性 stu.Name = 'ck'; cons ...
- 原生视觉差滚动---js+css;
<!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...
- PLSQL_性能优化系列04_Oracle Optimizer优化器
2014-09-25 Created By BaoXinjian
- AP_AP系列 - 发票管理分析(案例)
2014-07-07 Created By BaoXinjian
- UVA 253 Cube painting(暴力打表)
Cube painting Problem Description: We have a machine for painting cubes. It is supplied with three d ...
- CLR如何调用虚方法、属性和事件
方法代表在类型或类型的实例上执行某些操作的代码.在类型上执行操作,称为静态方法:在类型的实例上执行操作,称为非静态方法.任何方法都有一个名称.一个签名和一个返回值(可以是void). CLR允许一个类 ...
- IntelliJ IDEA 注册码
IntelliJ IDEA 注册码 *.lanyus.com及*.qinxi1992.cn下的全部授权服务器已遭JetBrains封杀 请搭建自己的IntelliJ IDEA授权服务器,教程在http ...
- Java反射机制探秘
如何获得Class对象 1.针对每一个对象.getCalss(),可以得到对应的Class. 2.Class.forName(String),String的写法:包名.类名.就会创建包名.类名 ...
- CentOS7 安装MongoDB 3.0服务
1,下载&安装 MongoDB 3.0 正式版本发布!这标志着 MongoDB 数据库进入了一个全新的发展阶段,提供强大.灵活而且易于管理的数据库管理系统.MongoDB宣称,3.0新版本不只 ...
- Cordova是做什么的
Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等. Cordova还提供了一组统一的JavaScript类库,以及为这 ...