场上预计得分: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. 第二章 Python数据类型详解

    基本概念 迭代(iteration):如果给定一个list或tuple,我们可以通过for循环来遍历,这种遍历我们称为迭代(iteration) 可变:value改变,id不变,可变类型是不可hash ...

  2. Pyhton学习——Day4

    '''y=2*x+1x=3y->7x=3y->7'''# def test(x):# '''# 2*x+1# :param x:整形数字# :return: 返回计算结果# '''# y= ...

  3. 粘包解决高端_Client

    from socket import * #导入套接字模块的所有命令import struct #导入struck模块,用于封装数据流长度# from functools import partial ...

  4. jQuery优化性能的十种方法

    1,总是从ID选择器开始继承 例如: <div id="content"> <form method="post" action=" ...

  5. 百度图标echarts.js的使用

    echarts官网:http://echarts.baidu.com/api.html#echarts echarts是百度公司开的一种开源制作图片工具,是一个专门制作图表的开源工具,功能非常强大,地 ...

  6. ES modules

    注意:这篇文章讲的是正经的es module规范 及浏览器的实现!webpack项目中es module会被parse成commonjs,和这个没大关系! 总结: ES模块加载的主要过程: 构造 —— ...

  7. 前端JS 异常处理实践

    前端异常处理,常见的场景是在“异步请求”的操作过程当中,所谓“异常”---就是“不正常”,程序的运行不符合我们的预期. 程序“正常”的处理,是我们在开发过程当中的“重中之重”,是必要的“硬性指标”. ...

  8. BZOJ 2244 [SDOI2011]拦截导弹 (三维偏序CDQ+线段树)

    题目大意: 洛谷传送门 不愧为SDOI的duliu题 第一问?二元组的最长不上升子序列长度?裸的三维偏序问题,直接上$CDQ$ 由于是不上升,需要查询某一范围的最大值,并不是前缀最大值,建议用线段树实 ...

  9. UDP Linux编程(客户端&服务器端)

    服务器端 服务器不用绑定地址,他只需要进行绑定相应的监听端口即可. #include <sys/types.h> #include <sys/socket.h> #includ ...

  10. 使用展开操符作替代 .apply() (prefer-spread)

    在ES2015以前,你必须使用Function.prototype.apply()来调用可变函数. var args = [1, 2, 3, 4]; Math.max.apply(Math, args ...