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


  官方题解: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. SQL中的坑

    一.where,group by,having --group by 和having 解释:前提必须了解sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等.这些函数 ...

  2. 【Ray Tracing in One Weekend 超详解】 光线追踪1-9 景深

    今天我们来学最后一章 Chapter11:Defocus Blur Preface 散焦模糊 也称 景深 首先,我们来了解一下散焦模糊,我们在真实相机中散焦模糊的原因是因为它们需要一个大圈(而不仅仅是 ...

  3. 基于图文界面的蓝牙扫描工具btscanner

    基于图文界面的蓝牙扫描工具btscanner   btscanner是Kali Linux内置的一款蓝牙扫描工具.它提供图文界面,更便于渗透测试人员查看扫描信息.该工具会自动使用主机所有的蓝牙接口,并 ...

  4. 20172319 2018.10.12《Java程序设计教程》第6周课堂实践(补写博客)

    20172319 2018.10.12 <Java程序设计教程>第6周课堂测验 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...

  5. pygame系列_小球完全弹性碰撞游戏_源码下载

    之前做了一个基于python的tkinter的小球完全碰撞游戏: python开发_tkinter_小球完全弹性碰撞游戏_源码下载 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名 ...

  6. AES Test vectors

    Table of content List of test vectors for AES/ECB encryption mode AES ECB 128-bit encryption mode AE ...

  7. java容器类---概述

    1.容器类关系图 虚线框表示接口. 实线框表示实体类. 粗线框表示最经常使用的实体类. 点线的箭头表示实现了这个接口. 实线箭头表示类能够制造箭头所指的那个类的对象. Java集合工具包位于Java. ...

  8. Creating Reusable XAML User Controls with Xamarin Forms

    In the previous post on making fancy layouts with Xamarin Forms we saw how you can design a Dashboar ...

  9. 统计代码执行时间,使用Stopwatch和UserProcessorTime的区别

    当我们需要统计一段代码的执行时间,首先想到的可能是Stopwatch类.在这里,先暂不使用Stopwatch,自定义一个统计代码执行时间的类,大致需要考虑到: 1.确保统计的是当前进程.当前线程中代码 ...

  10. Delphi XE 6,Rad Studio XE 6 官方下载(附破解)

      官方光盘镜像下载: http://altd.embarcadero.com/download/radstudio/xe6/delphicbuilder_xe6_win.iso RAD Studio ...