无异于棵树上有n个节点,编号分别吗1到n,每个节点都发一个权值w。我们用为下面的款式来要求您针对这株树得有操作:
I. CHANGE u t : 把结点u的权值改吗t II. QMAX u v:
询问起点u到点v的门道上的节点的最为酷权值 III. QSUM u v:
询问起点u到点v的路子上的节点的权值和
注意:从点u到点v的途径上的节点包括u和v本身

Google Analystic 是一个对mobile
app和网站进行统计以及剖析的平台,对于产品的话,不管是职能的测试或调整完善都与用户的使及反映直接有关。Google
Analystic数据统计与分析的结果是故来发现与成品之不足的利器。

Input

输入的首先行一个整数n,表示节点的个数。接下来n –
1履,每行2个整数a和b,表示节点a和节点b之间出同一条边相连。接下来n行,每行一个整数,第i行的整数wi表示节点i的权值。接下来1推行,为一个整数q,表示操作的总数。接下来q行,每行一个操作,以“CHANGE
u t”或者“QMAX u v”或者“QSUM u v”的形式被闹。
对于100%之数,保证1<=n<=30000,0<=q<=200000;中途操作着保证每个节点的权值w在-30000到30000中间。

什么集成 Google Analytics到android 应用

Google Analystics的合并过程可以大概为零星组成部分:

  • 始建账户

Google
Analystics可以给视为数据收集平台,既然收集了数据,必然是于人拘禁的,少不了的便是相应的管住页面。当然首先步就是是只要当Google
Analystics平台达成登记管理账户。
接着就得于和谐账户下配置投机想使跟踪的app。

浑经过得的出现只有零星单:

  • google-services.json 文件

  • trackID

  • 集成Api:

    • 用 下充斥下来的google-services.json
      文件拷贝到得给钉的app,项目文件下的/app目录

    • 修改build.gradle文件,添加相关依赖

      • 类型外层的build.gradle文件(版本号已履新很多):

      classpath 'com.google.gms:google-services:1.4.0-beta3'
      
      • app module 下的build.gradle修改:

      // other plugins
      apply plugin: 'com.google.gms.google-services'
      dependencies {
          // other dependencies
          compile 'com.google.android.gms:play-services-analytics:8.1.0'
      }
      
      • AndroidManifest.xml
        给app配置INTERNET和ACCESS_NETWORK_STATE权限

      <manifest xmlns:android="http://schemas.android.com/apk/res/android"        package="com.example.analytics">
      <uses-permission android:name="android.permission.INTERNET"/> 
       <uses-permission
          android:name="android.permission.ACCESS_NETWORK_STATE"/>
       <application android:name="AnalyticsApplication">
      
