场上预计得分: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. UVA1584-Circular Sequence(紫书例题3.6)

    Some DNA sequences exist in circular forms as in the following gure, which shows a circular sequence ...

  2. [COCI2007]PRAVOKUTNI

    题目大意:在一个平面上,有\(N\)个点,求这些点构成的直角三角形个数.解题思路:枚举直角顶点,对于每个点,将这个点当做原点,对其他点按极角排序,然后双指针扫一遍,判断弧度差即可. C++ Code: ...

  3. POJ 2774 Long Long Message (后缀数组+二分)

    题目大意:求两个字符串的最长公共子串长度 把两个串接在一起,中间放一个#,然后求出height 接下来还是老套路,二分出一个答案ans,然后去验证,如果有连续几个位置的h[i]>=ans,且存在 ...

  4. [luogu2579 ZJOI2005] 沼泽鳄鱼(矩阵快速幂)

    传送门 题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石 ...

  5. 查看Linux系统信息命令

    系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...

  6. SVN提交代码时报405 Method Not Allowed

    原因: 1.删除了某个文件夹,然后又创建了一个同名文件夹 2.之前执行过Add操作,但没上传代码,在电脑上提交了同路径的代码,再次上传时会报错 解决方法: 1. 删除出现错误的文件夹 2. SVN U ...

  7. linux下静态库的生成和使用

    一.静态库概念 1.库是预编译的目标文件(object  files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. 2.标准系统库可在目录/usr ...

  8. css清楚样式

  9. phpexcel乱码问题

    php导出Excel乱码,只需在header函数前加入ob_end_clean();//清除缓冲区,避免乱码

  10. C++11时间具体解释

    转载请注明出处:http://blog.csdn.net/luotuo44/article/details/46854229 C++ 11添加了三个与时间相关的类型:时间段.时钟.时间点. 以史为鉴 ...