19南昌网络赛L

校赛打杂没施展开。

题意:一开始给你一颗 (0,0)到(0,l)的树。

这棵树每一年会长出来三个幼芽(雾),长度均为l/4,方向分别是左转60,右转60,和不变。

年份<=14

考虑3^14直接暴力存边然后考虑每条边贡献。发现奇难无比。

考虑剪枝。

注意到如果一根树枝的被砍掉了那么他所有的孩子全都不算贡献了。妙啊!变成傻逼题。

抄一下板子。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef double db;
 4 const db eps=1e-6;
 5 const db pi=acos(-1);
 6 int sign(db k){
 7     if (k>eps) return 1; else if (k<-eps) return -1; return 0;
 8 }
 9 int cmp(db k1,db k2){return sign(k1-k2);}
10 int inmid(db k1,db k2,db k3){return sign(k1-k3)*sign(k2-k3)<=0;}// k3 在 [k1,k2] 内
11 struct point{
12     db x,y;
13     point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
14     point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
15     point operator * (db k1) const{return (point){x*k1,y*k1};}
16     point operator / (db k1) const{return (point){x/k1,y/k1};}
17     int operator == (const point &k1) const{return cmp(x,k1.x)==0&&cmp(y,k1.y)==0;}
18     // 逆时针旋转
19     point turn(db k1){return (point){x*cos(k1)-y*sin(k1),x*sin(k1)+y*cos(k1)};}
20     bool operator < (const point k1) const{
21         int a=cmp(x,k1.x);
22         if (a==-1) return 1; else if (a==1) return 0; else return cmp(y,k1.y)==-1;
23     }
24     db abs(){return sqrt(x*x+y*y);}
25     db dis(point k1){return ((*this)-k1).abs();}
26 };
27 db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;}
28 db dot(point k1,point k2){return k1.x*k2.x+k1.y*k2.y;}
29 point getLL(point k1,point k2,point k3,point k4){
30     db w1=cross(k1-k3,k4-k3),w2=cross(k4-k3,k2-k3); return (k1*w2+k2*w1)/(w1+w2);
31 }
32 struct line{
33     point p[2];
34     line(point k1,point k2){p[0]=k1; p[1]=k2;}
35     point& operator [] (int k){return p[k];}
36     point dir(){return p[1]-p[0];}
37 };
38 int check(line a,line b){//线段与直线
39     if(cross(a[0]-b[0],a[0]-b[1])*cross(a[1]-b[0],a[1]-b[1])>0 ) return 1;
40     return 0;
41 }
42 int t,n;db l,x,y,k;line cut = {{0,0},{0,0}};
43 vector<line> v;
44 db dfs(line now,int stp){
45     db ans = 0;
46     if(stp==n)return ans;
47     if(check(now,cut)) {
48         ans+=now.dir().abs();
49         ans+=dfs({now[1], now[1] + now.dir() / 4}, stp + 1);//原方向
50         ans+=dfs({now[1], now[1] + now.dir().turn(pi/3) / 4}, stp + 1);//逆时针60
51         ans+=dfs({now[1], now[1] + now.dir().turn(-pi/3) / 4}, stp + 1);//顺时针60
52     }else{//砍了
53         point xx = getLL(now[0],now[1],cut[0],cut[1]);
54         ans+=now[0].dis(xx);
55     }
56     return ans;
57 }
58 int main(){
59 //    printf("%.11f\n",pow(3,15));
60 //    printf("%.11f\n",sin(90));
61     scanf("%d",&t);
62     while (t--){
63         v.clear();
64         scanf("%lf%d%lf%lf%lf",&l,&n,&x,&y,&k);
65         line o={{0,0},{0,l}};
66         cut = {{x,y},{x+10000,y+k*10000}};
67         db ans = dfs(o,0);
68         printf("%.6f\n",ans);
69     }
70 }
71 /**
72 1
73 16 2 0 18 0
74  */

原文地址:https://www.cnblogs.com/MXang/p/10743654.html

时间: 2024-10-02 00:42:46

19南昌网络赛L的相关文章

2019 ICPC 南昌网络赛

