场上预计得分:100+100+100+100+100+60=560(省一分数线410)

五道傻逼题+一道大搜索题……

题解:

D1T1 转圈游戏

题面

水题送温暖~

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
int n,m,k,x,p,num;
int ksm(int x,int y,int p){
int ret=;
for(;y;y>>=,x=(ll)x*x%p){
if(y&)ret=(ll)ret*x%p;
}
return ret;
}
int main(){
scanf("%d%d%d%d",&n,&m,&k,&x);
printf("%d",((ll)m*ksm(,k,n)%n+x)%n);
return ;
}

D1T2 火柴排队

题面

怎么感觉比D1T3还难啊……总是在想DP和贪心结果SB线段树就没了……

显然最优配对是分别排序后对应的数,求出对应位置直接求逆序对即可。

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
#define mod 99999997;
using namespace std;
typedef long long ll;
struct node{
int x,id;
friend bool operator <(node a,node b){
return a.x<b.x;
}
}aa[],bb[];
int n,x,a[],b[],s[];
ll ans=,t[];
void updata(int l,int r,int u,int p){
t[u]++;
if(l==r)return;
int mid=(l+r)/;
if(p<=mid)updata(l,mid,u*,p);
else updata(mid+,r,u*+,p);
}
int query(int l,int r,int u,int L,int R){
if(L<=l&&r<=R){
return t[u];
}
int mid=(l+r)/,ret=;
if(L<=mid)ret+=query(l,mid,u*,L,R);
if(mid<R)ret+=query(mid+,r,u*+,L,R);
return ret;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
aa[i].x=a[i];
aa[i].id=i;
}
for(int i=;i<=n;i++){
scanf("%d",&b[i]);
bb[i].x=b[i];
bb[i].id=i;
}
sort(aa+,aa+n+);
sort(bb+,bb+n+);
for(int i=;i<=n;i++){
s[aa[i].id]=bb[i].id;
}
for(int i=;i<=n;i++){
ans=(ans+s[i]-query(,n,,,s[i])-)%mod;
updata(,n,,s[i]);
}
printf("%d",ans);
return ;
}

D1T3 火车运输

题面

傻逼题,在最大生成树上跑树上倍增即可。

(我AKDay1啦!)

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
struct edge{
int v,w,next;
}a[];
struct _edge{
int u,v,w;
friend bool operator <(_edge a,_edge b){
return a.w>b.w;
}
}e[];
int n,m,u,v,tot=,head[],dep[],fa[],f[][],mi[][];
bool used[];
int ff(int u){
return fa[u]==u?u:fa[u]=ff(fa[u]);
}
void add(int u,int v,int w){
a[++tot].v=v;
a[tot].w=w;
a[tot].next=head[u];
head[u]=tot;
}
void dfs(int u,int ff,int dpt,int minn){
used[u]=true;
dep[u]=dpt;
f[u][]=ff;
mi[u][]=minn;
for(int i=;i<=;i++){
f[u][i]=f[f[u][i-]][i-];
mi[u][i]=min(mi[u][i-],mi[f[u][i-]][i-]);
}
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
if(v!=ff){
dfs(v,u,dpt+,a[tmp].w);
}
}
}
int work(int u,int v){
if(dep[u]<dep[v])swap(u,v);
int ret=inf,l=dep[u]-dep[v];
for(int i=;i>=;i--){
if((<<i)&l){
ret=min(ret,mi[u][i]);
u=f[u][i];
}
}
if(u==v)return ret;
for(int i=;i>=;i--){
if(f[u][i]!=f[v][i]){
ret=min(ret,min(mi[u][i],mi[v][i]));
u=f[u][i],v=f[v][i];
}
}
return min(ret,min(mi[u][],mi[v][]));
}
int main(){
memset(head,-,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=m;i++){
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
}
sort(e+,e+m+);
for(int i=;i<=m;i++){
int u=e[i].u,v=e[i].v,fu=ff(u),fv=ff(v);
if(fu!=fv){
add(u,v,e[i].w);
add(v,u,e[i].w);
fa[fu]=fv;
}
}
for(int i=;i<=n;i++){
if(!used[i])dfs(i,,,inf);
}
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d",&u,&v);
printf("%d\n",(ff(u)==ff(v))?work(u,v):-);
}
return ;
}

D2T1 积木大赛

题面

水题送温暖~

ps:此题同NOIP2018D1T1铺设道路

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
int n,x,las=,ans=;
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&x);
if(x>las)ans+=x-las;
las=x;
}
printf("%d",ans);
return ;
}

D2T2 花匠

题面

这是D2T2????(原数据范围$10^5$,LOJ加到了$2\times 10^6$)

结论是移一位两种情况就互换了

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
int n,x,h0,ans1=,ans2=;
int main(){
scanf("%d%d",&n,&h0);
for(int i=;i<=n;i++){
scanf("%d",&x);
if(x>h0)ans1=max(ans1,ans2+);
if(x<h0)ans2=max(ans2,ans1+);
h0=x;
}
printf("%d",max(ans1,ans2));
return ;
}

D2T3 华容道

题面

可能其他题的难度全集中到这题来了?太久没做过搜索题了,场上$O(qn^4)$60分暴力滚粗;

