省选联测 38

挂分大场。光光要杀我。

今天的四个题题目名称都是 Arcaea 的梯子名字。放个参考。

Lost World 失落的世界(主线第一章背景)
Outer Reaches 谜域的界外(Memory Forest & Singularity 背景/故事 短篇 背景)
Spire of Convergence 聚合的塔尖(主线第四章/故事 主线背景)
Dormant Echoes 沉眠的回声(咲弥/故事 支线 背景)
Boundless Divide 无央的决裂(主线第五章/故事 主线 背景2)
Forgotten Construct 遗忘的构念(拉格兰 背景)
Horizon of Anamnesis 回首的天际(主线第六章/故事 主线 背景3)
Beyond 不要打(字面意思)

然而主线背景确实是没有 Testify 的。

失落的世界

很诡异。首先我们显然要让这个二分的 mid 左右横跳。具体怎么跳,可以先假设每次都向右跳,预处理出操作序列然后往回推。

暂且不知道为什么把 vector 放函数里边就过了。哦多测那没事了。

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <vector>
#include "world.h"
#define int long long
using namespace std;
int Guess(int n){
	vector<int>v;
	int l=1,r=n;
	while(l<r){
		int mid=(l+r)>>1;v.push_back(mid);l=mid+1;
	}
	reverse(v.begin(),v.end());
	int x=1,od=1;
	for(int x:v)x+=od*x,od=-od;
	l=1;r=n;
	while(l<r){
		int mid=(l+r)>>1;
		x+=od*mid,od*=-1;
		if(Query(x))r=mid;
		else l=mid+1;
	}
	return l;
}

谜域的界外

发现点的坐标是指数增长的,那可以预处理 1e18 内的所有点,\(O(n^2)\) 爆扫选哪一段就行了。

没开 int128 挂 50。6。

#include <cstdio>
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
int n,ans,ax,ay,bx,by,t,X,Y;
int x[110],y[110];
__int128 dis(__int128 x1,__int128 y1,__int128 x2,__int128 y2){
	return (x2>x1?x2-x1:x1-x2)+(y2>y1?y2-y1:y1-y2);
}
signed main(){
	scanf("%lld%lld%lld%lld%lld%lld%lld%lld%lld",&x[0],&y[0],&ax,&ay,&bx,&by,&X,&Y,&t);
	for(n=1;;n++){
		x[n]=ax*x[n-1]+bx;y[n]=ay*y[n-1]+by;
		if(x[n]>=1e18||y[n]>=1e18)break;
	}
	for(int i=0;i<n;i++){
		for(int j=i;j<n;j++){
			if(min(dis(X,Y,x[i],y[i]),dis(X,Y,x[j],y[j]))+dis(x[i],y[i],x[j],y[j])<=t)ans=max(ans,j-i+1);
		}
	}
	printf("%lld\n",ans);
	return 0;
}

聚合的塔尖

不知道怎么想到根号分治的。

对于 \(k\) 小于根号的点,暴力跑出每个点距离最远的根号个点。对于大于根号的点,它们不超过根号个,暴力拓扑排序。

不过似乎预处理暴力一点也能过。我直接 sort 而且没去重过了,不需要火车头,就是慢点。然后阈值参考了 rk1 的那个调了 100。

#pragma GCC optimize(3)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
const int sq=100;
int n,m,Q,ans=-1,dis[100010],a[100010];
bool vis[100010];
vector<int>g[100010];
vector<pair<int,int> >v[100010];
void tuopu(int st){
    for(int i=1;i<st;i++)dis[i]=-0x3f3f3f3f;
    dis[st]=0;
    for(int x=st;x>=1;x--){
        if(!vis[x])ans=max(ans,dis[x]);
        for(int v:g[x])dis[v]=max(dis[v],dis[x]+1);
    }
}
int main(){
    scanf("%d%d%d",&n,&m,&Q);
    for(int i=1;i<=m;i++){
        int u,v;scanf("%d%d",&u,&v);g[v].push_back(u);
    }
    for(int i=1;i<=n;i++){
        v[i].push_back(make_pair(0,i));
        for(int x:g[i]){
            for(pair<int,int>p:v[x])v[i].push_back(make_pair(p.first+1,p.second));
        }
        sort(v[i].begin(),v[i].end(),greater<pair<int,int> >());
        while(v[i].size()>sq)v[i].pop_back();
    }
    while(Q--){
        int st,k;scanf("%d%d",&st,&k);ans=-1;
        for(int i=1;i<=k;i++)scanf("%d",&a[i]),vis[a[i]]=true;
        for(pair<int,int>p:v[st]){
            if(!vis[p.second]){
                ans=p.first;break;
            }
        }
        if(ans==-1)tuopu(st);
        printf("%d\n",ans);
        for(int i=1;i<=k;i++)vis[a[i]]=false;
    }
    return 0;
}

沉眠的回声

我知道我不知道我知道我不知道,但是我不知道我不知道我知道。

大概明白了《庄子与惠子游于濠梁之上》的用意。(完全没理解)

两张表情包:

感觉上边这张缺点什么。

先不会着。

posted @ 2023-02-23 15:49  gtm1514  阅读(111)  评论(3编辑  收藏  举报