2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 // 史上排名最高一次,开场不到两小时队友各A一题加水题共四题,排名瞬间升至三四十名 // 然后后三小时就自闭了,一题都没有突破...最后排名211 hhhh ? ? B. Fire-Fighting Hero 题意 队友做的,待补. ? AC代码 #include<cstdio> #includ

ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询问子区间中某个值域的数的个数,连续的相同数字只记为一个.(即统计数字段的个数) 2 L R x y 数据范围: 1 ≤ n,m ≤ 2×10^5 1 ≤ a[i] ≤ n 解题思路: 连续重复的数字只记一次.所以考虑将每个数字段除第一个出现外的数字都删去(记为0).在读入操作的时候暴力模拟,同时维护

2019 南昌网络赛icpc I题 cdq分治或分块

题意:给你一个数组,然后每次有两种操作,操作一是修改数组里的数,操作二是查询区间[ l , r ] 里有多少个子区间满足以下条件:1.子区间内的数全部相同.2.子区间内的数在x到y之间.3.子区间得是不能延伸的. 题目链接:https://nanti.jisuanke.com/t/41356 题解:首先转化问题,设 b[ i ] = a[i]==a[i-1] ? 0 : a[i],然后问题就变成了问询区间内有多少个x到y之间的数.(注意左端点特判)这不就是主席树....带修改...好,树状数组加

NOJ 网络赛 L题 送花

题目: 送花 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 116            测试通过 : 41 题目描述 萌妹纸一般都比较喜欢漂亮的鲜花.每逢各种节日,她们都想收到鲜花作为礼物.如果你是有妹纸滴人,经常不送妹纸花的话,结果可想而知了. 当然咯,妹纸都是通情达理的,不会因为某几次你木有送花,就发你好人卡了.王童鞋作为一个比较节俭(抠门)的人便知道这一道理,因此他想在妹纸不给他发好人卡的前提下,送

2018icpc南京网络赛-L Magical Girl Haze (分层图最短路)

题意: 有向图,可以把k条路的长度变为0,求1到n的最短路 思路: 将图复制k份,一共k+1层图,对于每一条i→j,都连一条低层的i→高层的j,并且权值为0 即对每一对<i,j,w>,都加边<i,j,w>,<i+n,j+n,w>,<i+2n,j+2n,w>,....,<i+kn,j+kn,w> 同时加“楼梯”<i,j+n,0>,<i+n,j+2n,0>,...,<i+(k-1)n, j+kn> 然后跑一个1~(

2019南昌网络赛-I(单调栈+线段树)

题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上弄了3小时,思路大体都是对的,但就是没法实现.这几天恶补线段树. 首先可以利用单调栈来查找满足a[i]为最小值的最大区间L[i]~R[i].然后利用线段树求一个段的和sum.最小前缀lsum和最小后缀rsum.然后遍历a[i]: a[i]>0:最优为sum(L[i],R[i])*a[i] a[i]<

2019年ICPC南昌网络赛 J. Distance on the tree 树链剖分+主席树

边权转点权,每次遍历到下一个点,把走个这条边的权值加入主席树中即可. #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> using namespace std; const int maxx = 2e5+10; struct node{ int l,r,cnt; }tree[maxx*40]; int head[maxx],rk[maxx],siz[maxx

19徐州网络赛E 线段树加离散化

题目链接:https://www.jisuanke.com/contest/3005/267806 按wi的值建立权值线段树维护值为wi出现的最后位置,对于第i个人的答案,查询线段树[wi+m,max]区间的最大位置pos,令如果pos-i-1小于等于-1则是在i之后不存在大于等于wi+m的人,否则第i个人的答案即为pos-i-1.由于wi范围过大所以需对wi离散化 #include<iostream> #include<cmath> #include<algorithm&g

2019南昌网络赛-I. Yukino With Subinterval 线段树套树状数组

TMD...这题卡内存卡的真优秀... 所以以后还是别用主席树的写法...不然怎么死的都不知道... 树套树中,主席树方法开权值线段树...会造成空间的浪费...这道题内存卡的很紧... 由于树套树已经不需要持久化了,直接动态开点就完事了...用主席树方法开过不去,要么超内存,要么越界... 大概思路...这题要求的[L,R]区间内,满足x<=a[i]<=y的连续的段数, 这题大概是个套路题,我们很容易想到,我们把连续的区间变成单点,把一段区间,类似1 1 1 3 5 变成 1 0 0 3 5