NOIp2018集训test-9-16(联考二day2)
T1旋转子段
一开始脑袋抽了花了近一个小时写了个跟这题毫无关系的莫名其妙的代码,一急代码就各种bug,最后t1就花了一个半小时多,然后后面时间不太够了,考得稀烂。
因为每个数存在唯一的中心使得绕这个中心翻转后成为”不动点“,容易想到枚举对称中心。因为把关于这个中心对称的所有点都翻转不一定最优(然而王巨直接全翻过了,数据大概是用脚造的),那么按到对称中心的距离排序后一一枚举翻到哪个位置的答案,不翻的部分用前缀和数组维护即可,每个点只会在它的对称中心被枚举到,所以复杂度是nlogn(set or 排序)的。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,a[N],sa[N],sum[N],f[N],ans; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct node {
int i,ai;
node(int i,int ai):i(i),ai(ai){}
friend bool operator <(const node&A,const node&B) {
return max(A.i,A.ai)<max(B.i,B.ai);
}
};
multiset<node>vc[N]; #define ANS
int main() {
#ifdef ANS
freopen("rotate.in","r",stdin);
freopen("rotate.out","w",stdout);
#endif
read(n);
For(i,,n) {
read(a[i]);
sa[a[i]]=i;
sum[i]=sum[i-]+(a[i]==i);
vc[i+a[i]].insert(node(i,a[i]));
}
For(i,,n) {
int r=max(i,a[i]),l=min(i,a[i]);
f[i]=sum[l-];
}
For(i,,*n) if(vc[i].size()) {
int tp=;
while(vc[i].size()){
node x=*vc[i].begin();
vc[i].erase(vc[i].begin());
tp++;
ans=max(ans,f[x.i]+tp+sum[n]-sum[max(x.i,x.ai)]);
}
}
printf("%d\n",ans);
Formylove;
}
/*
20
12 2 6 16 3 17 19 15 13 4 11 20 8 10 18 1 9 5 7 14
*/
T2跳房子
这是一个很sb的dijkstra,但是机房大多数人(除了yicongli)都没考虑清楚,总是在同一个地方打两次传送门来传送,会被这样的数据卡掉
#####
#...#
#...#
#.C.#
#...#
#...#
#.F.#
#####
题解说的是,先跑一遍dijkstra找到每个点最近的墙,我看到这个数据的时候也是这样想的,但是ycl吊打标解。
如图,从一个点到离它最近的墙和它要去的目标点的交点的路径上是一定没有墙的,否则就不是最近的墙了,所以一定可以直接走到那个交点,然后从交点打出两个传送门进行传送,所以把每个点向它四周能到达的第一个墙连距离为四个距离的最小值的边就可以了。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,sx,sy,tx,ty,xx[]={,,-,},yy[]={-,,,};
char s[N][N]; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct node {
int x,y,dis;
node(int x,int y,int dis):x(x),y(y),dis(dis){}
friend bool operator <(const node&A,const node&B) {
return A.dis>B.dis;
}
}; int ok(int x,int y) { return x>=&&x<=n&&y>=&&y<=m; } #define pr pair<int,int>
#define fi first
#define se second
pr tt[N][N][];
int td[N][N];
void pre() {
memset(td,/,sizeof(td));
For(i,,n) {
For(j,,m) {
if(s[i][j]!='#'&&s[i][j-]!='#') {
tt[i][j][].fi=tt[i][j-][].fi;
tt[i][j][].se=tt[i][j-][].se;
}
else tt[i][j][].fi=i,tt[i][j][].se=j;
td[i][j]=min(td[i][j],j-tt[i][j][].se);
}
Rep(j,m,) {
if(s[i][j]!='#'&&s[i][j+]!='#') {
tt[i][j][].fi=tt[i][j+][].fi;
tt[i][j][].se=tt[i][j+][].se;
}
else tt[i][j][].fi=i,tt[i][j][].se=j;
td[i][j]=min(td[i][j],tt[i][j][].se-j);
}
}
For(j,,m) {
For(i,,n) {
if(s[i][j]!='#'&&s[i-][j]!='#') {
tt[i][j][].fi=tt[i-][j][].fi;
tt[i][j][].se=tt[i-][j][].se;
}
else tt[i][j][].fi=i,tt[i][j][].se=j;
td[i][j]=min(td[i][j],i-tt[i][j][].fi);
}
Rep(i,n,) {
if(s[i][j]!='#'&&s[i+][j]!='#') {
tt[i][j][].fi=tt[i+][j][].fi;
tt[i][j][].se=tt[i+][j][].se;
}
else tt[i][j][].fi=i,tt[i][j][].se=j;
td[i][j]=min(td[i][j],tt[i][j][].fi-i);
}
}
} int dis[N][N],vis[N][N];
priority_queue<node>que;
void dijkstra() {
que.push(node(sx,sy,));
while(!que.empty()) {
node tp=que.top();
que.pop();
if(dis[tp.x][tp.y]!=tp.dis||vis[tp.x][tp.y]) continue;
vis[tp.x][tp.y]=;
For(i,,) {
int nx=tp.x+xx[i],ny=tp.y+yy[i];
if(ok(nx,ny)&&s[nx][ny]!='#') {
if(dis[nx][ny]>tp.dis+) {
dis[nx][ny]=tp.dis+;
que.push(node(nx,ny,tp.dis+));
}
}
pr t=tt[tp.x][tp.y][i];
if(t.fi==tp.x&&t.se==tp.y) continue;
if(dis[t.fi][t.se]>tp.dis++td[tp.x][tp.y]) {
dis[t.fi][t.se]=tp.dis++td[tp.x][tp.y];
que.push(node(t.fi,t.se,tp.dis++td[tp.x][tp.y]));
}
}
}
} #define ANS
int main() {
#ifdef ANS
freopen("cell.in","r",stdin);
freopen("cell.out","w",stdout);
#endif
read(n); read(m);
For(i,,n) {
scanf("%s",s[i]+);
For(j,,m) {
if(s[i][j]=='C') sx=i,sy=j;
else if(s[i][j]=='F') tx=i,ty=j;
}
}
pre();
memset(dis,/,sizeof(dis));
int inf=dis[][];
dis[sx][sy]=;
dijkstra();
if(dis[tx][ty]==inf) puts("no");
else printf("%d\n",dis[tx][ty]);
Formylove;
}
/*
4 5
#####
#C#.#
###F#
#####
*/
T3column
我的树状数组还是当年ppz教的,一直不是很会搞树状数组,知道标解但是树状数组半天弄不陈展,然后最后放弃了直接打了个暴力,下来后想着要写树状数组还是头疼,就写了线段树,于是很快就过了。。
枚举每个点i作为最高点,然后二分高度,如果此时aj<hj的多于aj>hj的就r--否则l++
aj和hj的关系,对于i左边的点看 hi+(i-j)-aj正负,右边看hi+(j-i)-aj的正负,展开之后用数据结构维护就好了。
因为树状数组的时候我总是搞不清楚查的上下界什么的,写线段树的时候虽然写得比较丑,但是直接传进v让它去帮我找小于v或大于v的东西,这样我自己就很容易理清楚
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,a[N],b[N],sz,a1[N],a2[N];
LL ans=1e18; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} #define pr pair<int,LL>
#define fi first
#define se second
#define lc (x<<1)
#define rc ((x<<1)|1)
#define mid ((l+r)>>1) struct sgtree{
pr sg[N<<];
void update(int x,int l,int r,int pos,int f) {
if(l==r) {
sg[x].fi+=f;
sg[x].se+=b[l]*f;
return;
}
if(pos<=mid) update(lc,l,mid,pos,f);
else update(rc,mid+,r,pos,f);
sg[x].fi=sg[lc].fi+sg[rc].fi;
sg[x].se=sg[lc].se+sg[rc].se;
} pr qryx(int x,int l,int r,int v) {
if(b[r]<v) return sg[x];
if(b[l]>=v) return make_pair(,);
pr rs,tp;
if(b[mid]>=v) return qryx(lc,l,mid,v);
rs=sg[lc];
tp=qryx(rc,mid+,r,v);
rs.fi+=tp.fi,rs.se+=tp.se;
return rs;
} pr qryd(int x,int l,int r,int v) {
if(b[l]>v) return sg[x];
if(b[r]<=v) return make_pair(,);
pr rs,tp;
if(b[mid]<=v) return qryd(rc,mid+,r,v);
rs=sg[rc];
tp=qryd(lc,l,mid,v);
rs.fi+=tp.fi,rs.se+=tp.se;
return rs;
}
}t1,t2; void solve() {
For(i,,n) {
b[++b[]]=i+a[i];
b[++b[]]=i-a[i];
}
sort(b+,b+b[]+);
sz=unique(b+,b+b[]+)-(b+);
For(i,,n) {
a1[i]=lower_bound(b+,b+sz+,i+a[i])-b;
a2[i]=lower_bound(b+,b+sz+,i-a[i])-b;
t1.update(,,sz,a1[i],);
}
For(i,,n) {
t1.update(,,sz,a1[i],-);
int l=max(i,n-i+),r=1e9+n,rs=;
while(l<=r) {
pr tp1=t2.qryd(,,sz,i-mid);
pr tp2=t2.qryx(,,sz,i-mid);
pr tp3=t1.qryx(,,sz,mid+i);
pr tp4=t1.qryd(,,sz,mid+i);
LL tpans=((LL)tp1.fi*(mid-i)+tp1.se)-((LL)tp2.fi*(mid-i)+tp2.se)+
((LL)tp3.fi*(mid+i)-tp3.se)-((LL)tp4.fi*(mid+i)-tp4.se)+abs(mid-a[i]);
ans=min(ans,tpans);
if(tp1.fi+tp3.fi>tp2.fi+tp4.fi) r=mid-;
else l=mid+;
}
t2.update(,,sz,a2[i],);
}
} #define ANS
int main() {
#ifdef ANS
freopen("column.in","r",stdin);
freopen("column.out","w",stdout);
#endif
read(n);
For(i,,n) read(a[i]);
solve();
printf("%lld\n",ans);
Formylove;
}
/*
4
1 1 2 3
*/
NOIp2018集训test-9-16(联考二day2)的更多相关文章
- NOIp2018集训test-9-22(am/pm) (联考三day1/day2)
szzq学长出的题,先orz一下. day1 倾斜的线 做过差不多的题,写在我自己的博客里,我却忘得一干二净,反而李巨记得清清楚楚我写了的. 题目就是要最小化这个东西 $|\frac{y_i-y_j} ...
- NOIp2018集训test-9-15(联考二day1)
T1.矩阵游戏 水题.每一行最后乘的数为x[i],每一列为y[i],暴力算第一行的列的贡献,每一行的列的贡献是公差为所有列的贡献之和的等差数列,然后每一行再乘上行的贡献求和即为答案. //Achen ...
- 六省联考2017 Day2
目录 2018.3.27 Test 总结 T1 T2 T3 BZOJ.4873.[六省联考2017]寿司餐厅(最小割ISAP 最大权闭合子图) 考试代码 T1 T2 T3 2018.3.27 Test ...
- NOIp2018集训test-9-8(pm) (联考一day2)
把T1题读错了,想了一个多小时发现不可做.然后打了t2,常数不优秀.然后去打t3,lct,结果打挂爆0了. 然后今天就爆炸了. 如果这是noip我今年就可以直接回去学常规了.学常规多好,多开心. 今天 ...
- NOIp2018集训test-10-22 (联考六day2)
中间值 两个log肯定会被卡.我用的第一种做法,就是要各种特判要在两个序列都要二分比较麻烦. //Achen #include<bits/stdc++.h> #define For(i,a ...
- SD六校联考二轮
数据差评 D1T1 string 直接模拟 每次 string_u = const_string + string_v 理论得分 30 实际可得 100 D2T1 n^2 理论得分 30 实际可得 1 ...
- ZR10.1青岛集训三地联考
ZR10.1青岛集训三地联考 谢谢dijk和smy A 题目大意: 已知斐波那契数列\(f\) 设 \[ F_i = \sum_{i = 0}^nf_if_{n - i} \] 求 \[ \sum_{ ...
- CQOI2019(十二省联考)游记
CQOI2019(十二省联考)游记 Day -? 自从联赛爆炸,\(THUWC\)爆炸,\(WC\)爆炸(就没有不爆炸的)之后我已经无所畏惧... 听说是考\(4.5 h\)吗? Day -1 \(Z ...
- 2019十二省联考 Round 1 && 济南市市中心游记
在这样一场毒瘤的省选中 这道题目无疑是命题人无私的馈赠 大量精心构造的部分分,涵盖了题目中所有涉及的算法 你可以利用这道题目,对你是否能够进入省队进行初步检查 经典的模型.较低的难度和不大的代码量,能 ...
随机推荐
- pygame征途:(一)图片移动反弹
题目大意: 就是弄一张图片在背景画布上移动,然后碰到边界就图片翻转并且反向移动 基本思路: 需要pygame常用的一些常用的函数,然后基本就是在背景画布上blit一张图片,然后移动就是先全刷成背景画布 ...
- nginx获取头部信息带下划线,获取不到解决方案
nginx获取头部信息带下划线,获取不到解决方案 解决方案: 修改配置文件,进行添加信息如下: underscores_in_headers on; 然后进行重新加载: [root@qa-web co ...
- leetcode-按奇偶排序数组II
Python解决方法: class Solution(object): def sortArrayByParityII(self, A): j = 1 for i in xrange(0, len(A ...
- PHP FILTER_SANITIZE_EMAIL 过滤器
定义和用法 FILTER_SANITIZE_EMAIL 过滤器删除字符串中所有非法的 e-mail 字符. 该过滤器允许所有的字母.数字以及 $-_.+!*'{}|^~[]`#%/?@&= N ...
- 构造——cf1202d
和以前有一题构造01串的很像,固定住一个7,求出3的个数,对1的位置进行贪心 /* 1337 1 13337 3 133337 6 1333337 10 */ #include<bits/std ...
- express简易代理请求
var express = require('express') var app = express() var proxy = require('http-proxy-middleware') va ...
- CSS:CSS 字体
ylbtech-CSS:CSS 字体 1.返回顶部 1. CSS 字体 CSS字体属性定义字体,加粗,大小,文字样式. serif和sans-serif字体之间的区别 在计算机屏幕上,sans-se ...
- Windows 7旗舰版产品密钥
http://www.xitongcheng.com/jiaocheng/win7_article_45903.html 一.Windows 7旗舰版产品密钥 零售版: Windows 7 Ultim ...
- 访问者模式和 ASM
文章目录 一. 概述 & 定义 二. 示例 2.1 创建抽象元素 2.2 创建具体元素 2.3 创建抽象访问者 2.4 创建具体访问者 2.5 访问者代码调用 三. ASM 中的访问者模式 3 ...
- Microsoft specification
http://msdn.microsoft.com/en-US/ 搜索 specification 搜索"PE COFF specification",得到一篇Microsoft官 ...