P4097 [HEOI2013]Segment(李超樹)
阿新 • • 發佈:2019-02-09
print 數據 tdi name 真的 org getchar ast printf
鏈接
https://www.luogu.org/problemnew/show/P4097
https://www.lydsy.com/JudgeOnline/problem.php?id=3165
思路
還是模板超哥線段樹
註意沒有斜率的時候
還有貌似卡精度了,long doule不行,需要eps判等(也許是我太醜了)
確實拍出許多毛病,但是懶得提交直接下數據
下錯了,對拍了兩小時沒看出啥毛病,最後測了測std才發現,真的是zz
代碼
#include <iostream> #include <cmath> #include <cstdio> #define ls rt<<1 #define rs rt<<1|1 using namespace std; const int N=100000; const long double EPS=1e-9; int read() { int x=0,f=1;char s=getchar(); for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1; for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0'; return x*f; } int t[N<<2]; long double a[N],b[N]; long double f(int x,int id) {return a[x]*id+b[x];} bool cmp(int x,int y,int id) {return abs(f(x,id)-f(y,id))<=EPS ? 0 : f(x,id)-f(y,id)>EPS;} void modify(int l,int r,int L,int R,int k,int rt) { if(L<=l&&r<=R) { if(l==r) { if(cmp(k,t[rt],r)) t[rt]=k; return; } int mid=(l+r)>>1; if(a[k]==a[t[rt]]&&b[k]>b[t[rt]]) { t[rt]=k; return; } else if(a[k]>a[t[rt]]) { if(cmp(k,t[rt],mid)) modify(l,mid,L,R,t[rt],ls),t[rt]=k; else modify(mid+1,r,L,R,k,rs); } else if(a[k]<a[t[rt]]) { if(cmp(k,t[rt],mid)) modify(mid+1,r,L,R,t[rt],rs),t[rt]=k; else modify(l,mid,L,R,k,ls); } } else { int mid=(l+r)>>1; if(L<=mid) modify(l,mid,L,R,k,ls); if(R>mid) modify(mid+1,r,L,R,k,rs); } } int query(int l,int r,int L,int rt) { if(l==r) return t[rt]; int mid=(l+r)>>1; int tmp= L<=mid ? query(l,mid,L,ls) : query(mid+1,r,L,rs); return abs(f(t[rt],L)-f(tmp,L))<EPS ? min(t[rt],tmp) : f(t[rt],L)>f(tmp,L) ? t[rt] : tmp; } main() { int n=read(),js=0; int x[2],y[2],k,lastans=0; for(int i=1;i<=n;++i) { int opt=read(); if(opt) { x[0]=read(),y[0]=read(),x[1]=read(),y[1]=read(); x[0]=(x[0]+lastans-1)%39989+1; y[0]=(y[0]+lastans-1)%1000000000+1; x[1]=(x[1]+lastans-1)%39989+1; y[1]=(y[1]+lastans-1)%1000000000+1; if(x[1]==x[0]) { a[++js]=0; b[js]=max(y[0],y[1]); } else { a[++js]=(1.0*(y[1]-y[0])/(x[1]-x[0])); b[js]=y[0]-a[js]*x[0]; } modify(1,50000,min(x[0],x[1]),max(x[0],x[1]),js,1); } else { k=read(); k=(k+lastans-1)%39989+1; lastans=query(1,50000,k,1); printf("%d\n", lastans); } } return 0; }
P4097 [HEOI2013]Segment(李超樹)