首页 > 其他分享 >【21 ZR联赛集训 day10】跑得比谁都快

【21 ZR联赛集训 day10】跑得比谁都快

时间:2024-09-27 14:13:41浏览次数:1  
标签:ch 21 int ll len day10 vec ZR mp

【21 ZR联赛集训 day10】跑得比谁都快

\(O(nq)\) 做法显然,不讲。

如果我们把所有红绿灯的位置 \(mod (g+r)\),放到数据结构里,就可以 \(O(\log n)\) 的时间内找到第一个红灯的位置。

然后我们预处理每个红绿灯红灯结束的时刻开始,走到终点要用的时间 \(f_i\),DP 倒序求解。

对于每个询问,我们找到第一个红灯的位置,答案就是直线走到这个红绿灯用时 + 等完红灯用时 +\(f_i\)。

Code

以下是用 map 维护的一个方法。map 里的元素按 \(<第一关键字,第二关键字>\) 的顺序排序。

#include<bits/stdc++.h>
#define pf printf
#define sf scanf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define isdigit(x) (x>='0'&&x<='9')
#define int ll
using namespace std;
typedef long long ll;
const int N=2e5+7,mod=2147483647;
template <typename T>
void read(T &sum){
	sum=0;
	T fl=1;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) (ch=='-')&&(fl=-1);
	for(;isdigit(ch);ch=getchar()) sum=(sum<<3)+(sum<<1)+ch-'0';
	sum=sum*fl;
}
template <typename T>
void write(T x){
	static int st[36];
	int top=0;
	if(x<0) putchar('-'),x=-x;
	do{
		st[top++]=x%10,x/=10;
	}while(x);
	while(top) putchar(st[--top]+'0');
}
template <typename T>
void write(T x,char ch){
	write(x);
	putchar(ch);
}

int n,q;
int g,r;
int len[N];
ll tim;
ll ans;
ll wait(ll t){
	ll x=t%(g+r);
	if(x<g) return 0ll;
	else return r+g-x;
}
int vec[N];
int add(int a,int b) {
	return ((a+b)%(g+r)+(g+r))%(g+r);
}
map<int,int> mp;
int f[N];
int ask(int u,int x){
	int y=(--mp.upper_bound(x))->second;
	return len[y]-len[u]+(y==n+1?0:add(-x,-len[y])+f[y]);
}
void update(int l,int r,int x){
	auto L=mp.lower_bound(l),R=--mp.upper_bound(r);
	int y=R->second;
	mp.erase(L,++R);
	mp[l]=x,mp[r]=y;
}
signed main(){
	read(n),read(g),read(r);
	rep(i,1,n+1){
		read(len[i]);
		len[i]+=len[i-1];
//		vec[++vec[0]]=len[i]%(g+r);
	}
	mp[0]=n+1;
//	sort(vec+1,vec+vec[0]+1);
//	vec[0]=unique(vec+1,vec+vec[0]+1)-vec-1;
	for(int i=n;i>=1;i--){
		int ll=add(g,-len[i]),rr=add(0,-len[i]);
		f[i]=ask(i,add(0,-len[i]));
		if(ll<=rr) update(ll,rr,i);
		else update(ll,g+r,i),update(0,rr,i);
	}
	read(q);
	rep(i,1,q){
		read(tim);
		tim=tim^(ans%mod);
		ans=tim+ask(0,add(0,tim));
		write(ans,'\n');
	}
}

标签:ch,21,int,ll,len,day10,vec,ZR,mp
From: https://www.cnblogs.com/liyixin0514/p/18435602

