[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 选择客栈 这道题是一道大水题,冷静分析一会就会发现我们需要维护最后一个不合法点和前缀和. 维护最后一个不合法点只要边扫描边维 ...
随机推荐
- luogu P3387 【模板】缩点_拓扑排序
还是很好些的. Code: #include <stack> #include <cstdio> #include <algorithm> #include < ...
- Day 02 - 02 编程语言的分类
编程语言的分类 机器语言分为: 1.机器语言 优点:执行代码效率非常快 缺点:开发效率低 2.汇编语言 优点(相对于机器语言):开发效率高 缺点(相对于机器语言):执行效率低 3.高级语言 解释型(同 ...
- 使用highcharts动态绘制折线图——so easy
之前学习highcharts发现网上的教程大部分是对highcharts数据的注释,如何动态绘制数据大部分一笔带过,让那些初涉开发的小白云里雾里,所以我就写了一篇这样的博客. <html> ...
- django patch 解决 ["'15428560000' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."]
__init__.py import datetime from django.apps import AppConfig from django.db.models.fields import Da ...
- ZOJ 3203 Light Bulb( 三分求极值 )
链接:传送门 题意: 求影子长度 L 的最大值 思路:如果 x = 0 ,即影子到达右下角时,如果人继续向后走,那么影子一定是缩短的,所以不考虑这种情况.根据图中的辅助线外加相似三角形定理可以得到 L ...
- [USACO 2009 Feb Gold] Fair Shuttle (贪心+优先队列)
题目大意:有N个站点的轻轨站,有一个容量为C的列车起点在1号站点,终点在N号站点,有K组牛群,每组数量为Mi(1≤Mi≤N),行程起点和终点分别为Si和Ei(1≤Si<Ei≤N).计算最多有多少 ...
- thinkPHP利用ajax异步上传图片并显示、删除
近来学习tp5的过程中,项目中有个发帖功能,选择主题图片.如下: 利用原始的文件上传处理,虽然通过原始js语句能实时显示上传图片,但是这样的话会涉及很多兼容问题.使用ajax技术,实现选择性删除所选图 ...
- LeetCode 11. Container With Most Water 单调队列
题意 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai ...
- SQL SERVER-数据库的远程访问解决办法
除了下面的这个RemoteDacEnabled更改为true之后,还要把防火墙关闭,才能通过IP地址访问数据库 来自为知笔记(Wiz)
- jdk动态代理(转)
一旦这样绑定后,那么在进入代理对象方法调用的时候就会到HelloServiceProxy的invoke方法上,invoke方法有三个参数:第一个proxy是代理对象,第二个是当前调用那个方法,第三个是 ...