场上预计得分: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 题解&做题心得的更多相关文章

  1. [NOIP补坑计划]NOIP2015 题解&做题心得

    感觉从15年开始noip就变难了?(虽然自己都做出来了……) 场上预计得分:100+100+60~100+100+100+100=560~600(省一分数线365) 题解: D1T1 神奇的幻方 题面 ...

  2. [NOIP补坑计划]NOIP2017 题解&做题心得

    终于做完了…… 场上预计得分:?(省一分数线:295) 由于看过部分题解所以没有预计得分qwq 题解: D1T1 小凯的疑惑 题面 震惊!一道小学奥数题竟难倒无数高中考生! 欢迎大家以各种姿势*和谐* ...

  3. [NOIP补坑计划]NOIP2016 题解&做题心得

    感觉16年好难啊QAQ,两天的T2T3是不是都放反了啊…… 场上预计得分:100+80+100+100+65+100=545(省一分数线280) ps:loj没有部分分,部分分见洛咕 题解: D1T1 ...

  4. [NOIP补坑计划]NOIP2013 题解&做题心得

    场上预计得分:100+100+100+100+100+60=560(省一分数线410) 五道傻逼题+一道大搜索题…… 题解: D1T1 转圈游戏 题面 水题送温暖~ #include<algor ...

  5. [NOIP补坑计划]NOIP2014 题解&做题心得

    六道普及组题,没啥好说的 场上预计得分:100+100+100+100+100+100=600(省一分数线490) (AK是不可能AK的,这辈子不可能AK的) 题解: D1T1 生活大爆炸版石头剪刀布 ...

  6. [BJOI2016]水晶 做题心得

    [BJOI2016]水晶 做题心得 这是一个写了我两小时的傻逼题.写这个题浪费了一堆时间后,我才意识到我码力又不行了.于是整理起了实现技巧,开始练码力. 思路 不难.首先把 \((x,y,z)\) 变 ...

  7. CF1416D 做题心得

    CF1416D 做题心得 上次在某trick中提到了这个题,一开始觉得太毒瘤没有写,现在把它补上了. 感觉实现这个东西,比单纯收获一个trick,收获的东西多太多了. 主要思路 它的主要trick是& ...

  8. [JSOI2019]节日庆典 做题心得

    [JSOI2019]节日庆典 做题心得 一个性质有趣的字符串题 这要是在考场上我肯定做不出来吧 一开始还以为要 SAM 什么的暴力搞,没想到只用到了 \(Z\) 函数 -- 也是我生疏了罢 (学了啥忘 ...

  9. 2018.我的NOIP补全计划

    code: efzoi.tk @ shleodai noip2011 D1 选择客栈 这道题是一道大水题,冷静分析一会就会发现我们需要维护最后一个不合法点和前缀和. 维护最后一个不合法点只要边扫描边维 ...

随机推荐

  1. Win10 UI入门 pivot multiable DataTemplate

    this is a dynamic pivot with sliderable navigation and multiableDatatemplate Control 看了 alexis 大哥的pi ...

  2. 搭建svn服务器(ubuntu)

    ubuntu搭建svn服务器 环境:ubuntu 12.04.5 apt-get install subversion 找个目录作为svn的仓库 mkdir svn svnadmin create s ...

  3. 【HiJ1m】在NOIP2017前写过的有用的东西汇总

    http://www.cnblogs.com/Elfish/p/7544623.html 高级树状数组 http://www.cnblogs.com/Elfish/p/7554420.html BST ...

  4. MBR和GPT分区学习

    1.MBR 早期的windows和linux都采用的MBR的方法来处理开机引导程序和分区表,对于linux的MBR分区来讲,0柱面0磁道1扇区用于引导驱动程序,第一扇区有512个字节,前446字节存放 ...

  5. Windows桌面美化

    [工具链接]链接: https://pan.baidu.com/s/12aUGsu91F8WfaW5HU5ps3g 提取码: dnan [样例] [美化步骤] 1.解压下载文件,安装两个软件: Sta ...

  6. JavaScript 实现留言框

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. POJ 1185 炮兵阵地 (状压dp)(棋盘dp)

    这题和poj 3254很像,但是更复杂了一些 都属于棋盘里放东西,然后又各种各样的限制,然后求方案或者最大值 (1)上一道题距离要大于1,这道题是大于2.所以判断的时候变成 !(x & (x ...

  8. 前端实现input[type='file']上传图片预览效果

    众所周知JavaScript在设计上处于安全角度考虑,是不允许读写本地文件的(原因请自行百度): 但是在实际项目应用中,经常会使用到上传图片,并且可以让用户直接预览图片.对于此种做法有两种方法可以实现 ...

  9. Mybatis 中 foreach collection 的三种用法

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...

  10. Css学习总结(2)——60个有用CSS代码片段

    1.垂直对齐 如果你用CSS,则你会有困惑:我该怎么垂直对齐容器中的元素?现在,利用CSS3的Transform,可以很优雅的解决这个困惑: .verticalcenter{ position: re ...