
BZOJ2391: Cirno的忧郁
发布日期:2021-05-06 03:50:29
浏览次数:44
分类:技术文章
本文共 3091 字,大约阅读时间需要 10 分钟。
和前面一样只不过rank变成了sum
Splay维护的东西改一下#include#include #include #include #include #include using namespace std;char c;bool flag;inline void read(int &a){a=0;do c=getchar();while(c!='-'&&(c<'0'||c>'9'));if(c=='-')flag=true,c=getchar();while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();if(flag)a=-a,flag=false;}struct P{ int x,y,data;};struct Node{Node *f,*lc,*rc;int sum,data;double Key;inline bool l(){ return f->lc==this;}}*Empty;Node *Stack[100001],Ce[100001];int Tot;inline void Bg(){Empty=new Node;Empty->lc=Empty->rc=Empty->f=Empty;Empty->sum=Empty->data=0;for(int i=0;i<=100000;i++)Stack[i]=Ce+i;Tot=100000;}inline Node*New(){Node *R=Stack[Tot--];R->lc=R->rc=Empty;R->f=R;R->sum=R->data=0;return R;}inline void*Del(Node *E){Stack[++Tot]=E;}inline void updata(Node *a){a->sum=a->lc->sum+a->rc->sum+a->data;}inline void Lc(Node *a){ Node *f; if(a->f->f==a->f)f=a; else if(a->f->l())f=a->f->f,f->lc=a; else f=a->f->f,f->rc=a; a->f->lc=a->rc; a->rc->f=a->f; a->rc=a->f; a->f->f=a; a->f=f; updata(a->rc);}inline void Rc(Node *a){ Node *f; if(a->f->f==a->f)f=a; else if(a->f->l())f=a->f->f,f->lc=a; else f=a->f->f,f->rc=a; a->f->rc=a->lc; a->lc->f=a->f; a->lc=a->f; a->f->f=a; a->f=f; updata(a->lc);}inline void On(Node *a){a->l()?Lc(a):Rc(a);}inline void Twi(Node *a){a->l()==a->f->l()?On(a->f):On(a);On(a);}inline void Splay(Node *a){ while(a->f->f!=a->f)Twi(a);while(a->f!=a)On(a);updata(a);}inline P operator -(P a,P b){ return (P){a.x-b.x,a.y-b.y};}inline int operator *(P a,P b){ return a.x*b.y-b.x*a.y;}int tmp=0;inline void Insert(Node *Cur,Node *C){ if(C->Key Key) if(Cur->lc==Empty){Cur->lc=C,C->f=Cur;} else Insert(Cur->lc,C); else if(Cur->rc==Empty){tmp+=Cur->lc->sum+Cur->data;Cur->rc=C,C->f=Cur;} else tmp+=Cur->lc->sum+Cur->data,Insert(Cur->rc,C); updata(Cur);};P Std;double Key[3001];inline double Atan2(P a){ return atan2(a.y,a.x);}P L[30001];int Val[300001];int no[10001],non[10001];inline bool cmp(int a,int b){ return Key[a]>Key[b];}int f[2301][2301];int n;void Dl(Node *R){ if(R==Empty)return ; Dl(R->lc),Dl(R->rc);Del(R);}inline void Pre(){ Std=(P){-84221,-72421}; for(int i=1;i<=n;i++) Key[i]=Atan2(L[i]-Std),no[i]=i; sort(no+1,no+n+1,cmp); for(int i=1;i<=n;i++)non[no[i]]=i; for(int i=1;i Key=Atan2(L[no[i+1]]-Std); R->data=Val[no[i+1]]; R->f=R; updata(R); for(int j=i+2;j<=n;j++) { tmp=0; Node *RR=New(); RR->Key=Atan2(L[no[j]]-Std); RR->data=Val[no[j]]; updata(RR); Insert(R,RR); f[i][j]=f[j][i]=tmp;// if(rand()&7==7)Splay(RR),R=RR; } Dl(R); }}int Cache[100001];inline void Get(){ Std=(P){-84221,-72421}; int s; read(s); for(int i=1;i<=s;i++)read(Cache[i]); Cache[s+1]=Cache[1]; int A,sum=0,tp=0; for(int i=1;i<=s;i++) { if((L[Cache[i]]-Std)*(L[Cache[i+1]]-Std)<0) sum-=f[non[Cache[i]]][non[Cache[i+1]]]; else sum+=f[non[Cache[i]]][non[Cache[i+1]]]; } if(sum<0)sum=-sum; printf("%d\n",sum);}int m,q;int main(){ Bg(); read(n); read(m); for(int i=1;i<=n;i++)read(L[i].x),read(L[i].y); for(int i=1;i<=m;i++)read(L[n+i].x),read(L[n+i].y),read(Val[n+i]); n+=m; Pre(); read(q); while(q--) Get(); return 0;}
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年03月21日 04时36分54秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
高德算法工程一体化实践和思考
2019-03-06
为亿级用户的美好出行而战!高德地图首届算法大赛落幕 95后北邮在读博士带队夺冠
2019-03-06
重温网络编程——常识(三)
2019-03-06
判断一个数是否是2的幂
2019-03-06
js 闭包(新)
2019-03-06
vscode 编辑python 如何格式化
2019-03-06
正则表达针对html(九)
2019-03-06
seo 回忆录百度基本概念(一)
2019-03-06
重新整理数据结构与算法(c#)—— 算法套路二分法[二十四]
2019-03-06
不一样的备忘录模式(设计模式十六)
2019-03-06
【golang-GUI开发】qt之signal和slot(一)
2019-03-06
Markdown使用笔记
2019-03-06
「从零单排HBase 06」你必须知道的HBase最佳实践
2019-03-06
「从零单排canal 04」 启动模块deployer源码解析
2019-03-06
用ThreadLocal来优化下代码吧
2019-03-06
netcore中使用session
2019-03-06
Android 开发学习进程0.25 自定义控件
2019-03-06
多媒体文件格式全解说(下)--图片
2019-03-06
淘宝WAP版小BUG分析
2019-03-06