[NOIP补坑计划]NOIP2012 题解&做题心得
场上预计得分:100+90+70+100+100+3060=490520(省一分数线245)
题解:
D1T1 Vigenère 密码
水题送温暖~~
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int l1,l2,p;
char s[],t[];
bool ok;
int work(int t1,int t2){
for(int i=;i<;i++){
if((i+t2)%==t1)return i;
}
}
int main(){
scanf("%s%s",s+,t+);
l1=strlen(s+);
l2=strlen(t+);
for(int i=;i<=l1;i++)if(s[i]>='A'&&s[i]<='Z')s[i]=s[i]-'A'+'a';
for(int i=,j=;i<=l2;i++){
if(t[i]>='A'&&t[i]<='Z')printf("%c",work(t[i]-'A',s[j]-'a')+'A');
else printf("%c",work(t[i]-'a',s[j]-'a')+'a');
if(++j==l1+)j=;
}
return ;
}
D1T2 国王游戏
还是简单题,但是高精度很恶心,写了一个多小时。。。
考虑一个位置$i$和$i+1$的顺序,假设前面的顺序已经安排好了,前缀乘积为$pre$,奖励的金币为$num$:
如果安排$i$在$i+1$前面,则$num=max(\frac{pre}{r_i},\frac{pre\times l_i}{r_{i+1}})$
如果安排$i+1$在$i$前面,则$num=max(\frac{pre}{r_{i+1}},\frac{pre\times l_{i+1}}{r_i})$
显然有$\frac{pre}{r_{i+1}}<\frac{pre\times l_i}{r_{i+1}},\frac{pre}{r_i}<\frac{pre\times l_{i+1}}{r_i}$
因此只需对比$\frac{pre\times l_i}{r_{i+1}}$和$\frac{pre\times l_{i+1}}{r_i}$即可;
两边除以$pre$再通分可以得到:当$l_i\times r_i<l_{i+1}\times r_{i+1}$时,$\frac{pre\times l_i}{r_{i+1}}<\frac{pre\times r_{i+1}}{r_i}$
所以以$l_i\times r_i$作为关键字从小到大排序,这样安排肯定是最优的。
然而。。。这题答案最大可能是$10000^{1000}$,所以要写高精度。。。压位高精度非常恶心,写了我很久。。。
ps:最后一个答案为1的点我RE了,特判掉了,-10pts
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
struct task{
int a,b;
friend bool operator <(task a,task b){
return a.a*a.b<b.a*b.b;
}
}t[];
int n,aa,bb,s[],ss[],ans[];
bool ok=true;
bool chk(int a[],int b[]){
if(a[]!=b[])return a[]<b[];
for(int i=a[];i;i--){
if(a[i]!=b[i])return a[i]<b[i];
}
return false;
}
void mul(int s[],int x){
int p=,i;
for(i=;i<=s[]||p;i++){
s[i]=s[i]*x+p;
p=s[i]/;
s[i]%=;
}
s[]=i-;
}
void trydiv(int s[],int x){
int p=;
for(int i=s[];i;i--){
ss[i]=s[i]+p*;
p=ss[i]%x;
ss[i]/=x;
}
ss[]=s[];
while(!ss[ss[]])ss[]--;
if(chk(ans,ss))memcpy(ans,ss,sizeof(ss));
}
int main(){
scanf("%d%d%d",&n,&aa,&bb);
for(int i=;i<=n;i++){
scanf("%d%d",&t[i].a,&t[i].b);
}
if(aa==&&bb==)return !puts("");
sort(t+,t+n+);
s[]=s[]=;
mul(s,aa);
for(int i=;i<n;i++){
mul(s,t[i].a);
trydiv(s,t[i+].b);
}
printf("%d",ans[ans[]]);
for(int i=ans[]-;i;i--){
printf("%4.4d",ans[i]);
}
return ;
}
D1T3 开车旅行
(看了题解)场上写了个看到暴力分很高就写了个70分$n^2$暴力,实际上这题正解并不是很难……
可以先用set求出距每个点最近和次近的点(STL大法好),然后直接倍增模拟两个问就行了……细节注意一下
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<set>
#define inf 100000000000000000
#define eps 1e-9
using namespace std;
typedef long long ll;
struct cts{
int h,id;
friend bool operator <(cts a,cts b){
return a.h<b.h;
}
}a[];
struct _cts{
int dis,id;
friend bool operator <(_cts x,_cts y){
return x.dis==y.dis?a[x.id].h<a[y.id].h:x.dis<y.dis;
}
}t[];
int n,m,_s,x,tot,f[][][],g[][],t1[],t2[];
ll ans=-,aa=inf,bb=,nwa,nwb;
set<cts>s;
void gao(int k){
set<cts>::iterator it=s.find(a[k]);
tot=;
if(it!=s.begin()){
it--;
t[++tot]=(_cts){abs(it->h-a[k].h),it->id};
if(it!=s.begin()){
it--;
t[++tot]=(_cts){abs(it->h-a[k].h),it->id};
it++;
}
it++;
}
if((++it)!=s.end()){
t[++tot]=(_cts){abs(it->h-a[k].h),it->id};
if((++it)!=s.end()){
t[++tot]=(_cts){abs(it->h-a[k].h),it->id};
it--;
}
it--;
}
sort(t+,t+tot+);
if(tot>)t1[k]=t[].id;
t2[k]=t[].id;
}
void query(int s,int x,ll &reta,ll &retb){
for(int i=;i>=;i--){
if(g[s][i]&&f[s][i][]+f[s][i][]<=x){
reta+=f[s][i][];
retb+=f[s][i][];
x-=f[s][i][]+f[s][i][];
s=g[s][i];
}
}
if(t1[s]&&abs(a[t1[s]].h-a[s].h)<=x){
reta+=abs(a[t1[s]].h-a[s].h);
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i].h);
a[i].id=i;
}
for(int i=n;i;i--){
s.insert(a[i]);
if(i<n)gao(i);
}
for(int i=;i<=n;i++){
if(t1[i])f[i][][]=abs(a[i].h-a[t1[i]].h);
if(t2[t1[i]])f[i][][]=abs(a[t2[t1[i]]].h-a[t1[i]].h);
g[i][]=t2[t1[i]];
}
for(int j=;j<=;j++){
for(int i=;i<=n;i++){
g[i][j]=g[g[i][j-]][j-];
f[i][j][]=f[i][j-][]+f[g[i][j-]][j-][];
f[i][j][]=f[i][j-][]+f[g[i][j-]][j-][];
}
}
scanf("%d",&x);
for(int i=;i<=n;i++){
nwa=nwb=;
query(i,x,nwa,nwb);
if(nwb&&(ans==-||aa*nwb>bb*nwa)){
aa=nwa;
bb=nwb;
ans=i;
}
}
printf("%d\n",ans);
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d",&_s,&x);
nwa=nwb=;
query(_s,x,nwa,nwb);
printf("%lld %lld\n",nwa,nwb);
}
return ;
}
D2T1 同余方程
怎么出模板题啊。。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
ll a,b;
ll exgcd(ll a,ll b,ll &d,ll &x,ll &y){
if(!b){
d=a;
x=;
y=;
}else{
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
ll getinv(int a,int p){
ll d,x,y;
exgcd(a,p,d,x,y);
return (x+p)%p;
}
int main(){
scanf("%lld%lld",&a,&b);
printf("%lld",getinv(a,b));
return ;
}
D2T2 借教室
感觉比D1T2简单?一眼秒出线段树$O(nlogn)$做法,但是题目数据范围$n$和$m$都是$10^6$,吓得我以为有$O(n)$做法。。。又想了五分钟想出了差分+二分答案的做法,但时间复杂度还是$O(nlogm)$的,感觉不会有更好的做法,于是就码了一个,于是就过了。。。
对于每个订单打标记加到差分数组里,然后二分答案即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
int n,m,L,R,d[],s[],t[];
ll pre,r[],nw[];
bool ok=true;
bool check(int k){
for(int i=;i<=n;i++)nw[i]=;
pre=;
for(int i=;i<=k;i++){
nw[s[i]]+=d[i];
nw[t[i]+]-=d[i];
}
for(int i=;i<=n;i++){
pre+=nw[i];
if(pre>r[i])return false;
}
return true;
}
int main(){
memset(nw,,sizeof(nw));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%lld",&r[i]);
}
for(int i=;i<=m;i++){
scanf("%d%d%d",&d[i],&s[i],&t[i]);
nw[s[i]]+=d[i];
nw[t[i]+]-=d[i];
}
for(int i=;i<=n;i++){
pre+=nw[i];
if(pre>r[i]){
ok=false;
break;
}
}
if(ok)return !puts("");
L=,R=m;
while(L<R){
int mid=(L+R)/;
if(check(mid))L=mid+;
else R=mid;
}
printf("-1\n%d",L);
return ;
}
D2T3 疫情控制
(看了题解)场上写了个60分$O(n^2logn)$的暴力,详细题解请看这篇博客
总结:
1.今天时间不充裕,没有严格按照noip时间来写题,随便做了做,三个小时干完两天的前两题之后就对着两道T3发呆,然而并没有搞出来,这样不能很好地模拟考场上的环境,以后要注意;
2.简单题要尽量写快点,不要总是出弱智错,对节奏有很大影响;
3.看到T3不要慌,实际上题解并不会用到很高级的算法(noip不考数据结构flag++),D1T3是个神秘倍增,D2T3大贪心,严格来说都不算很难,要仔细分析题目+熟练使用各种基础思想(二分,贪心等),放宽心态,不要让思想进入死胡同。
4.SBLOJ!
[NOIP补坑计划]NOIP2012 题解&做题心得的更多相关文章
- [NOIP补坑计划]NOIP2015 题解&做题心得
感觉从15年开始noip就变难了?(虽然自己都做出来了……) 场上预计得分:100+100+60~100+100+100+100=560~600(省一分数线365) 题解: D1T1 神奇的幻方 题面 ...
- [NOIP补坑计划]NOIP2017 题解&做题心得
终于做完了…… 场上预计得分:?(省一分数线:295) 由于看过部分题解所以没有预计得分qwq 题解: D1T1 小凯的疑惑 题面 震惊!一道小学奥数题竟难倒无数高中考生! 欢迎大家以各种姿势*和谐* ...
- [NOIP补坑计划]NOIP2016 题解&做题心得
感觉16年好难啊QAQ,两天的T2T3是不是都放反了啊…… 场上预计得分:100+80+100+100+65+100=545(省一分数线280) ps:loj没有部分分,部分分见洛咕 题解: D1T1 ...
- [NOIP补坑计划]NOIP2013 题解&做题心得
场上预计得分:100+100+100+100+100+60=560(省一分数线410) 五道傻逼题+一道大搜索题…… 题解: D1T1 转圈游戏 题面 水题送温暖~ #include<algor ...
- [NOIP补坑计划]NOIP2014 题解&做题心得
六道普及组题,没啥好说的 场上预计得分:100+100+100+100+100+100=600(省一分数线490) (AK是不可能AK的,这辈子不可能AK的) 题解: D1T1 生活大爆炸版石头剪刀布 ...
- [BJOI2016]水晶 做题心得
[BJOI2016]水晶 做题心得 这是一个写了我两小时的傻逼题.写这个题浪费了一堆时间后,我才意识到我码力又不行了.于是整理起了实现技巧,开始练码力. 思路 不难.首先把 \((x,y,z)\) 变 ...
- CF1416D 做题心得
CF1416D 做题心得 上次在某trick中提到了这个题,一开始觉得太毒瘤没有写,现在把它补上了. 感觉实现这个东西,比单纯收获一个trick,收获的东西多太多了. 主要思路 它的主要trick是& ...
- [JSOI2019]节日庆典 做题心得
[JSOI2019]节日庆典 做题心得 一个性质有趣的字符串题 这要是在考场上我肯定做不出来吧 一开始还以为要 SAM 什么的暴力搞,没想到只用到了 \(Z\) 函数 -- 也是我生疏了罢 (学了啥忘 ...
- 2018.我的NOIP补全计划
code: efzoi.tk @ shleodai noip2011 D1 选择客栈 这道题是一道大水题,冷静分析一会就会发现我们需要维护最后一个不合法点和前缀和. 维护最后一个不合法点只要边扫描边维 ...
随机推荐
- Mysql ERROR 1067: Invalid default value for 字段
问题: //今天把一个数据库的sql文件导入到另一个数据库出现以下异常: Mysql ERROR 1067: Invalid default value for 字段 //原因是因为之前导出数据里面有 ...
- gcp – 源于CP的高级命令行文件拷贝工具
作者:linux 出处:http://linux.cn/thread/11868/1/1/ gcp – 源于CP的高级命令行文件拷贝工具 几周前,我们讨论了高级拷贝(修改于cp命令,让其可以显示复制进 ...
- poj 2663 Tri Tiling (状压dp+多米诺骨牌问题+滚动数组反思)
本来直接一波状压dpAC的 #include<cstdio> #include<cstring> #include<algorithm> #define REP(i ...
- unity 支持圆形、切倒角和虚化UGUI Shader
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt ...
- 关于Vue实例的生命周期(2)
关于Vue实例的生命周期(2) 创建(create)->挂载(mount)->更新(update)->销毁(destory) 钩子函数触发事件 beforeCreate 在实例初始 ...
- Core abstraction layer for telecommunication network applications
A new sub-system, the core abstraction layer (CAL), is introduced to the middleware layer of the mul ...
- jquery简直是太酷炫强大了
链接地址:http://www.yyyweb.com/350.html Web 开发中很实用的10个效果[源码下载] 小鱼 发布于 3年前 (2014-07-15) 分类:前端开发 阅读(303741 ...
- [using_microsoft_infopath_2010]Chapter5 为表单添加逻辑规则
本章概要: 1.在表单中使用逻辑和验证,不写代码 2.使用规则任务板 3.添加表单条件格式 4.通过函数和公式添加更加高级的规则 5.通过对驶入使用规则创建直观的用户界面
- libLAS1.8.0 编译和配置(VS2013+Win7 64)(一)
libLAS 是一个用来读写三维激光雷达数据(LiDAR) 的 C++ 库.在学习.科研和研发中都会广泛运用.怎样编译和配置自己所须要版本号的libLAS库确是一件麻烦耗时的事情. 笔者在Win7 6 ...
- javascript 获取指定范围随机数
<script type="text/javascript"> function GetRandomNum(Min,Max){ var Range = Max - Mi ...