正解就是预处理每一格向四个方向走的距离然后每次询问做spfa……

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 0x7f7f7f7f
#define eps 1e-9
#define DCSB {puts("-1");return;}
using namespace std;
typedef long long ll;
const int way[][]={{-,},{,},{,-},{,}};
struct node{
int x,y,w;
node(int _x=,int _y=,int _w=){
x=_x,y=_y,w=_w;
}
};
int n,m,q,ans,ex,ey,sx,sy,tx,ty,f[][][],dis[][],mp[][],go[][][][];
bool isin[][][];
bool chk(int x,int y){
return x<||x>n||y<||y>m||!mp[x][y];
}
int bfs(int sx,int sy,int tx,int ty){
if(!mp[sx][sy]||!mp[tx][ty])return inf;
queue<node>q;
memset(dis,0x7f,sizeof(dis));
dis[sx][sy]=;
q.push((node){sx,sy,});
while(!q.empty()){
node u=q.front();
q.pop();
if(u.x==tx&&u.y==ty)return dis[tx][ty];
for(int k=;k<;k++){
int xx=u.x+way[k][],yy=u.y+way[k][];
if(chk(xx,yy)||dis[xx][yy]!=inf)continue;
dis[xx][yy]=dis[u.x][u.y]+;
q.push((node){xx,yy,});
}
}
return inf;
}
void _(){
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
int ch=mp[i][j];
mp[i][j]=;
for(int k=;k<;k++){
for(int l=;l<;l++){
go[i][j][k][l]=bfs(i+way[k][],j+way[k][],i+way[l][],j+way[l][]);
}
}
mp[i][j]=ch;
}
}
}
void spfa(){
queue<node>q;
memset(isin,,sizeof(isin));
for(int k=;k<;k++){
if(f[sx][sy][k]!=inf){
q.push((node){sx,sy,k});
isin[sx][sy][k]=true;
}
}
while(!q.empty()){
node u=q.front();
q.pop();
int x=u.x,y=u.y,w=u.w;
isin[x][y][w]=false;
for(int k=;k<;k++){
int xx=x+way[k][],yy=y+way[k][];
if(chk(xx,yy)||go[x][y][w][k]==inf)continue;
if(f[xx][yy][k^]>f[x][y][w]+go[x][y][w][k]+){
f[xx][yy][k^]=f[x][y][w]+go[x][y][w][k]+;
if(!isin[xx][yy][k^]){
q.push((node){xx,yy,k^});
isin[xx][yy][k^]=true;
}
}
}
}
}
void work(){
if(sx==tx&&sy==ty){
puts("");
return;
}
if((sx==ex&&sy==ey)||chk(sx,sy)||chk(tx,ty)||chk(ex,ey))DCSB;
memset(f,0x7f,sizeof(f));
mp[sx][sy]=;
for(int k=;k<;k++){
f[sx][sy][k]=bfs(ex,ey,sx+way[k][],sy+way[k][]);
}
mp[sx][sy]=;
spfa();
ans=inf;
for(int k=;k<;k++){
ans=min(ans,f[tx][ty][k]);
}
printf("%d\n",ans==inf?-:ans);
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&mp[i][j]);
}
}
_();
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=0;k<4;k++){
for(int l=0;l<4;l++){
printf("%d ",go[i][j][k][l]);
}
}
puts("");
}
puts("");
}*/
for(int i=;i<=q;i++){
scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);
work();
}
return ;
}

总结:

1.两个小时干完五题然后发呆,D1一小时写完,D2前两题加起来800B……就D2T3有点代码量;

2.搜索姿势水平要提高。

[NOIP补坑计划]NOIP2013 题解&做题心得的更多相关文章

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

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

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

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

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

    场上预计得分:100+90+70+100+100+3060=490520(省一分数线245) 题解: D1T1 Vigenère 密码 题面 水题送温暖~~ #include<iostream& ...

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

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

  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. 手机上最简洁的"云笔记"软件

    ❗️注意:该文并不是真的给你介绍各类云笔记的对比 第三方云笔记的缺点 以前用MIUI和Flyme时,自带的记事本很好用,小巧简洁,路上想起什么就写下来,回去后登录网上的个人中心,拿出来加工一下就可以发 ...

  2. ZBrush各种拓展功能的简单介绍

    ZBrush的一些拓展功能中,比较突出的有2.5D的绘画功能,这个功能可以让ZBrush®从一个三维的雕塑软件转变成为一个二维的绘画软件.你完全可以使用ZBrush®来绘制自己喜欢的平面插画,还可以是 ...

  3. 前端框架easyui layout, Tabs,tree

    一.三大前端框架的 1.easyui=jquery+html4(用来做后台的管理界面) 不要钱,开发速度快,不好看,不支持响应式 2.bootstrap=jquery+html5 好看,开发速度快,部 ...

  4. flex-2

    1. 2. justify:整理版面 3. 4.归纳 justify-content:flex-start(默认).center.flex-end 下面还会提到剩下的两种项目在主轴上对齐方式: spa ...

  5. Dobble的学习视频地址

    http://www.tebaidu.com/file-f698fb45eb1b5c59571936118968d86c89194311.html

  6. ubuntu qq2012

    wine qq 2012 for linux Ubuntu 64位兼容(12月21日末日版) 版主: byebye, liyijun, smile, wolfstar 发表回复   340 篇帖子 • ...

  7. V4L2框架分析学习

    1.概述 Video4Linux2是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口.凡是内核中的子系统都有抽象底层硬件的差异,为上层提供统一的接口和提取出公共代 ...

  8. Spring Security中的MD5盐值加密

    在 spring Security 文档中有这么一句话: "盐值的原理非常简单,就是先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算,这样一来,就算密码是一个很常见的字 ...

  9. 【codeforces 794B】Cutting Carrot

    [题目链接]:http://codeforces.com/contest/794/problem/B [题意] 给你一个等腰三角形; 它的底边为1; 高为h; 要求你把这个等腰三角形分成n份面积相等的 ...

  10. 2015 Multi-University Training Contest 3 hdu 5318 The Goddess Of The Moon

    The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...