&lt;/application&gt;  
&lt;/manifest&gt;  
\`\`\`

Output

对每个“QMAX”或者“QSUM”的操作,每行输出一个整数表示要求输出的结果。

树剖模板。

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<cmath>
  5 #include<cstring>
  6 using namespace std;
  7 
  8 const int INF=1e9+7,NN=30007,MM=1e5+7;
  9 
 10 int n,m,sz;
 11 int a[NN],deep[NN],size[NN],fa[NN],pos[NN],bl[NN];
 12 int cnt,head[NN],next[MM],rea[MM];
 13 struct Node
 14 {
 15     int l,r,mx,sum;
 16 }tree[MM];
 17 
 18 void add(int u,int v)
 19 {
 20     cnt++;
 21     next[cnt]=head[u];
 22     head[u]=cnt;
 23     rea[cnt]=v;
 24 }
 25 void dfs_init(int x)
 26 {
 27     size[x]=1;
 28     for (int i=head[x];i!=-1;i=next[i])
 29     {
 30         int v=rea[i];
 31         if (v==fa[x]) continue;
 32         deep[v]=deep[x]+1;
 33         fa[v]=x;
 34         dfs_init(v);
 35         size[x]+=size[v];
 36     }
 37 }
 38 void dfs_make(int x,int chain)//chain表示重链首的编号 
 39 {
 40     int k=0;//找重链 
 41     sz++;
 42     pos[x]=sz;//分配编号;
 43     bl[x]=chain;
 44     for (int i=head[x];i!=-1;i=next[i])
 45     {
 46         int v=rea[i];
 47         if (deep[v]>deep[x]&&size[v]>size[k]) k=v;
 48     }
 49     if (k==0) return;
 50     dfs_make(k,chain);
 51     for (int i=head[x];i!=-1;i=next[i])
 52     {
 53         int v=rea[i];
 54         if (deep[v]>deep[x]&&k!=v) dfs_make(v,v);
 55     }
 56 }
 57 void build(int k,int l,int r)
 58 {
 59     tree[k].l=l,tree[k].r=r;
 60     if (l==r) return;
 61     int mid=(l+r)>>1;
 62     build(k<<1,l,mid),build((k<<1)+1,mid+1,r); 
 63 }
 64 void change(int k,int x,int y)
 65 {
 66     int l=tree[k].l,r=tree[k].r,mid=(l+r)>>1;
 67     if (l==r){tree[k].sum=tree[k].mx=y;return;}
 68     if (x<=mid) change(k<<1,x,y);
 69     else change(k<<1|1,x,y);
 70     tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
 71     tree[k].mx=max(tree[k<<1].mx,tree[k<<1|1].mx);
 72 }
 73 int query_sum(int k,int x,int y)
 74 {
 75     int l=tree[k].l,r=tree[k].r,mid=(l+r)>>1;
 76     if (l==x&&r==y) return tree[k].sum;
 77     if (y<=mid) return query_sum(k<<1,x,y);
 78     else if (x>mid) return query_sum(k<<1|1,x,y);
 79     else return query_sum(k<<1,x,mid)+query_sum(k<<1|1,mid+1,y);
 80 }
 81 int query_max(int k,int x,int y)
 82 {
 83     int l=tree[k].l,r=tree[k].r,mid=(l+r)>>1;
 84     if (l==x&&y==r) return tree[k].mx;
 85     if (y<=mid) return query_max(k<<1,x,y);
 86     else if (x>mid) return query_max(k<<1|1,x,y);
 87     else return max(query_max(k<<1,x,mid),query_max(k<<1|1,mid+1,y));
 88 }
 89 int solve_sum(int x,int y)
 90 {
 91     int sum=0;
 92     while (bl[x]!=bl[y])//表示标记不同
 93     {
 94         if (deep[bl[x]]<deep[bl[y]]) swap(x,y);
 95         sum+=query_sum(1,pos[bl[x]],pos[x]);
 96         x=fa[bl[x]]; //跳完整条重链。 
 97     }
 98     if (pos[x]>pos[y]) swap(x,y);
 99     sum+=query_sum(1,pos[x],pos[y]);
100     return sum;
101 }
102 int solve_max(int x,int y)
103 {
104     int mx=-INF;
105     while (bl[x]!=bl[y])
106     {
107         if (deep[bl[x]]<deep[bl[y]]) swap(x,y);
108         mx=max(mx,query_max(1,pos[bl[x]],pos[x]));
109         x=fa[bl[x]];
110     }
111     if (pos[x]>pos[y]) swap(x,y);
112     mx=max(mx,query_max(1,pos[x],pos[y]));
113     return mx;
114 }
115 int main()
116 {
117     memset(head,-1,sizeof(head));
118     scanf("%d",&n);
119     for (int i=1;i<n;i++)
120     {
121         int x,y;
122         scanf("%d%d",&x,&y);
123         add(x,y),add(y,x);
124     }
125     for (int i=1;i<=n;i++)
126         scanf("%d",&a[i]);
127     dfs_init(1);
128     dfs_make(1,1);    
129     build(1,1,n);//建树。
130     for (int i=1;i<=n;i++)
131         change(1,pos[i],a[i]);
132     scanf("%d",&m);
133     char c[10];
134     for (int i=1;i<=m;i++)
135     {
136         int x,y;
137         scanf("%s%d%d",c,&x,&y);
138         if (c[0]=='C')
139         {
140             a[x]=y;
141             change(1,pos[x],y);
142         }
143         else
144         {
145             if (c[1]=='M') printf("%d\n",solve_max(x,y));
146             else printf("%d\n",solve_sum(x,y));
147         }
148     }
149 }

 

以代码中跟踪想要抱之信息

  • 使Application的子类获取track实例

      ```
      synchronized public Tracker getDefaultTracker() { 
          if (mTracker == null) {
              GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
              mTracker = analytics.newTracker(R.xml.global_tracker);
          }
          return mTracker; 
      }
      ```
    

跟踪Activity

  • 于Activity中展开跟踪

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // set up the shared Tracker
    AnalyticsApplication application = (AnalyticsApplication)   getApplication();   
    mTracker = application.getDefaultTracker();
}
@Override
public void onStart() {
    super.onStart(); // Always call the superclass method first
    // add log to make sure that GA is being called... Log.i(TAG, "Setting screen name: " + name); 
    mTracker.setScreenName("Image~" + name);
    // send the "hit" to GA
    mTracker.send(new HitBuilders.ScreenViewBuilder().build()); 
}

地方的示范中,包含了片有些,其一是抱tracker的实例,tracker的实例化过程都授application去开,这样的带动利益的即使是对tracker的联结管理,其第二便是经tracker把screen
name
发送到GA,当然还建议之做法就是把tracker的出殡screen的立刻部分意义为坐application类或其他便于管理的地方。对于利用的代码来说,只待知道自己用了tracker的tracker
screen方法就是只是,并不需要在每个页面实现均等的方式。

实在就是Track Activity来说,Google
Analystics支持了少于栽方式,第一栽不畏是地方示例的章程,通过代码来贯彻。另外一种不畏是直以布置文件统计被定义好要Track的页面。相比较而言code的计的扩展性要大一些,比如使想要于懂用户访问页面的时段还是其它组成部分信,就务须依自定义维度或从定义变量,而部署文件之方法是勿支持这种效益的。