NC222906. 下克上の天邪鬼
描述
输入描述
第一行两个整数,。含义如题面所示。
第二行 个整数 ,表示序列 。
接下来 行,每行四个整数, ,表示一组询问。
输出描述
共 行,每行输出一个整数,表示最大的 ,或者不存在任何合法数对时输出的 。
示例1
输入:
6 3 8 6 2 3 5 6 2 5 1 3 1 1 3 6 3 5 1 2
输出:
7 14 0
说明:
对于询问 ,有两对妖精 和 满足下克上的条件。但因为 ,因此精彩度最大为 。示例2
输入:
10 10 106 42 110 126 7 52 68 70 73 118 10 10 5 5 9 10 4 4 1 5 4 6 4 9 9 9 4 5 1 3 1 6 1 8 3 5 5 9 4 4 1 3 5 5 4 8 2 4 6 7
输出:
0 0 0 199 236 236 199 236 0 194
说明:
这里本应该有个绝妙的说明,但是这里空白太小了写不下。C++(clang++ 11.0.1) 解法, 执行用时: 2193ms, 内存消耗: 76040K, 提交时间: 2023-04-26 20:31:40
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <stack> #include <queue> using namespace std; typedef long long ll; typedef pair<int,int> PII; const int N=2e7+10,V=1e9,mod=998244353; void add(int &a,ll b); int lc[N],rc[N],cnt[N],root[N],idx=0; int l1,l2,r2,r1,x,y,ans; void modify(int &a,int b,int l,int r,int x) { a=++idx; lc[a]=lc[b];rc[a]=rc[b];cnt[a]=cnt[b]+1; if(l==r)return ; int mid=l+r>>1; if(mid>=x)modify(lc[a],lc[b],l,mid,x); else modify(rc[a],rc[b],mid+1,r,x); } int quary(int x,int y,int l,int r,int t) { if(l>t||cnt[x]-cnt[y]==0)return -1; if(l==r)return l; int mid=l+r>>1,res=-1; if(t>mid) res=quary(rc[x],rc[y],mid+1,r,t); if(!~res)return quary(lc[x],lc[y],l,mid,t); return res; } void quary(int f,int t){if(f)x=quary(root[r1],root[l1-1],1,V,t);else y=quary(root[r2],root[l2-1],1,V,t);} int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { int num; scanf("%d",&num); modify(root[i],root[i-1],1,V,num); } for(int i=1;i<=m;i++) { scanf("%d%d%d%d",&l1,&r1,&l2,&r2); quary(1,V); quary(0,V); while(1) { if(x==-1||y==-1||(y>=x/2&&y<x))break; if(y<x/2)quary(1,2*y+1); else quary(0,x-1); } if(x==-1||y==-1)ans=0; else ans=x+y; printf("%d\n",ans); } } void add(int &a,ll b){a=((a+b)%mod+mod)%mod;return;}