场上预计得分: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. UVa 11520 Fill in the Square

    题意:给出 n*n的格子,把剩下的格子填上大写字母,使得任意两个相邻的格子的字母不同,且从上到下,从左到右的字典序最小 从A到Z枚举每个格子填哪一个字母,再判断是否合法 #include<ios ...

  2. 云上建站快速入门:博客、论坛、CMS、电子商务网站统统搞定

    现在制作一个网站已经越来越容易了,只要知道清晰的流程之后都是可以很快的建好一个企业或者个人网站的!免费的建站程序很多,下面听哥给你亮出来,建站一般来说分主要有这四步:申请域名.申请虚拟主机.制作网页, ...

  3. Jquery 过滤器(first,last,not,even,odd)的使用和区别

    Jquery 过滤器主要有first,last,not,even,odd等等,它们分别表示: 代码如下: $(function(){ $("#menu li:first").cli ...

  4. 使用命令:ssh-add 时,出现 “Could not open a connection to your authentication agent.”

    为 GitHub 账号设置 SSH Key时, 使用命令:ssh-add,出现“Could not open a connection to your authentication agent”,解决 ...

  5. Svn 提交新文件

    1.右击文件: 2.按图做:

  6. HDU 4311 Contest 2

    求的是曼哈顿距离.可以把X,Y的距离分开来求.其中,求X.Y的距离可以通过排序后递推的方式求出值的. #include <iostream> #include <algorithm& ...

  7. [CSS3] CSS Background Images

    Body with background image and gradient html { background: linear-gradient(#000, white) no-repeat; h ...

  8. 远古守卫/cocos2d-x 源代码/塔防游戏/高仿王国保卫战

    下载地址:spm=686.1000925.0.0.j3MZhz&id=550780702354" style="color:rgb(224,102,102)"&g ...

  9. JDBC连接mysql时出现的ssl问题

    使用MySQL数据库时出现如下错误: WARN: Establishing SSL connection without server's identity verification is not r ...

  10. jQuery Mobile(jqm)button的隐藏和显示,包含a标签,圆角和非圆角button

    在移动互联网时代,HTML5开发越来越收到欢迎. 于是各种HTML5的框架都出来了.因为对于jquery的熟悉,jquery mobile 为多数人选择学习的对象.我也是众多追求者之中的一个.近期一直 ...