场上预计得分: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. TCP基本概念

    TCP协议是一个复杂的.可靠的字节流协议.不通用UDP协议. TCP提供客户与服务器之间的连接.TCP客户先与给定的服务器建立一个连接,再跨该连接与服务器交换数据,最后终止这个连接. TCP提供了可靠 ...

  2. JS自定义功能函数实现动态添加网址参数修改网址参数值

    无论是前端开发还是后台设计,很多时候开发人员都需要获取当前或目标网址的相关信息.这个已有现成的内置对象属性可以直接调用了(下面是获取当前页面的参考代码) 复制代码 代码如下: <script t ...

  3. 安装SSH、配置SSH无密码登录 ssh localhost

    集群.单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server ...

  4. Android开发新手HelloWorld解析

    首先看这个 HelloWorld 类. Java代码public class HelloWorld extends Activity {       /** Called when the activ ...

  5. Postgresql数据库的一些字符串操作函数

    今天做项目遇到客户反映了一个麻烦的事情,有一些数据存在,但就是在程序中搜索不出来,后来分析,发现问题为数据前面有几个空白字符,后来用SQL查询了一下,发现八九个数据表中,数千万条数据中有将近三百万条数 ...

  6. OO第一单元总结__多项式求导问题

    作业一.含幂函数的简单多项式的求导 (1)基于度量的程序结构分析 1. 统计信息图: 2. 结构信息图: 3. 复杂度分析 基本复杂度(Essential Complexity (ev(G)).模块设 ...

  7. Linux配置nignx虚拟主机

    Nginx 是一个轻量级高性能的 Web 服务器, 并发处理能力强, 对资源消耗小, 无论是静态服务器还是小网站, Nginx 表现更加出色, 作为 Apache 的补充和替代使用率越来越高. 我在& ...

  8. ES学习——分析器和自定义分析器

    简介 es在对文档进行倒排索引的需要用分析器(Analyzer)对文档进行分析.建立索引.从文档中提取词元(Token)的算法称为分词器(Tokenizer),在分词前预处理的算法称为字符过滤器(Ch ...

  9. HDU 4321 Contest 3

    题意:给定a和b,n,让你求b+a, b+2*a, .......b+n*a里面有多少1. 当统计第K位的时候 可以注意到 第 B+T*A 和 B+(T+2^(K+1))*A 位是相同的 那么 第K位 ...

  10. MarkDown、Vim双剑合璧

    作为一名软件攻城狮(是的,我从来都以攻城狮自居! 我坚信如今的每一天,都在朝攻城狮迈进.虽然被菜鸟的肉身皮囊裹着,我依然还是怀着攻城狮的内心! 我非常讨厌别人喊我程序猿.虽然这是不争的事实!).... ...