相关文章

  • 【20联赛集训day10】玩游戏
    【20联赛集训day10】玩游戏给一个长度为\(n\)的序列,\(|a_i|\le10^{13}\)。给出一个\(k\)问从\(k\)出发不断向两端拓展,满足任何时刻的区间和\(\le0\),问能否拓展到区间\((1,n]\)。考虑贪心,分别维护\(k\)左边和右边的区间,维护一个指针。每次贪心地向一边走,走到能走到......
  • 【20zr提高组十连测day10】心
    【20zr提高组十连测day10】心首先不同的操作序列一定在某个时刻使数组内容不同,因此我们只需要统计合法的操作序列数量。一个合法的最终数组形如若干个\(1,M\),而且\(1,M\)之间可能有若干个\(x\),长度为\(n+1\)。造成这个数组的操作序列必须满足所有操作\(1,M\)按顺序排列,......
  • 【20zr提高组十连测day10】信
    【20zr提高组十连测day10】信给定\(n,m\),\(n,m\le10^5\),给定分别长度为\(n-1,m,n,m-1\)的单调不减的序列\(A,B,C,D\),然后形如该图建边:考虑到序列是递增的,对于除最左上角以外的每个点,每个点一定要选和自己相连的一条边才能形成一棵树。那么选择左边或上边一定是更优的,而且......
  • 【20联赛集训day10】排列
    【20联赛集训day10】排列一个长度为\(n\)的排列,每次操作删除所有存在相邻的数字比它更大的数字,问执行\(k\)次操作后剩下恰好一个数的排列方案数。首先因为每次删除至少删一半的数字,所以最多删\(\log\)次。对于一个排列,我们可以发现把序列按最大值劈开,左右两边互不干扰,成......
  • [SWPUCTF 2021 新生赛]easy_md5
    分析一下代码, name不等于password,namd,md5值和password,md5值相等。get传参name,post传参password。$name!=$password&&md5($name)==md5($password)属于MD5绕过中的php==弱类型绕过有两个办法,第一个办法就是importrequests#网站的URLurl="http://node7.a......
  • 【LeetCode Hot 100】21. 合并两个有序链表
    题目描述最简单粗暴的想法是将两个链表的所有元素拿出来放在一个数组中,再将此数组排序,最后生成一个新链表并返回。由于给出的参数本身就是两个排好序的链表,可以进行一次遍历,就能保证元素仍然是有序的:每次比较当前指针指向的两个元素的大小,较小的拿出来作为当前元素并将指针向前移......
  • 易优CMS出现:Allowed memory size of 134217728 bytes exhausted (tried to allocate 2
    当你遇到“Allowedmemorysizeof134217728bytesexhausted(triedtoallocate20480bytes)”的错误时,这意味着PHP的内存限制已经耗尽。这种错误通常发生在处理大量数据或执行复杂计算时。为了解决这个问题,可以采取以下几种方法:方法1:修改 php.ini 文件(推荐)找到 php......
  • 易优CMS登录后台报Allowed memory size of 134217728 bytes ex hausted (tried to alo
    当你在登录后台时遇到“Allowedmemorysizeof134217728bytesexhausted(triedtoallocate20480bytes)”的错误提示时,通常是由于PHP的内存限制不足导致的。以下是一些具体的解决步骤:步骤1:检查PHP配置登录宝塔面板登录宝塔面板。在左侧菜单栏选择“软件商店”。......
  • 题解 QOJ837 / ZROI1287【Giant Penguin】
    PetrozavodskWinter2020.Day3.300iqContest3.ProblemG.GiantPenguinGiantPenguin-Problem-QOJ.ac题目描述有一个\(n\)个点\(m\)条边的连通无向无权图,满足每个节点在至多\(k\)个简单环上(没有重复顶点的环是简单环)。\(q\)次操作支持:1.标记一个点;2.询问......
  • 【20省选十联测day10】Easy Win
    【20省选十联测day10】EasyWin题意原题链接有\(n\)堆石子,\(n\le5\times10^5\),每堆石子有\(a_i\)个,\(a_i\len\)。Alice和Bob每次可以从,某一堆取至少\(1\)颗、至多\(x\)颗石子,不能取的失败。Alice先手,问对于所有\(1\lex\len\),问谁胜利。思路对于一堆石子,计......