场上预计得分: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. thinkphp 5 count()方法在控制器,模板中的使用方法

    thinkphp中关于count()方法的使用: 控制器中:echo count($arr)模板中:{$arr | count}模板中if判断语句中 <if condition="co ...

  2. 洛谷1099 [NOIP2007] 树网的核

    链接https://www.luogu.org/problemnew/show/P1099 题目描述 设T=(V,E,W)是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称TTT为 ...

  3. [luogu]P3572 [POI2014]PTA-Little Bird(单调队列)

    P3572 [POI2014]PTA-Little Bird 题目描述 In the Byteotian Line Forest there are nn trees in a row. On top ...

  4. CORS与JSONP的区别

    CORS与JSONP: a. JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求. b. 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSON ...

  5. java application指的是什么

    在Java语言中,能够独立运行的程序称为Java应用程序(Application).Java语言还有另外一种程序——Applet程序.Applet程序(也称Java小程序)是运行于各种网页文件中,用于 ...

  6. 使用 Xshell 连接 linux 系统

    一.下载 Xshell 链接:https://pan.baidu.com/s/1htwqpzm 密码:zau7 二.安装 Xshell 无脑下一步就可以了 三.连接 linux 四.安装 Xftp h ...

  7. 使用excel进行数据挖掘(3)----类别检測

    使用excel进行数据挖掘(3)----类别检測 在配置环境后,能够使用excel进行数据挖掘. 环境配置问题可參阅: http://blog.csdn.net/xinxing__8185/artic ...

  8. MLPclassifier,MLP 多层感知器的的缩写(Multi-layer Perceptron)

    先看代码(sklearn的示例代码): from sklearn.neural_network import MLPClassifier X = [[0., 0.], [1., 1.]] y = [0 ...

  9. 在vmware下为oracle RAC 创建共享存储的总结

    首先,介绍下用命令行vm-diskmanager形式创建磁盘文件的方法(其实,图形界面添加新磁盘就是调用此命令).       很多网上文章提及plainmaker.exe去创建共享磁盘,是以前的版本 ...

  10. Linux进程精讲

    进程相关概念 程序和进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu.内存.打开的文件.设备.锁....) 进程,是一个抽象的概念,与操作系统原理联系紧密.进程是活跃的程序,占用系 ...