平衡树维护凸壳/三角函数+递推+线段树


  官方题解:http://pan.baidu.com/s/1sjQbY8H

洛阳城里春光好

  题目大意:(其实出题人已经写的很简短了……直接copy的-_-。sorry!)

一个平面上的n个点构成一个点集。老师会进行Q次操作,每次操作有以下两种可能:
1. 插入操作:给定两个实数x,y,向点集中加入一个坐标为(x,y)的点。
2. 查询操作:给定实数k,取点集中任一点(x,y),求满足方程y=kx+b的b的最大值。
现在小Z想知道,对于数学老师的每次查询,符合题意的b值是多少。

  容易发现我们要找的点是在 凸包上 上凸壳上!(一开始总在想凸包……我真是naive

  然后凸包上的线段的斜率满足单调性,所以我们在凸包上二分(lower_bound)即可找到所求的点……

  这题我是用两个map来实现的,一个map存凸包,另一个map存斜率。

  这里我处理斜率的时候少考虑了一个地方:我在插入凸包中插入一个新点时(p[x]=y),是删除它左右两个点对应直线的斜率,再加入两个新的斜率,然后对凸包进行调整。然而如果p[x]这个位置原来就有一个点的话!就应该是删掉原来的点与两边的点之间线段的斜率,再加入新的斜率,然后对凸包进行调整。

  比较开心的是get了一份平衡树维护凸包的模板~(来自这里:http://blog.csdn.net/auto_ac/article/details/10664641

  其实这个是上凸壳的……如果是凸包的话我们维护两个凸壳就好了,下凸壳的维护方法:将所有点的y坐标取反,然后维护一个新的“上凸壳”(对应原图的下凸壳)这两个凸壳只有第一个点和最后一个点会是相同的。

  另外,这题用KD-Tree应该也可做。。。判一下四个角就可以了= =(思维难度和代码难度好像要更优一点,额……不过用map的话代码难度也没有很高

  我写KDTree的Insert的时候没有把插进来的这个点赋值aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAFCUlEQVR42n2VeVCUdRzGf3n0T/80ldqITqk0gGhrXqSjTjbTaDWalVhOajp5pOMR3gjqeuExaDKYCKmJqSCGgQZIyaFQKseC67ELHhwSrC7HGpTG7r6f3u86iISyM8+8z3y/z/N5d993dn4KaKcso+rS4pXiOdtMNbBhqZpxf5UKFYmXmezad1rVHi4hCausLvdD1OKmncr8MNZP47cv4cJyROJlJjvJSLal+2x4guos19pl/sOawpWZ9Alw4wDYMsBR4KLR3CwSLzPZSUay0nmSIWr3jRtCvSc+iFZQtBrsZ3XQRRf1uRp156AuG5F4mclOMpKVjnSfZLV5XjVB/sMfxCgoXgH2lGZsyVD9E9Qkgu1kG8lMdpKRrHSkK4wWpgLleSlGFfh8U4S6wh8ToHJ/s1axH60iBu7s71CSkax0pNuoM4QlzMc/oW7ja0tJ7QFXv2nm9g69uBUqt8GtsI4lGclKR7opPajb9HrQ48eifzo3RvW8Ru5wsC5ycXMZltPTufrLLChdhmYJAuvSNpKZ7CQjWelIVxjCEqYHXv71i289PNIHLo2Gq9O0uA0B7Fk7Ftul2WDVi+apaMWfweUpiMTLTHaSkax0pCsMYQnTA682vjSbM/5gGu06tXUAyVEjwPo+jvOjsP06HGfeSCgehZY3ApF4mclOMljHIx3pCkNYNp3pgdu3vLKRnEE0ZLzjzIz1pexML5YEzmPxe0MxTlJs/rwHJScGg2mMSLzMZKdnhrA4cAG30/qQFfuGzhjrFJYwPfDasG6byBwGhV2d97ICCN6dzrvhVm6cncpfpgDMqWMwJQ0F00hERbo3p47WdyO4nTGZ8TstBEdmUJMxBgqUk8yh1Ib12OSBV67znk+64vKJJa71x69RWA+Hs8uwxivcBQqu94JSb7jaB0Ql/fRrT1z5Ckuc4lDmTYocsP6ElcLjy12kKSo39J3vgTtWqyFxO3Zrn6TWc+4emgTXJljYunK1/rJmExU6iR/Wv82xLQaObTZwcN1IotZ8TOTaeWxbFUxI/DVMDZBjR5uS7iB22x7sK9VQD1wNi/H3i690nrgDF+65tfQqjRXHLRSaiqmsqqbGVou9tgGHo4mGhkbs9nqqa+yUV1aRX1DI8rhrpOkd6SZWwcCEKrca96PhEXxO2rjgi3+TUkNzjs2tRVg0fFemsGvuKA5FR3AmJZkiUwGlJRZKdBUW5JF66iQHvgsnfNYgvJcmsfO6Rs5dt5Zazb+heQ9QC9InPIKrFa9OjrM6Dv8JkTdwGZLuug9EBpE0U5E4Q3FkumLfp4rIibo+UkRPVhzV54lfKJLmKI7FLGRgYo07ohSXMALjrI1KhXgpZaQToNS8ox8E7CvMD4rOJjt+DZR1dZVkDyYt1Jfc0P4UhPlh2u6LKH+LHzkh/Ukz+nDr9yFQ3tWZG7+CZVEZDN+bn6fmxn3Y+ven9UTJnqoWaT8rMBugwuCstQxwm073085F9yZzlxeZ33px/vveXE7tpzVYB7i5/aaTYgOcVOROUwuBx8zWUyMhoXOLz/pq0KS6mF4V5PpAyUC5Ca47g1z/lBucIvGUG8AyAHJ8qIvxqjird/7PanvmKWMnEKF8lOpZurH79rqDvSqaT/WFi75g7o9IfHNyX2Rn3dB9R289Kx3pyrn6zDO03VGlVLez014Yf2XNy8FlW7rvFYmXmeye1ukQLjIaVScQoTqSZCT7tN1/5TypNXepA58AAAAASUVORK5CYII=" alt="" />aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAFCUlEQVR42n2VeVCUdRzGf3n0T/80ldqITqk0gGhrXqSjTjbTaDWalVhOajp5pOMR3gjqeuExaDKYCKmJqSCGgQZIyaFQKseC67ELHhwSrC7HGpTG7r6f3u86iISyM8+8z3y/z/N5d993dn4KaKcso+rS4pXiOdtMNbBhqZpxf5UKFYmXmezad1rVHi4hCausLvdD1OKmncr8MNZP47cv4cJyROJlJjvJSLal+2x4guos19pl/sOawpWZ9Alw4wDYMsBR4KLR3CwSLzPZSUay0nmSIWr3jRtCvSc+iFZQtBrsZ3XQRRf1uRp156AuG5F4mclOMpKVjnSfZLV5XjVB/sMfxCgoXgH2lGZsyVD9E9Qkgu1kG8lMdpKRrHSkK4wWpgLleSlGFfh8U4S6wh8ToHJ/s1axH60iBu7s71CSkax0pNuoM4QlzMc/oW7ja0tJ7QFXv2nm9g69uBUqt8GtsI4lGclKR7opPajb9HrQ48eifzo3RvW8Ru5wsC5ycXMZltPTufrLLChdhmYJAuvSNpKZ7CQjWelIVxjCEqYHXv71i289PNIHLo2Gq9O0uA0B7Fk7Ftul2WDVi+apaMWfweUpiMTLTHaSkax0pCsMYQnTA682vjSbM/5gGu06tXUAyVEjwPo+jvOjsP06HGfeSCgehZY3ApF4mclOMljHIx3pCkNYNp3pgdu3vLKRnEE0ZLzjzIz1pexML5YEzmPxe0MxTlJs/rwHJScGg2mMSLzMZKdnhrA4cAG30/qQFfuGzhjrFJYwPfDasG6byBwGhV2d97ICCN6dzrvhVm6cncpfpgDMqWMwJQ0F00hERbo3p47WdyO4nTGZ8TstBEdmUJMxBgqUk8yh1Ib12OSBV67znk+64vKJJa71x69RWA+Hs8uwxivcBQqu94JSb7jaB0Ql/fRrT1z5Ckuc4lDmTYocsP6ElcLjy12kKSo39J3vgTtWqyFxO3Zrn6TWc+4emgTXJljYunK1/rJmExU6iR/Wv82xLQaObTZwcN1IotZ8TOTaeWxbFUxI/DVMDZBjR5uS7iB22x7sK9VQD1wNi/H3i690nrgDF+65tfQqjRXHLRSaiqmsqqbGVou9tgGHo4mGhkbs9nqqa+yUV1aRX1DI8rhrpOkd6SZWwcCEKrca96PhEXxO2rjgi3+TUkNzjs2tRVg0fFemsGvuKA5FR3AmJZkiUwGlJRZKdBUW5JF66iQHvgsnfNYgvJcmsfO6Rs5dt5Zazb+heQ9QC9InPIKrFa9OjrM6Dv8JkTdwGZLuug9EBpE0U5E4Q3FkumLfp4rIibo+UkRPVhzV54lfKJLmKI7FLGRgYo07ohSXMALjrI1KhXgpZaQToNS8ox8E7CvMD4rOJjt+DZR1dZVkDyYt1Jfc0P4UhPlh2u6LKH+LHzkh/Ukz+nDr9yFQ3tWZG7+CZVEZDN+bn6fmxn3Y+ven9UTJnqoWaT8rMBugwuCstQxwm073085F9yZzlxeZ33px/vveXE7tpzVYB7i5/aaTYgOcVOROUwuBx8zWUyMhoXOLz/pq0KS6mF4V5PpAyUC5Ca47g1z/lBucIvGUG8AyAHJ8qIvxqjird/7PanvmKWMnEKF8lOpZurH79rqDvSqaT/WFi75g7o9IfHNyX2Rn3dB9R289Kx3pyrn6zDO03VGlVLez014Yf2XNy8FlW7rvFYmXmeye1ukQLjIaVScQoTqSZCT7tN1/5TypNXepA58AAAAASUVORK5CYII=" alt="" />aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAFCUlEQVR42n2VeVCUdRzGf3n0T/80ldqITqk0gGhrXqSjTjbTaDWalVhOajp5pOMR3gjqeuExaDKYCKmJqSCGgQZIyaFQKseC67ELHhwSrC7HGpTG7r6f3u86iISyM8+8z3y/z/N5d993dn4KaKcso+rS4pXiOdtMNbBhqZpxf5UKFYmXmezad1rVHi4hCausLvdD1OKmncr8MNZP47cv4cJyROJlJjvJSLal+2x4guos19pl/sOawpWZ9Alw4wDYMsBR4KLR3CwSLzPZSUay0nmSIWr3jRtCvSc+iFZQtBrsZ3XQRRf1uRp156AuG5F4mclOMpKVjnSfZLV5XjVB/sMfxCgoXgH2lGZsyVD9E9Qkgu1kG8lMdpKRrHSkK4wWpgLleSlGFfh8U4S6wh8ToHJ/s1axH60iBu7s71CSkax0pNuoM4QlzMc/oW7ja0tJ7QFXv2nm9g69uBUqt8GtsI4lGclKR7opPajb9HrQ48eifzo3RvW8Ru5wsC5ycXMZltPTufrLLChdhmYJAuvSNpKZ7CQjWelIVxjCEqYHXv71i289PNIHLo2Gq9O0uA0B7Fk7Ftul2WDVi+apaMWfweUpiMTLTHaSkax0pCsMYQnTA682vjSbM/5gGu06tXUAyVEjwPo+jvOjsP06HGfeSCgehZY3ApF4mclOMljHIx3pCkNYNp3pgdu3vLKRnEE0ZLzjzIz1pexML5YEzmPxe0MxTlJs/rwHJScGg2mMSLzMZKdnhrA4cAG30/qQFfuGzhjrFJYwPfDasG6byBwGhV2d97ICCN6dzrvhVm6cncpfpgDMqWMwJQ0F00hERbo3p47WdyO4nTGZ8TstBEdmUJMxBgqUk8yh1Ib12OSBV67znk+64vKJJa71x69RWA+Hs8uwxivcBQqu94JSb7jaB0Ql/fRrT1z5Ckuc4lDmTYocsP6ElcLjy12kKSo39J3vgTtWqyFxO3Zrn6TWc+4emgTXJljYunK1/rJmExU6iR/Wv82xLQaObTZwcN1IotZ8TOTaeWxbFUxI/DVMDZBjR5uS7iB22x7sK9VQD1wNi/H3i690nrgDF+65tfQqjRXHLRSaiqmsqqbGVou9tgGHo4mGhkbs9nqqa+yUV1aRX1DI8rhrpOkd6SZWwcCEKrca96PhEXxO2rjgi3+TUkNzjs2tRVg0fFemsGvuKA5FR3AmJZkiUwGlJRZKdBUW5JF66iQHvgsnfNYgvJcmsfO6Rs5dt5Zazb+heQ9QC9InPIKrFa9OjrM6Dv8JkTdwGZLuug9EBpE0U5E4Q3FkumLfp4rIibo+UkRPVhzV54lfKJLmKI7FLGRgYo07ohSXMALjrI1KhXgpZaQToNS8ox8E7CvMD4rOJjt+DZR1dZVkDyYt1Jfc0P4UhPlh2u6LKH+LHzkh/Ukz+nDr9yFQ3tWZG7+CZVEZDN+bn6fmxn3Y+ven9UTJnqoWaT8rMBugwuCstQxwm073085F9yZzlxeZ33px/vveXE7tpzVYB7i5/aaTYgOcVOROUwuBx8zWUyMhoXOLz/pq0KS6mF4V5PpAyUC5Ca47g1z/lBucIvGUG8AyAHJ8qIvxqjird/7PanvmKWMnEKF8lOpZurH79rqDvSqaT/WFi75g7o9IfHNyX2Rn3dB9R289Kx3pyrn6zDO03VGlVLez014Yf2XNy8FlW7rvFYmXmeye1ukQLjIaVScQoTqSZCT7tN1/5TypNXepA58AAAAASUVORK5CYII=" alt="" />

 //Round8 A
#include<vector>
#include<map>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=1e5+;
/*******************template********************/
//#define debug int n,m;
double ans=;
typedef map<double,double> mii;
typedef map<double,double>::iterator iter;
#define X first
#define Y second
double cross(iter o,iter a,iter b){
return (a->X - o->X) * (b->Y - o->Y) -
(a->Y - o->Y) * (b->X - o->X);
}
mii up,slop; inline double slope(iter a,iter b){
return (b->Y - a->Y)/(b->X - a->X);
}
bool inside(mii &p,double x,double y){
if (!p.size()) return ;
if (x<p.begin()->X || x>p.rbegin()->X) return ;
if (p.count(x)) return y<=p[x];
p[x]=y;
iter cur = p.lower_bound(x),i,j;
i=j=cur; i--; j++;
bool ret=cross(i,cur,j)>=;
p.erase(cur);
return ret;
}
void add(mii &p,double x,double y){
if (inside(p,x,y)) return;
if (p.count(x)){
iter cur=p.lower_bound(x),i=cur,j=cur;
i--;j++;
if (cur!=p.begin()) slop.erase(slope(i,cur));
if (j!=p.end()) slop.erase(slope(cur,j));
}
p[x]=y;
iter cur=p.lower_bound(x),i=cur,j=cur;
i--; j++;
if (cur!=p.begin() && j!=p.end()) slop.erase(slope(i,j));
if (cur!=p.begin()) slop[slope(i,cur)]=cur->X;
if (j!=p.end()) slop[slope(cur,j)]=j->X;
for(i=cur,i--,j=i,j--;i!=p.begin() && cur!=p.begin();i=j--)
if (cross(j,i,cur)>=){
slop.erase(slope(j,i));
slop.erase(slope(i,cur));
slop[slope(j,cur)]=cur->X;
p.erase(i);
}
else break;
for(i=cur,i++,j=i,j++;i!=p.end() && j!=p.end();i=j++)
if (cross(cur,i,j)>=){
slop.erase(slope(cur,i));
slop.erase(slope(i,j));
slop[slope(cur,j)]=j->X;
p.erase(i);
}
else break;
}
double query(double k){
double x,y;
iter it=slop.lower_bound(k);
if (it==slop.end()) x=up.begin()->X,y=up.begin()->Y;
else x=it->Y,y=up[x];
// printf("query k=%f tmpk=%f x=%f y=%f\n",k,it->X,x,y);
return y-k*x;
} int main(){
#ifndef ONLINE_JUDGE
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
#endif
int type=getint();
double x,y,k;
n=getint(); m=getint();
F(i,,n){
scanf("%lf%lf",&x,&y);
add(up,x,y);
#ifdef debug
// for(iter it=up.begin();it!=up.end();it++)
// printf("%f %f\n",it->X,it->Y);
// puts("");
#endif
}
#ifdef debug
puts("up tu ke:");
for(iter it=up.begin();it!=up.end();it++)
printf("%f %f\n",it->X,it->Y);
puts("");
puts("xie lv & x :");
for(iter it=slop.begin();it!=slop.end();it++)
printf("%f %f\n",it->X,it->Y);
puts("");
#endif
char cmd[];
double ans=;
F(i,,m){
scanf("%s",cmd);
if (cmd[]=='i'){
scanf("%lf%lf",&x,&y);
if (type==) x=x/ans,y=y/ans;
add(up,x,y);
}else{
scanf("%lf",&k);
if (type==) k=k/ans;
printf("%.3f\n",ans=query(k));
}
}
return ;
}

(map维护凸包)

 //Round8 A
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=2e5+;
const double INF=1e30;
/*******************template********************/ int n,m,D,p[N<<],cnt,tot,root;
struct node{
double d[],mx[],mn[];
int l,r,D,size;
double& operator [] (int x){return d[x];}
}t[N<<],now;
bool cmp(int x,int y){return t[x][D]<t[y][D];} #define L t[o].l
#define R t[o].r
#define mid (l+r>>1)
inline void Push_up(int o){
F(i,,){
t[o].mn[i]=min(t[o][i],min(t[L].mn[i],t[R].mn[i]));
t[o].mx[i]=max(t[o][i],max(t[L].mx[i],t[R].mx[i]));
}
t[o].size=t[L].size+t[R].size+;
}
inline int build(int l,int r,int dir){
D=dir;
nth_element(p+l,p+mid,p+r+,cmp);
int o=p[mid];
t[o].D=dir;
L=l<mid ? build(l,mid-,dir^) : ;
R=mid<r ? build(mid+,r,dir^) : ;
Push_up(o);
return o;
}
inline void dfs(int o){
if (!o) return;
dfs(L); p[++cnt]=o; dfs(R);
}
inline void rebuild(int &o){
cnt=; dfs(o);
o=build(,cnt,t[o].D);
}
inline void Insert(int &o,int dir){
if (!o){
o=++n;
F(i,,) t[o].mn[i]=t[o].mx[i]=t[o][i]=now[i];
t[o].D=dir; t[o].size=;
return;
}
if (now[dir]<t[o][dir]){
Insert(L,dir^); Push_up(o);
if (t[L].size>t[o].size*0.7) rebuild(o);
}else{
Insert(R,dir^); Push_up(o);
if (t[R].size>t[o].size*0.7) rebuild(o);
}
} double ans=;
inline double getans(int o,double k){
if (!o) return -INF;
return t[o][]-k*t[o][];
}
inline double calc(int o,double k){
if (!o) return -INF;
double ans=max(t[o].mn[]-k*t[o].mn[],t[o].mn[]-k*t[o].mx[]);
ans=max(ans,max(t[o].mx[]-k*t[o].mn[],t[o].mx[]-k*t[o].mx[]));
return ans;
}
inline void query(int o,double k){
if (!o) return;
double dl=calc(L,k),dr=calc(R,k),d0=getans(o,k);
ans=max(ans,d0);
if (dl<dr){
if (dr>ans && R) query(R,k);
if (dl>ans && L) query(L,k);
}else{
if (dl>ans && L) query(L,k);
if (dr>ans && R) query(R,k);
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
#endif
F(i,,) t[i].mn[i]=INF,t[i].mx[i]=-INF;
t[].size=; int type=getint();
tot=n=getint(); m=getint();
F(i,,n) scanf("%lf%lf",&t[i][],&t[i][]),p[i]=i;
root=build(,n,); char cmd[]; double k;
F(i,,m){
scanf("%s",cmd);
if (cmd[]=='i'){
scanf("%lf%lf",&now[],&now[]);
if (type==) now[]/=ans,now[]/=ans;
Insert(root,);
}else{
scanf("%lf",&k);
if (type==) k/=ans;
ans=-INF;
query(root,k);
printf("%.3f\n",ans);
}
}
return ;
}

(KDTree)

序列

  一道很棒的题目,具体过程戳官方题解吧……

  一个神奇的转化是对每一项都乘了一个$2sin(\frac{k}{2})$,然后利用积化和差公式,将一个$\sum$求和转化成了一个可以裂项相消,$O(1)$计算的式子……

  然后就可以离散化用线段树维护了,感觉细节处理蛮厉害的。。。蒟蒻除了模板部分都只能抄标程

  因为搞出来sin和cos以后就可以打tag了……且标记支持合并= =

 //Round8 C
#include<vector>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=;
/*******************template********************/ int n,m,num,k,c[N<<];
double sink; struct ques{
int l,r,d;
}q[N]; struct node{
double si,co;
int tag;
}t[N<<];
#define L (o<<1)
#define R (o<<1|1)
#define mid (l+r>>1)
#define lch L,l,mid
#define rch R,mid+1,r void maintain(int o){
t[o].si=t[L].si+t[R].si;
t[o].co=t[L].co+t[R].co;
}
void change(int o,int d){
t[o].tag+=d;
double si1=t[o].si,si2=sin(d),co1=t[o].co,co2=cos(d);
t[o].si=si1*co2+co1*si2;
t[o].co=co1*co2-si1*si2;
}
void Push_down(int o){
if (t[o].tag){
change(L,t[o].tag);
change(R,t[o].tag);
t[o].tag=;
}
}
void build(int o,int l,int r){
if (l==r){
t[o].si=(cos(k*c[l]-k*0.5)-cos(k*(c[l+]-)+k*0.5))/(*sink);
t[o].co=(sin(k*(c[l+]-)+k*0.5)-sin(k*c[l]-k*0.5))/(*sink);
}else{
build(lch); build(rch);
maintain(o);
}
}
void update(int o,int l,int r,int ql,int qr,int v){
if (ql<=l && qr>=r) change(o,v);
else{
Push_down(o);
if (ql<=mid) update(lch,ql,qr,v);
if (qr>mid) update(rch,ql,qr,v);
maintain(o);
}
}
double query(int o,int l,int r,int ql,int qr){
if (ql<=l && qr>=r) return t[o].si;
else{
Push_down(o);
double ans=;
if (ql<=mid) ans+=query(lch,ql,qr);
if (qr>mid) ans+=query(rch,ql,qr);
return ans;
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("C.in","r",stdin);
freopen("C.out","w",stdout);
#endif
n=getint(); m=getint(); k=getint();
sink=sin(double(k)/2.0);
int tot=;
c[++tot]=; c[++tot]=n+;
F(i,,m){
q[i].l=getint(),q[i].r=getint(),q[i].d=getint();
c[++tot]=q[i].l; c[++tot]=q[i].r+;
}
sort(c+,c+tot+);
num=unique(c+,c+tot+)-c-;
num--; build(,,num);
F(i,,m){
int d=q[i].d,l,r;
l=lower_bound(c+,c+num+,q[i].l)-c;
r=lower_bound(c+,c+num+,q[i].r+)-c-;
if (d) update(,,num,l,r,d);
else printf("%.10f\n",query(,,num,l,r));
}
return ;
}

【ContestHunter】【弱省胡策】【Round8】的更多相关文章

  1. 弱省胡策 Magic

    弱省胡策 Magic 求\(n\)个点\(n\)的条边的简单联通图的个数. 毒瘤,还要写高精. 我们枚举环的大小\(k\),\(\displaystyle ans=\sum_{k=3}^nC_n^k ...

  2. 【弱省胡策】Round #5 Count

    [弱省胡策]Round #5 Count 太神仙了. \(DP\)做法 设\(f_{n,m,d,k}\)表示\(n*m\)的矩阵,填入第\(k\)个颜色,并且第\(k\)个颜色最少的一列上有\(d\) ...

  3. luoguP3769 [CH弱省胡策R2]TATT

    luoguP3769 [CH弱省胡策R2]TATT PS:做这题前先切掉 P4148简单题,对于本人这样的juruo更助于理解,当然dalao就当练练手吧 题目大意: 现在有n个四维空间中的点,请求出 ...

  4. 【ContestHunter】【弱省胡策】【Round0】(A)&【Round1】(B)

    DP+容斥原理or补集转化?/KD-Tree 唔……突然发现最早打的两场(打的最烂的两场)没有写记录……(太烂所以不忍记录了吗... 还是把搞出来了的两道题记录一下吧= =勉强算弥补一下缺憾…… Ro ...

  5. 【ContestHunter】【弱省胡策】【Round3】(C)

    容斥原理+Fib Orz HE的神犇们 蒟蒻只能改出来第三题……实在太弱 官方题解:http://pan.baidu.com/s/1o6MdtQq fib的神奇性质……还有解密a[i]的过程……这里就 ...

  6. 【ContestHunter】【弱省胡策】【Round2】

    官方题解:http://wyfcyx.is-programmer.com/posts/95490.html A 目前只会30分的暴力……DP好像很神的样子0.0(听说可以多次随机强行算? //Roun ...

  7. 【ContestHunter】【弱省胡策】【Round7】

    Prufer序列+高精度+组合数学/DP+可持久化线段树 Magic 利用Prufer序列,我们考虑序列中每个点是第几个插进去的,再考虑环的连接方式,我们有$$ans=\sum_{K=3}^n N^{ ...

  8. 【ContestHunter】【弱省胡策】【Round6】

    KMP/DP+树链剖分+线段树/暴力 今天考的真是……大起大落…… String QwQ题意理解又出错了……(还是说一开始理解了,后来自己又忘了为什么是这样了?) 反正最后的结果就是……我当成:后面每 ...

  9. 【ContestHunter】【弱省胡策】【Round5】

    反演+FFT+构造+DP 写了这么多tag,其实我一个也不会 A 第一题是反演……数据范围10W,看着就有种要用FFT等神奇算法的感觉……然而蒟蒻并不会推公式,只好写了20+10分的暴力,然而特判30 ...

随机推荐

  1. 【LeetCode刷题】SQL-Second Highest Salary 及扩展以及Oracle中的用法

    转载于:https://www.cnblogs.com/contixue/p/7057025.html Write a SQL query to get the second highest sala ...

  2. spring过滤器

    什么是过滤器 Spring 中不能处理用户请求,但可以用来提供过滤作用的一种Servlet规范.在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理.具 ...

  3. 001.SMB简介

    一 简介 samba基于NetBIOS协议开发,能和windows通信,但只能在局域网通信. 二 Samba主要应用 文件共享 打印服务器 Samba登录时身份验证 进行windows主机名解析 三 ...

  4. Android `AsyncTask`简要分析

    AsyncTask简要分析 经典异步任务:AsyncTask,使用场景有:批量下载,批量拷贝等.官方文档就直接给出了一个批量下载的示例. private class DownloadFilesTask ...

  5. SpringMVC(八) RequestMapping HiddenHttpMethodFilter

    SpringMVC隐藏方法: 使用PUT和DELETE方法.默认HTML支持GET和POST方法.通过HiddenHttpMethodFilter将POST转成PUT和DELETE方法. 1.将Hid ...

  6. Android View事件分发-从源码分析

    View事件分发-从源码分析 学习自 <Android开发艺术探索> https://blog.csdn.net/qian520ao/article/details/78555397?lo ...

  7. Struts 2 学习笔记

    1.Struts2 jar包 struts2-core-2.1.8.1 struts2的核心jar包,不可缺少的 xwork-core-2.1.6 xwork的核心包,由于Struts2是由xwork ...

  8. BZOJ.2938.[POI2000]病毒(AC自动机)

    题目链接 \(Description\) 给n个模式串,问是否存在长度无限的主串,使得任何一个模式串都没有在主串中出现. \(Solution\) 先建AC自动机. 假设我们有了一个无限长的安全代码, ...

  9. [工具]GitHub上整理的一些工具[转]

    技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 ...

  10. HDU 5839 Special Tetrahedron 计算几何

    Special Tetrahedron 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...