• 2018.8.26 练习赛


    • T1 函数
    • 题面:
    • 题解:
    • 堆code:
    •  1 #include<cstdio>
       2 #include<cstdlib>
       3 #include<cmath>
       4 #include<queue>
       5 #define maxn 100005
       6 #define db long double
       7 using namespace std;
       8 struct func {
       9     db k,v;
      10 };
      11 bool operator >(func a,func b) {
      12     return a.v>b.v;
      13 }
      14 db nb[maxn];
      15 priority_queue<func,vector<func>,greater<func> > q;
      16 db l,r,n,x;
      17 int main() {
      18     scanf("%Lf%Lf%Lf%Lf",&l,&r,&x,&n);
      19     for(db i=l; i<=r; i+=1) q.push((func) {
      20         i,i*sqrt(x)+1
      21     });
      22     while(n>1) {
      23         func t=q.top();
      24         q.pop();
      25         q.push((func) {
      26             t.k,t.v+1.0
      27         });
      28         n--;
      29     }
      30     printf("%.2Lf",q.top().v);
      31 }
      View Code
    • T2 情侣
    • 题面:
    • 题解:
    • 具体转移实现见code注释部分:
    •  1 #include<stdio.h>
       2 #include<algorithm>
       3 #include<ctype.h>
       4 #define ll long long
       5 #define inv2 499122177
       6 #define mod 998244353
       7 using namespace std;
       8 
       9 ll t;
      10 ll D[5005];
      11 int f[5005][5005];
      12 
      13 char buf[1<<20],*p1,*p2;
      14 inline char gc() {
      15     return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin))==p1?0:*p1++;
      16 }
      17 
      18 template<typename T>
      19 void read(T &x) {
      20     char tt;
      21     bool flag=0;
      22     while(!isdigit(tt=gc())&&tt!='-');
      23     tt=='-'?(x=0,flag=1):(x=tt-'0');
      24     while(isdigit(tt=gc())) x=x*10+tt-'0';
      25     if(flag) x=-x;
      26 }
      27 
      28 ll ksm(ll a,ll b) {
      29     ll ans=1;
      30     for(; b; b>>=1,a=(long long)a*a%mod)
      31         if(b&1) ans=(long long)ans*a%mod;
      32     return ans;
      33 }
      34 //f[i][j]
      35 //空2*i+1
      36 //情侣空 j
      37 //非情侣空2*i+1-j
      38 //f[1][1]=1
      39 //f[i][j]+=
      40 //在一起:
      41 //不拆 f[i-1][j-1]*(2*(i-1)+(1-(j-1)))=f[i-1][j-1]*(2*i-j)
      42 //拆 f[i-1][j]*j
      43 //不在一起:
      44 //不拆 f[i-1][j]*(2*(i-1)+1-j)*(2*(i-1)-j)>>1
      45 //拆一对  f[i-1][j+1]*(j+1)*(2*(i-1)-j)
      46 //拆两对  f[i-1][j+2]*(j+2)*(j+1)>>1
      47 void sent() {
      48     f[1][1]=1;
      49     for(ll i=2; i<=5000; i++)
      50         for(ll j=0; j<=i; j++) {
      51             if(j)f[i][j]=(f[i][j]+f[i-1][j-1]*(2*i-j)%mod)%mod;
      52             f[i][j]=(f[i][j]+f[i-1][j]*j%mod)%mod;
      53             f[i][j]=(f[i][j]+f[i-1][j]*(2*(i-1)+1-j)%mod*(2*(i-1)-j)%mod*inv2%mod)%mod;
      54             f[i][j]=(f[i][j]+f[i-1][j+1]*(j+1)%mod*(2*(i-1)-j)%mod)%mod;
      55             f[i][j]=(f[i][j]+f[i-1][j+2]*(j+2)%mod*(j+1)%mod*inv2%mod);
      56         }
      57 
      58     fact[0]=1;
      59     for(int i=1; i<=10000; i++) fact[i]=fact[i-1]*i%mod;
      60     ll now=inv2;
      61     for(int i=1; i<=5000; i++) {
      62         ni[i]=fact[i*2]*now%mod;
      63         now=now*inv2%mod;
      64     }
      65 }
      66 
      67 int main() {
      68     read(t);
      69     sent();
      70     while(t--) {
      71         ll n,d;
      72         read(n),read(d);
      73         D[0]=1;
      74         ll ans=f[n][0];
      75         for(ll i=1; i<=n; i++) {
      76             D[i]=D[i-1]*d%mod;
      77             ans=(ans+D[i]*f[n][i]%mod)%mod;
      78         }
      79         printf("%lld
      ",ans*ksm(ni[n],mod-2)%mod);
      80     }
      81     return 0;
      82 }
      View Code

       

    • T3 军训(今日毒瘤)
    • 题面:
    • 题解:
    • std code:
    •   1 #pragma GCC optimize(3)
        2 #include<stdio.h>
        3 #include<ctype.h>
        4 #include<cmath>
        5 #include<cstring>
        6 #define RG register
        7 #define maxn 300005
        8 #define db double
        9 using namespace std;
       10 char buf[1<<20],*p1,*p2;
       11 #define GC (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?0:*p1++)
       12 inline int R_int()
       13 {
       14     char t=GC;
       15     int x=0,f=1;
       16     while(!isdigit(t)&&t!='-') t=GC;
       17     if(t=='-') f=-1,t=GC;
       18     while(isdigit(t)) x=x*10+t-48,t=GC;
       19     return f*x;
       20 }
       21 inline char R_alp()
       22 {
       23     char t=GC;
       24     while(!isalpha(t)) t=GC;
       25     return t;
       26 }
       27 struct op{char id;db v1,v2;}a[maxn];
       28 typedef db Mat[4][4];
       29 typedef db Vec[4];
       30 const db Pi=acos(-1.0);
       31 int ls[maxn*2],rs[maxn*2],tot=1,n,m;
       32 op lazy[maxn*2];
       33 int pd[maxn*2];
       34 Mat lval[maxn*2],rval[maxn*2];
       35 inline void Mulmat(Mat &at,Mat &s,Mat &c)
       36 {
       37     static db b[4][4],a[4][4];
       38     for(RG int i=1;i<=3;i++)
       39         for(RG int j=1;j<=3;j++)
       40             b[i][j]=s[j][i],a[i][j]=at[i][j];
       41     for(RG int i=1;i<=3;i++)
       42         for(RG int j=1;j<=3;j++)
       43         {
       44             RG db t=0;
       45             for(db *x=a[i]+1,*y=b[j]+1,k=1;k<=3;++x,++y,++k) t+=*x**y;
       46             c[i][j]=t;
       47         }
       48 }
       49 inline void Mulvec(Vec &a,Mat &s,Vec &c)
       50 {
       51     static db b[4][4];
       52     Vec tmp;
       53     for(RG int i=1;i<=3;i++)
       54         for(RG int j=1;j<=3;j++)
       55             b[i][j]=s[j][i];
       56     for(RG int i=1;i<=3;i++)
       57     {
       58         register db t=0.0;
       59         int k=1;
       60         for(db *x=b[i]+1,*y=a+1;k<=3;++x,++y,++k)
       61             t+=*x**y;
       62         tmp[i]=t;
       63     }
       64     for(RG int i=1;i<=3;i++) c[i]=tmp[i];
       65 } 
       66 inline void get(Mat &a,op b,int t)
       67 {
       68     memset(a,0,sizeof(a));
       69     a[1][1]=a[2][2]=a[3][3]=1;
       70     switch(b.id)
       71     {
       72         case 'R': {a[3][1]=b.v1*(db)t;break;}
       73         case 'L': {a[3][1]=-b.v1*(db)t;break;}
       74         case 'U': {a[3][2]=b.v1*(db)t;break;}
       75         case 'D': {a[3][2]=-b.v1*(db)t;break;}
       76         case 'X': {a[2][2]=((t&1)?-1:1);break;}
       77         case 'Y': {a[1][1]=((t&1)?-1:1);break;}
       78         case 'C':
       79         {
       80             int tmp=(int)floor(b.v1*(db)t);
       81             tmp%=360;
       82             db Rad=1.0*(db)tmp*Pi/180.0;
       83             a[1][1]=cos(Rad),a[1][2]=sin(Rad),a[2][1]=-sin(Rad),a[2][2]=cos(Rad);
       84             break;
       85         }
       86         case 'O': {if(t&1) a[1][1]=-1,a[2][2]=-1,a[3][1]=2*b.v1,a[3][2]=2*b.v2,a[3][3]=1;break;}
       87     }
       88 }
       89 void Read(op &x)
       90 {
       91     char cmd=R_alp();
       92     x.id=cmd;
       93     if(cmd=='U'||cmd=='D'||cmd=='L'||cmd=='R'||cmd=='C') x.v1=(db)R_int();
       94     else if(cmd=='O') x.v1=(db)R_int(),x.v2=(db)R_int();
       95 }
       96 inline void update(int p)
       97 {
       98     Mulmat(lval[ls[p]],lval[rs[p]],lval[p]);
       99     Mulmat(rval[rs[p]],rval[ls[p]],rval[p]);
      100 }
      101 inline void putdown(int p,int l,int r)
      102 {
      103     int mid=(l+r)>>1;
      104     get(lval[ls[p]],lazy[p],mid-l+1);
      105     get(rval[ls[p]],lazy[p],mid-l+1);
      106     get(lval[rs[p]],lazy[p],r-mid);
      107     get(rval[rs[p]],lazy[p],r-mid);
      108     lazy[ls[p]]=lazy[rs[p]]=lazy[p];
      109     pd[ls[p]]=1,pd[rs[p]]=1;
      110     pd[p]=0;
      111 }
      112 void build(int p,int l,int r)
      113 {
      114     if(l==r)
      115     {
      116         get(lval[p],a[l],1);
      117         get(rval[p],a[l],1);
      118         return;
      119     }
      120     int mid=(l+r)>>1;
      121     ls[p]=++tot,build(ls[p],l,mid);
      122     rs[p]=++tot,build(rs[p],mid+1,r);
      123     update(p);
      124 }
      125 void modify(int p,int l,int r,int x,op s)
      126 {
      127     if(l==r) {get(lval[p],s,1),get(rval[p],s,1);return;}
      128     if(pd[p]) putdown(p,l,r);
      129     int mid=(l+r)>>1;
      130     if(x<=mid) modify(ls[p],l,mid,x,s);
      131     else modify(rs[p],mid+1,r,x,s);
      132     update(p);
      133 }
      134 void mod_range(int p,int l,int r,int x,int y,op s)
      135 {
      136     if(x<=l&&r<=y)
      137     {
      138         get(lval[p],s,r-l+1),get(rval[p],s,r-l+1);
      139         lazy[p]=s,pd[p]=1;
      140         return;
      141     }
      142     if(pd[p]) putdown(p,l,r);
      143     int mid=(l+r)>>1;
      144     if(x<=mid&&y>=l) mod_range(ls[p],l,mid,x,y,s);
      145     if(y>mid&&x<=r) mod_range(rs[p],mid+1,r,x,y,s);
      146     update(p);
      147 }
      148 Mat ret;
      149 void query(int p,int l,int r,int x,int y,int f)
      150 {
      151     if(x<=l&&r<=y) {Mulmat(ret,f?lval[p]:rval[p],ret);return;}
      152     if(pd[p]) putdown(p,l,r);
      153     int mid=(l+r)>>1;
      154     if(f)
      155     {
      156         if(x<=mid&&y>=l) query(ls[p],l,mid,x,y,f);
      157         if(y>mid&&x<=r) query(rs[p],mid+1,r,x,y,f);        
      158     }
      159     else
      160     {
      161         if(y>mid&&x<=r) query(rs[p],mid+1,r,x,y,f);    
      162         if(x<=mid&&y>=l) query(ls[p],l,mid,x,y,f);
      163     }
      164 }
      165 void ask(db x,db y,int l,int r,int f)
      166 {
      167     memset(ret,0,sizeof(ret));
      168     ret[1][1]=ret[2][2]=ret[3][3]=1;
      169     Vec tmp={0,x,y,1};
      170     query(1,1,n,l,r,f);
      171     Mulvec(tmp,ret,tmp);
      172     printf("%.1lf %.1lf
      ",tmp[1],tmp[2]);
      173 }
      174 int main()
      175 {
      176     n=R_int(),m=R_int();
      177     for(int i=1;i<=n;i++)
      178         Read(a[i]);
      179     build(1,1,n);
      180     for(int i=1;i<=m;i++)
      181     {
      182         op t;
      183         char cmd=R_alp();
      184         if(cmd=='M')
      185         {
      186             int p=R_int();
      187             Read(t);
      188             modify(1,1,n,p,t);
      189         }
      190         else if(cmd=='E')
      191         {
      192             int l=R_int(),r=R_int();
      193             Read(t);
      194             mod_range(1,1,n,l,r,t);
      195         }
      196         else if(cmd=='A'||cmd=='B')
      197         {
      198             db x=(db)R_int(),y=(db)R_int();
      199             int l=R_int(),r=R_int();
      200             cmd=='A'?ask(x,y,l,r,1):ask(x,y,l,r,0);
      201         }
      202     }
      203     return 0;
      204 }
      View Code
    • 未ac code(不完整,函数解法)……
    •   1 #include<cstdio>
        2 #include<cmath>
        3 #include<algorithm>
        4 #include<ctype.h>
        5 #define l(x) x<<1
        6 #define r(x) x<<1|1
        7 #define ll long long
        8 #define ld double
        9 using namespace std;
       10 
       11 char buf[1<<20],*p1,*p2;
       12 inline char gc() {
       13     return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin))==p1?0:*p1++;
       14 }
       15 
       16 ll n,m;
       17 ll M=1;
       18 ld x,y;
       19 const ld pi=acos(-1);
       20 struct node {
       21     ld A,B,C;
       22     node() {
       23         A=1;
       24         B=0;
       25         C=0;
       26     }
       27 };
       28 
       29 struct point {
       30     node x,y;
       31 } ca[300005<<2],cb[300005<<2];
       32 
       33 template<typename T>
       34 void read(T &x) {
       35     char tt;
       36     bool flag=0;
       37     while(!isdigit(tt=gc())&&tt!='-');
       38     tt=='-'?(x=0,flag=1):(x=tt-'0');
       39     while(isdigit(tt=gc())) x=x*10+tt-'0';
       40     if(flag) x=-x;
       41 }
       42 
       43 void up(point &a,ld t) {
       44     a.y.C+=t;
       45 }
       46 
       47 void down(point &a,ld t) {
       48     a.y.C-=t;
       49 }
       50 
       51 void left(point &a,ld t) {
       52     a.x.C+=t;
       53 }
       54 
       55 void right(point &a,ld t) {
       56     a.x.C-=t;
       57 }
       58 
       59 void dcx(point &a) {
       60     a.x.A=-a.x.A;
       61     a.x.B=-a.x.B;
       62     a.x.C=-a.x.C;
       63 }
       64 
       65 void dcy(point &a) {
       66     a.y.A=-a.y.A;
       67     a.y.B=-a.y.B;
       68     a.y.C=-a.y.C;
       69 }
       70 
       71 void dcxy(point &a,ld d,ld k) {
       72     a.x.A=-a.x.A;
       73     a.x.B=-a.x.B;
       74     a.x.C=2*d-a.x.C;
       75     a.y.A=-a.y.A;
       76     a.y.B=-a.y.B;
       77     a.y.C=2*k-a.x.C;
       78 }
       79 
       80 void turn(point &a,ld c) {
       81     c*=(pi/180);
       82     ld A=a.x.A,B=a.x.B,C=a.x.C,E=a.y.A,F=a.y.B,G=a.y.C;
       83     a.x.A=(A*cos(c)-E*sin(c));
       84     a.x.B=(B*cos(c)-F*sin(c));
       85     a.x.C=(C*cos(c)-G*sin(c));
       86     a.y.A=(A*sin(c)+E*cos(c));
       87     a.y.B=(B*sin(c)+F*cos(c));
       88     a.y.C=(C*sin(c)+G*cos(c));
       89 }
       90 
       91 point merge(point a,point b) {
       92     point tmp;
       93     ld A=b.x.A,B=b.x.B,C=b.x.C,D=b.y.A,E=b.y.A,F=b.y.A;
       94     ld aa=a.x.A,bb=a.x.A,c=a.x.A,d=a.y.A,e=a.y.A,f=a.y.A;
       95     tmp.x.A=(A*aa+B*d);
       96     tmp.x.B=(A*bb+B*e);
       97     tmp.x.C=(C+A*c+B*f);
       98 
       99     tmp.y.A=(D*aa+E*d);
      100     tmp.y.B=(D*bb+E*e);
      101     tmp.y.C=(F+D*c+E*f);
      102     return tmp;
      103 }
      104 
      105 void build() {
      106     for(int i=M-1; i>=1; i--) {
      107         ca[i]=merge(ca[l(i)],ca[r(i)]);
      108         cb[i]=merge(cb[l(i)],cb[r(i)]);
      109     }
      110 }
      111 
      112 int main() {
      113     scanf("%lld%lld",&n,&m);
      114     while(M<=n)M<<=1;
      115     for(int i=1; i<=n; i++) {
      116         char ch;
      117         ld xd,yd;
      118         scanf("
      %c",&ch);
      119         if(ch=='U') scanf("%lf",&xd),up(ca[M+i],xd),up(cb[M+n-i+1],xd);
      120         else if(ch=='D') scanf("%lf",&xd),down(ca[M+i],xd),down(cb[M+n-i+1],xd);
      121         else if(ch=='L') scanf("%lf",&xd),left(ca[M+i],xd),left(cb[M+n-i+1],xd);
      122         else if(ch=='R') scanf("%lf",&xd),right(ca[M+i],xd),right(cb[M+n-i+1],xd);
      123         else if(ch=='O') scanf("%lf%lf",&xd,&yd),dcxy(ca[M+i],xd,yd),dcxy(cb[M+n-i+1],xd,yd);
      124         else if(ch=='C') scanf("%lf",&xd),turn(ca[M+i],xd),turn(cb[M+n-i+1],xd);
      125         else if(ch=='X') dcx(ca[M+i]),dcx(cb[M+n-i+1]);
      126         else if(ch=='Y') dcy(ca[M+i]),dcy(cb[M+n-i+1]);
      127     }
      128     build();
      129     while(m--) {
      130         char cc;
      131         scanf("
      %c",&cc);
      132         if(cc=='M') {
      133             int p,xd,yd;
      134             char ch;
      135             scanf("%d",&p);
      136             
      137         } else if(cc=='E');
      138         else if(cc=='A');
      139         else if(cc=='B');
      140     }
      141 } 
      View Code
  • 相关阅读:
    JAVA EE获取浏览器和操作系统信息
    ANT与SVN集成
    ANT property三种使用方式
    跨机器的文件夹访问和传输方法
    yolov5网络结构分析
    点到直线距离计算及g++编译
    深拷贝与浅拷贝(c++和python)
    qt工程环境设置
    Git 篇
    PyCharm 使用的技巧
  • 原文地址:https://www.cnblogs.com/KatouKatou/p/9539275.html
Copyright © 2020-2023  润新知