打铜了

爬了


补题:

$I$

一道终极歪榜题

路线事实上一共有$2H$种,可以映射到$[-H,H)$上,$\ge 0 $的部分表示$x=0$时向上

用$map$简单维护一下即可

 1 #include<bits/stdc++.h>
 2 #define inf 2139062143
 3 #define ll long long
 4 #define db double
 5 #define ld long double
 6 #define ull unsigned long long
 7 #define MAXN 100100
 8 #define MOD 998244353
 9 #define Fill(a,x) memset(a,x,sizeof(a))
10 #define rep(i,s,t) for(int i=(s),i##end=(t);i<=i##end;++i)
11 #define dwn(i,s,t) for(int i=(s),i##end=(t);i>=i##end;--i)
12 #define ren for(int i=fst[x];i;i=nxt[i])
13 #define pii pair<int,int>
14 #define vi vector<int>
15 #define fi first
16 #define se second
17 #define pb push_back
18 using namespace std;
19 inline int read()
20 {
21     int x=0,f=1;char ch=getchar();
22     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
23     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
24     return x*f;
25 }
26 namespace CALC
27 {
28     inline int pls(int a,int b){return a+b>=MOD?a+b-MOD:(a+b<0?a+b+MOD:a+b);}
29     inline int mns(int a,int b){return a-b<0?a-b+MOD:(a-b>=MOD?a-b-MOD:a-b);}
30     inline int mul(int a,int b){return (1LL*a*b)%MOD;}
31     inline void inc(int &a,int b){a=pls(a,b);}
32     inline void dec(int &a,int b){a=mns(a,b);}
33     inline void tms(int &a,int b){a=mul(a,b);}
34     inline int qp(int x,int t,int res=1)
35         {for(;t;t>>=1,x=mul(x,x)) if(t&1) res=mul(res,x);return res;}
36     inline int Inv(int x){return qp(x,MOD-2);}
37 }
38 using namespace CALC;
39 int H,n,m,ans;
40 pii g[MAXN<<1];
41 map<int,int> res;
42 int main()
43 {
44     rep(T,1,read())
45     {
46         ans=0;res.clear();res[0]=0;
47         H=read();n=read();int x,y,ya,yb,tmp;
48         rep(i,1,n) g[i].fi=read(),g[i].se=read();
49         m=read();rep(i,1,m) g[i+n].fi=read(),g[i+n].se=0-read();
50         sort(g+1,g+n+m+1);
51         rep(i,1,n+m)
52         {
53             x=g[i].fi,y=abs(g[i].se);
54             x%=2*H;if(x>=H) y=H-y,x-=H;
55             ya=y-x,yb=y+x<=H?-y-x:2*H-y-x;
56             if(g[i].se>0&&(res.count(ya)||res.count(yb)))
57                 tmp=max(res[ya],res[yb]),res[ya]=res[yb]=tmp;
58             else if(g[i].se<0)
59             {
60                 if(res.count(ya)) res[ya]++,ans=max(ans,res[ya]);
61                 if(res.count(yb)) res[yb]++,ans=max(ans,res[yb]);
62             }
63         }
64         printf("%d\n",ans);
65     }
66 }
View Code

相关文章: