zoukankan      html  css  js  c++  java
  • Wannafly挑战赛22D

    题解:

    维护eix的区间和,询问时输出其虚部。

    我们发现给x+v,就是给eix乘eiv,那么便能区间维护了。

    注意sin和cos函数有些耗时,尽量减少其调用。

    代码:

      1 #include<stdio.h>
      2 #include<algorithm>
      3 #include<string.h>
      4 #include<map>
      5 #include<queue>
      6 #include<set>
      7 #include<vector>
      8 #include<cmath>
      9 #include<iostream>
     10 #include<complex>
     11 #define MAXN 1000005
     12 using namespace std;
     13 typedef long long ll;
     14 int a[200005];
     15 
     16 typedef complex<double> cd;
     17 cd col[600005];
     18 struct Node{
     19     int l,r;
     20     cd sum;
     21     Node operator + (const Node &t)const
     22     {
     23         Node res;
     24           
     25         res.l=l,res.r=t.r;
     26         res.sum=sum+t.sum;
     27         return res;
     28     }
     29 }node[600015];
     30   
     31 void construct(int l,int r,int k)
     32 {      col[k]=cd(1,0);
     33     if(l==r)
     34     {  
     35         node[k].l=node[k].r=l;
     36        node[k].sum=cd(cos(a[l]),sin(a[l]));
     37         return;
     38     }
     39     int mid=(l+r)/2;
     40     construct(l,mid,2*k);
     41     construct(mid+1,r,2*k+1);
     42       
     43     node[k]=node[2*k]+node[2*k+1];
     44       
     45   
     46 }
     47 void fun(int k,cd v)
     48 {
     49     node[k].sum*=v;
     50     col[k]*=v;
     51 }
     52 void down(int x)
     53 {
     54     if(col[x]!=cd(1,0))
     55     {
     56         fun(2*x,col[x]);
     57         fun(2*x+1,col[x]);
     58         col[x]=0;
     59     }
     60 }
     61   
     62 double query(int k,int x,int y)
     63 {    int l=node[k].l,r=node[k].r;
     64     if(x<=l&&r<=y)
     65     {
     66         return node[k].sum.imag();
     67     }
     68     down(k);
     69     int mid=(l+r)/2;
     70     double a;
     71       
     72     if(x>mid) a=query(2*k+1,x,y);
     73     else if(y<=mid) a=query(2*k,x,y);
     74     else a=query(2*k,x,mid)+query(2*k+1,mid+1,y);
     75       
     76     return a;
     77       
     78 }
     79 struct Node modifiy(int k,int x,int y,cd v)
     80 {    int l=node[k].l,r=node[k].r;
     81     if(x<=l&&r<=y)
     82     {   fun(k,v);
     83           
     84         return node[k];
     85     }
     86     down(k);
     87     int mid=(l+r)/2;
     88       
     89       
     90     if(x>mid) node[k]=node[2*k]+modifiy(2*k+1,x,y,v);
     91     else if(y<=mid) node[k]=modifiy(2*k,x,y,v)+node[2*k+1];
     92     else node[k]=modifiy(2*k,x,y,v)+modifiy(2*k+1,x,y,v);
     93     return node[k];
     94 }
     95 ll read()
     96 {
     97     ll x=0,f=1;char ch=getchar();
     98     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     99     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    100     return x*f;
    101 }
    102 int main()
    103 {
    104     int n;
    105     n=read();
    106     for(int i=1;i<=n;i++)
    107         a[i]=read();
    108     construct(1,n,1);
    109     int m;
    110     cin>>m;
    111     while(m--)
    112     {
    113         int op,l,r;
    114         ll v;
    115         op=read();
    116         if(op==1)
    117         {   l=read(),r=read(),v=read();
    118               
    119             modifiy(1,l,r,cd(cos(v),sin(v)));
    120         }
    121         else
    122         {
    123             l=read(),r=read();
    124             printf("%.1f
    ",query(1,l,r));
    125         }
    126     }
    127 }
  • 相关阅读:
    项目选题报告答辩总结
    项目UML设计(团队)
    项目选题报告答辩总结
    第七次作业
    结对第二次
    第四次作业
    alpha冲刺4
    alpha冲刺3
    alpha冲刺2
    alpha冲刺1
  • 原文地址:https://www.cnblogs.com/lnu161403214/p/9547891.html
Copyright © 2011-2022 走看看