• 2015 Multi-University Training Contest 1


    1001 OO’s Sequence

    定义两个数组L[i],R[i]保存第i个数左右最近的因子。

    那么第i个数对ans的贡献就是(R[i]-i)*(i-L[i])。

    更新L,R数组的方法如下:

    用向量预存[1,10000]中每个数的位置。

    对于a[i],枚举它的所有倍数,记为j。
    若j在a[i]左边,且a[i]小于原来的R[j],即a[i]与j更近,那么R[j]的位置更新为i。
    若j在a[i]右边,且a[i]大于原来的L[j],即a[i]与j更近,那么L[j]的位置更新为i。

    【标程做了一个优化,将小于100的因子先处理。】

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <algorithm>
     4 # include <vector>
     5 using namespace std;
     6 typedef long long LL;
     7 # define MOD 1000000007
     8 # define maxn 100010
     9 vector <int> vec[10001];
    10 int a[maxn],L[maxn],R[maxn];
    11 
    12 int main(void)
    13 {
    14     int n;
    15     while((scanf("%d",&n))!=EOF)
    16     {
    17         for(int i=1;i<=10000;i++) vec[i].clear();
    18         for(int i=1;i<=n;i++)
    19         {
    20             scanf("%d",a+i);
    21             L[i]=0; R[i]=n+1;
    22             vec[a[i]].push_back(i);
    23         }
    24         for(int i=1;i<=n;i++)
    25             for(int j=a[i];j<=10000;j+=a[i])
    26                 for(int k=0;k<vec[j].size();k++)
    27                 {
    28                     if(vec[j][k]>=i) break;
    29                     else R[vec[j][k]]=min(R[vec[j][k]],i);
    30                 }
    31         for(int i=1;i<=n;i++)
    32             for(int j=a[i];j<=10000;j+=a[i])
    33                 for(int k=vec[j].size()-1;k>=0;k--)
    34                 {
    35                     if(vec[j][k]<=i) break;
    36                     else L[vec[j][k]]=max(L[vec[j][k]],i);
    37                 }
    38         LL ans=0;
    39         for(int i=1;i<=n;i++) ans= ( ans+ (LL)(R[i]-i) * (LL)(i-L[i]) )%MOD;
    40         printf("%I64d
    ",ans);
    41     }
    42     return 0;
    43 }
    Aguin

    1002 Assignment

    先用ST表处理好所有区间的最大值最小值。

    枚举区间的左端点L,区间内最大值与最小值的差值随着右端点的增加单调递增。

    于是可以二分出合法的右端点最大值Rmax。

    找到右端点的最大值,则只要右端点R满足L<=R<=Rmax的区间均可。

    即找出每组L,Rmax对ans的贡献是Rmax-L+1。

    答案超出了int范围。注意LL。

    【跑完时间并不宽裕。慎用线段树与树状数组。】

    【先不说ST表。感觉自己二分一直写很丑阿。】

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cmath>
     4 # include <algorithm>
     5 using namespace std;
     6 typedef long long LL;
     7 # define maxn 100010
     8 LL a[maxn],MAX[maxn][20],MIN[maxn][20];
     9 
    10 int main(void)
    11 {
    12     int T; cin>>T;
    13     while(T--)
    14     {
    15         int n,k; scanf("%d%d",&n,&k);
    16         for(int i=1;i<=n;i++)
    17         {
    18             scanf("%I64d",a+i);
    19             MAX[i][0]=MIN[i][0]=a[i];    
    20         }
    21         for(int j=1;j<20;j++)
    22             for(int i=1;i<=n;i++)
    23                 if(i+(1<<j)-1<=n)
    24                 {
    25                     MAX[i][j]=max(MAX[i][j-1],MAX[i+(1<<j-1)][j-1]);
    26                     MIN[i][j]=min(MIN[i][j-1],MIN[i+(1<<j-1)][j-1]);
    27                 }
    28         LL ans=0;
    29         for(int i=1;i<=n;i++)
    30         {
    31             int l=i,r=n;
    32             while(l<r)
    33             {
    34                 int mid=(l+r)/2;
    35                 int t=(log(double(mid-i+1))/log(2));
    36                 LL tem=max(MAX[i][t],MAX[mid-(1<<t)+1][t])-min(MIN[i][t],MIN[mid-(1<<t)+1][t]);
    37                 if(tem>=k) r=mid-1;
    38                 else l=mid+1;
    39             }
    40             int t=(log(double(l-i+1))/log(2));
    41             LL tem=max(MAX[i][t],MAX[l-(1<<t)+1][t])-min(MIN[i][t],MIN[l-(1<<t)+1][t]);
    42             if(tem>=k) l--;
    43             ans+=l-i+1;
    44         }
    45     printf("%I64d
    ",ans);
    46     }
    47     return 0;
    48 }
    Aguin

    1003 Bombing plan

    1004 Candy Distribution

    1005 Pocket Cube

    前面百度之星做过一个魔方。

    纯模拟即可。也有看色向的优化方法。但是并没有去了解。

    这题一看就知道是判色向的。然而并不知道怎么算QAQ。

    【比赛的时候学姐竟然还叫我看一下这个题目。太看得起我了。】

    题解很良心的证明了一下定理。想再讲一下自己的理解。

    因为只会三阶公式。我一般是把二阶魔方看成三阶的角块。

    所有安装正确的二阶魔方是一个等价类。通过旋转置换还原。

    【二阶有自己更为简洁的公式。】

    首先。必定能做到将底层还原。

    其次。运用角块归位公式。将角块的位置摆对。不看色向。(即官方题解图3)

    【上面两步即便是装错的也能做到。】

    最后。顶块翻色。这个公式是两个相邻的角块同时向内侧翻色。(即官方题解图2)

    一个安装正确的魔方只要反复翻色。每次至少使一个角块颜色正确。便能还原。

    错误安装的魔方翻色至最后一个角块的色向是顺时针或者逆时针的。

    证明的主要内容就是说明了。这个翻色的操作不会改变色向和%3的值。

    而一个还原的二阶魔方色相和%3是为零的。

    因此只有色相和%3为零的魔方才是正确安装魔方的等价类。

     1 # include <iostream>
     2 # include <cstdio>
     3 using namespace std;
     4 
     5 int main(void)
     6 {
     7     int T; cin>>T;
     8     for(int kase=1;kase<=T;kase++)
     9     {
    10         int sum=0;
    11         for(int i=1;i<=24;i++)
    12         {
    13             char color[5];
    14             scanf(" %s",color);
    15             if(color[0]=='w'||color[0]=='y')
    16             {
    17                 if(i==1||i==4||i==6||i==10||i==11||i==15||i==17||i==20) sum++;
    18                 else if(i==2||i==3||i==5||i==9||i==12||i==16||i==18||i==19) sum--;
    19             }
    20         }
    21         printf("Case #%d: ",kase);
    22         if(sum%3==0) printf("YES
    ");
    23         else printf("NO
    ");
    24     }
    25     return 0;
    26 }
    Aguin

    1006 Tree chain problem

    码这个真的超级不容易。希望我能把这个问题讲清楚。

    菊苣们必然是有很厉害的方法的。

    对于我等渣而言。做这个题至少要了解以下内容。

    会些dp。时间戳。会一个区间求和工具(线段树或者树状数组。会LCA(离线。在线。

    我对dp了解并不多。求和图方便用的树状数组。LCA只会离线的。

    首先要理解题意。题目中u,v间链是从u出发向上绕过LCA(u,v)再往下连到v的。

    (一开始我连sample都看不懂。

    整体上是一个树形dp。看成1为根的有根树。

    用dp[i]表示以i为根节点的子树的答案。那么我们要求的是dp[1]。

    为了方便。引进了sum[i]=sigma(dp[k]|k为i的孩子)。

    状态转移是这样的。

    如果我们取的链不经过i。

    那么dp[i]=sum[i]。即子树上的链重和就是答案。

    如果我们要取经过i的链。注意到dp[i]的含义是以i为根节点的子树的答案。

    既然i是根了。而且链经过了i。那么i必然也是链两端节点的LCA了。

    取了这条链之后。对于链上的每个节点j。我们就不能再取经过它们的链了。

    那么它们对dp[i]的贡献就由原来的dp[j]减少为sum[j]。

    所以我们在sum[i]的基础上先减去sigma(dp[j]|j为链上的节点)再加回sigma(sum[j]|j为链上的节点)。

    考虑完所有的链。

    dp[i]=max(sum[i],sum[i]+weight-sigma(dp[j]|j为链上的节点)+sigma(sum[j]|j为链上的节点))。

    这里官方题解似乎忘记加上sum[i]了。

    到这里我们还有两个问题。

    1.如何处理LCA。

    2.计算sigma很大程度上决定了总效率。如何求和。

    LCA我用的是离线的算法。

    用一个结构体向量存以每个节点为LCA的链的端点和重量。

    每找出一个LCA往向量里push。dp的时候扫一遍即可。

    求和这里用了一个神奇的方法。

    想想的话也不难理解。用了时间戳的一些性质。 

    对于N个节点的情况。dfs的时候进出都打时间戳。范围就是[1,2*N]。

    把进入i的时间记为Time_in[i]。出i的时间记为Time_out[i]。

    然后重点来了。树状数组(或线段树)加和的对象不是节点。

    而是时间。也就是上面所说的[1,2*N]的范围。

    对于每个dp[i]。我们在Time_in[i]点+dp[i]。在Time_out[i]点-dp[i]。

    (因为相当于是成段更新单点询问的。之前在线段树/树状数组的题目有出现过。)

    那么当我们处理以i为根的子树中的链时。对于链的端点u。

    询问Time_in[u]的前缀和就是从u到i的dp和。(sum同理)

    原因如下。

    在dfs的时候有一个性质。节点j在节点i的子树中当且仅当j的进入时间比i晚。且退出时间比i早。

    递归操作在update树状数组前面。所以处理到i的时候。树状数组里加的还只有i的子树。

    不在u到i之间的节点无非四种情况。

    i)不在i的子树中。还没加到树状数组里。

    ii)在i的子树中。但不在u的子树中。访问的时间在u的前面。退出时间也在u的前面。计算Time_in[u]前缀和的时候抵消了。

    iii)在i的子树中。但不在u的子树中。访问的时间在u的后面。不被加到Time_in[u]里。

    iiii)在u的子树中。访问时间在u的后面。不被加到Time_in[u]里。

    从而说明了Time_in[u]的前缀和只有u到i链上的节点。

    这样所有问题都解决了。

    最后说一下整个过程。

    1.初始化。读边。

    2.求所有链的LCA。在算LCA递归的同时处理出每个点的时间戳。

    3.按照上面说的状态转移方程树形dp。用树状数组对时间点求前缀和。

    4.算出dp[1]即为答案。

    以上是我自己对这道题的理解。可能代码表达的更清楚。

    最后注意防爆栈黑科技。

      1 #pragma comment(linker, "/STACK:1024000000,1024000000")
      2 # include <iostream>
      3 # include <cstdio>
      4 # include <cstring>
      5 # include <algorithm>
      6 # include <vector>
      7 using namespace std;
      8 # define maxn 100010
      9 # define CLR(x) memset(x,0,sizeof(x))
     10 vector <int> edge[maxn],chain[maxn],weight[maxn];
     11 int n,time,dp[maxn],sum[maxn],father[maxn],Tin[maxn],Tout[maxn];
     12 int Cdp[2*maxn],Csum[2*maxn];
     13 bool vis[maxn];
     14 
     15 struct node
     16 {
     17     int u,v,weight;
     18 };
     19 vector <node> Vchain[maxn];
     20 
     21 int Find(int x)
     22 {
     23     return father[x]==x?x:father[x]=Find(father[x]);
     24 }
     25 
     26 void LCA(int x)
     27 {
     28     Tin[x]=++time; vis[x]=1;
     29     for(int i=0;i<edge[x].size();i++)
     30     {
     31         if(vis[edge[x][i]]) continue;
     32         LCA(edge[x][i]);
     33         father[edge[x][i]]=x;
     34     }
     35     for(int i=0;i<chain[x].size();i++)
     36     {
     37         if(vis[chain[x][i]])
     38         {
     39             node tem;
     40             tem.u=x; tem.v=chain[x][i];
     41             tem.weight=weight[x][i];
     42             Vchain[Find(tem.v)].push_back(tem);
     43         }
     44     }
     45     Tout[x]=++time;
     46     return;
     47 }
     48 
     49 int lowbit(int s)
     50 {
     51     return s&(-s);
     52 }
     53 
     54 void update_dp(int i,int x)
     55 {
     56     while(i<=2*n){Cdp[i]+=x; i+=lowbit(i);}
     57     return;    
     58 }
     59 
     60 int getdp(int i)
     61 {
     62     int ans=0;
     63     while(i>0){ans+=Cdp[i]; i-=lowbit(i);}
     64     return ans;
     65 }
     66 
     67 void update_sum(int i,int x)
     68 {
     69     while(i<=2*n){Csum[i]+=x; i+=lowbit(i);}
     70     return;    
     71 }
     72 
     73 int getsum(int i)
     74 {
     75     int ans=0;
     76     while(i>0){ans+=Csum[i]; i-=lowbit(i);}
     77     return ans;
     78 }
     79 
     80 void dfs(int x)
     81 {
     82     vis[x]=1;
     83     for(int i=0;i<edge[x].size();i++)
     84     {
     85         if(vis[edge[x][i]]) continue;
     86         dfs(edge[x][i]);
     87         sum[x]+=dp[edge[x][i]];
     88     }
     89     dp[x]=sum[x];
     90     for(int i=0;i<Vchain[x].size();i++)
     91     {
     92         int u=Vchain[x][i].u,v=Vchain[x][i].v,w=Vchain[x][i].weight;
     93         int tem=sum[x]+getsum(Tin[u])-getdp(Tin[u])+getsum(Tin[v])-getdp(Tin[v])+w;
     94         dp[x]=max(dp[x],tem);
     95     }
     96     update_dp(Tin[x],dp[x]); update_dp(Tout[x],-dp[x]);
     97     update_sum(Tin[x],sum[x]); update_sum(Tout[x],-sum[x]);
     98     return;
     99 }
    100 
    101 int main(void)
    102 {
    103     int T; cin>>T;
    104     while(T--)
    105     {
    106         int m; scanf("%d%d",&n,&m);
    107         for(int i=1;i<=n;i++)
    108         {
    109             father[i]=i;
    110             edge[i].clear();
    111             chain[i].clear();
    112             weight[i].clear();
    113             Vchain[i].clear();
    114         }
    115         for(int i=0;i<n-1;i++)
    116         {
    117             int a,b; scanf("%d%d",&a,&b);
    118             edge[a].push_back(b);
    119             edge[b].push_back(a);
    120         }
    121         for(int i=0;i<m;i++)
    122         {
    123             int u,v,val; scanf("%d%d%d",&u,&v,&val);
    124             chain[u].push_back(v);
    125             chain[v].push_back(u);
    126             weight[u].push_back(val);
    127             weight[v].push_back(val);
    128         }
    129         CLR(vis); CLR(dp); CLR(sum);
    130         time=0; LCA(1);
    131         CLR(vis); CLR(Cdp); CLR(Csum);
    132         dfs(1);
    133         printf("%d
    ",dp[1]);
    134     }
    135     return 0;
    136 }
    Aguin

    1007 Tricks Device

     这个题如果知道的话就是个模板题。

    先求个最短路。Dijkstra或者SPFA。

    求最短路的时候用cnt数组标记下最少要几条边。

    然后根据最短路所在的边重新建图。每条边权1。

    存边时注意别被重边或者环坑到。

    求出最大流就是第一问答案。M-cnt[N]是第二问答案。

    最大流用EK必然是T的。刚学的SAP。题解用的Dinic。

      1 # include <iostream>
      2 # include <cstdio>
      3 # include <cstring>
      4 # include <algorithm>
      5 # include <vector>
      6 # include <queue>
      7 using namespace std;
      8 # define CLR(x) memset(x,0,sizeof(x))
      9 # define INF 2147483647
     10 # define maxn 2020
     11 int N,M,vis[maxn],cnt[maxn],dist[maxn];
     12 int map[maxn][maxn],pre[maxn],level[maxn],gap[maxn];
     13 vector< pair<int,int> > edge[maxn];
     14 priority_queue< pair<int,int> , vector< pair<int,int> > , greater< pair<int,int> > > pq;
     15 
     16 void dijkstra(void)
     17 {
     18     CLR(cnt); CLR(vis);
     19     for(int i=1;i<=N;i++) dist[i]=INF;
     20     dist[1]=0; cnt[1]=0;
     21     while(!pq.empty()) pq.pop();
     22     pq.push(make_pair(0,1));
     23     while(!pq.empty())
     24     {
     25         pair<int,int> tem=pq.top(); pq.pop();
     26         int to=tem.second;
     27         if(vis[to]) continue;
     28         vis[to]=1;
     29         for(int i=0;i<edge[to].size();i++)
     30         {
     31             tem=edge[to][i];
     32             int next=tem.second,l=tem.first;
     33             if(vis[next]) continue;
     34             if(dist[next]>dist[to]+l)
     35             {
     36                 dist[next]=dist[to]+l;
     37                 cnt[next]=cnt[to]+1;
     38                 pq.push(make_pair(dist[next],next));
     39             }
     40             else if(dist[next]==dist[to]+l) cnt[next]=min(cnt[next],cnt[to]+1);
     41         }
     42     }
     43     return;
     44 }
     45 
     46 void buildG(void)
     47 {
     48     CLR(map);
     49     for(int i=1;i<N;i++)
     50     {
     51         for(int j=0;j<edge[i].size();j++)
     52         {
     53             pair<int,int> tem=edge[i][j];
     54             int to=tem.second,l=tem.first;
     55             if(dist[i]+l==dist[to]) map[i][to]+=1;
     56         }
     57     }
     58     return;
     59 }
     60 
     61 int SAP(void)
     62 {
     63     CLR(pre); CLR(level); CLR(gap);
     64     gap[0]=N; pre[1]=1;
     65     int pos=1,flow=0,aug;
     66     while(level[1]<N)
     67     {
     68         int to;
     69         for(to=1;to<=N;to++) 
     70             if(map[pos][to]>0&&level[pos]==level[to]+1)
     71                 break;
     72         if(to<=N)
     73         {
     74             pre[to]=pos; pos=to;
     75             if(pos==N)
     76             {
     77                 aug=INF;
     78                 for(int i=pos;i!=1;i=pre[i]) aug=min(aug,map[pre[i]][i]);
     79                 flow+=aug;
     80                 for(int i=pos;i!=1;i=pre[i])
     81                 {
     82                     map[pre[i]][i]-=aug;
     83                     map[i][pre[i]]+=aug;
     84                 }
     85                 pos=1;
     86             }
     87         }
     88         else
     89         {
     90             int minlevel=N;
     91             for(int i=1;i<=N;i++)
     92                 if(map[pos][i]>0)
     93                     minlevel=min(minlevel,level[i]);
     94             gap[level[pos]]--;
     95             if(!gap[level[pos]]) break;
     96             level[pos]=minlevel+1;
     97             gap[level[pos]]++;
     98             pos=pre[pos];
     99         }        
    100     }
    101     return flow;
    102 }
    103 
    104 int main(void)
    105 {
    106 //    freopen("1007.in","r",stdin);
    107     while((scanf("%d%d",&N,&M))!=EOF)
    108     {
    109         for(int i=1;i<=N;i++) edge[i].clear();
    110         for(int i=1;i<=M;i++)
    111         {
    112             int a,b,l; scanf("%d%d%d",&a,&b,&l);
    113             edge[a].push_back(make_pair(l,b));
    114             edge[b].push_back(make_pair(l,a));
    115         }
    116         dijkstra(); buildG();
    117         printf("%d %d
    ",SAP(),M-cnt[N]);
    118     }
    119     return 0;
    120 }
    Aguin

    1008 Unstable

    1009 Annoying problem

    按官方题解。

    先处理dfs序。每添加一个点。找到集合中dfs序在它两旁且与它最邻近的点。

    记为x,y。如果没有比它大的或者没有比它小的。就取字典序最大最小的两个点为x,y。

    增加的花费为dis[u]-dis[lca(x,u)]-dis[lca(y,u)]+dis[lca(x,y)]

    删点的时候减少的费用也是一样的。

    关键在于dis[u]-dis[lca(x,u)]-dis[lca(y,u)]+dis[lca(x,y)]这个式子。

    我是这样理解的。(只看增点。删点一样的。)

    增点过程实际上是建一颗新树。

    对于新节点u。如果找到了在它近旁的x,y。那么它就在以lca(x,y)为根的子树中。

    我们只要把它连到离它最近的点即可。而这个点不是lca(x,u)就是lca(y,u)。

    所以增加的费用就是u到lca(x,u)或者lca(y,u)的距离。

    假设u连到lca(x,u)了。观察式子dis[u]-dis[lca(x,u)]-dis[lca(y,u)]+dis[lca(x,y)]。

    其中dis[u]-dis[lca(x,u)]就是u到lca(x,u)的距离。

    而lca(y,u)=lca(x,y)。后两项抵消。连到lca(y,u)同理。

    再考虑找不到x,y的情况。

    若u还在集合中点构成的子树中。那么情况和刚才的是一样的。

    还有一种情况。就是集合中点构成的树和新点u不在同一颗子树中。

    我们要做其实是先找到它们的根,即为lca(x,u) 【注意此时lca(x,u)=lca(y,u)】

    再把集合中的树的根【即lca(x,y)】连到lca(x,u)。再把u连到lca(x,u)。

    费用是lca(x,y)到lca(x,u)的距离加上u到lca(x,u)的距离。

    再看看dis[u]-dis[lca(x,u)]-dis[lca(y,u)]+dis[lca(x,y)]。

    刚才说过lca(x,u)=lca(y,u)。所以还是符合的。 

    【这里LCA需要在线的。于是学了下倍增法。】

      1 # include <iostream>
      2 # include <cstdio>
      3 # include <cstring>
      4 # include <algorithm>
      5 # include <vector>
      6 # include <set>
      7 using namespace std;
      8 # define maxn 100010
      9 # define CLR(x) memset(x,0,sizeof(x))
     10 # define pii pair<int,int>
     11 # define mp make_pair
     12 int t,dep[maxn],p[maxn][20],dist[maxn],time[maxn],f[maxn];
     13 vector< pii > vec[maxn];
     14 set<int> s;
     15 set<int>::iterator it;
     16 
     17 void dfs(int x)
     18 {
     19     time[x]=++t; f[t]=x;
     20     for(int i=0;i<vec[x].size();i++)
     21     {
     22         pii tem=vec[x][i];
     23         int to=tem.first,w=tem.second;
     24         if(!dep[to]&&to!=1)
     25         {
     26             dep[to]=dep[x]+1;
     27             dist[to]=dist[x]+w;
     28             p[to][0]=x;
     29             dfs(to);
     30         }
     31     }
     32     return;
     33 }
     34 
     35 int lca(int a,int b)
     36 {
     37     if(dep[a]<dep[b]) swap(a,b);
     38     int log=0;
     39     while((1<<log)<=dep[a]) log++; log--;
     40     for(int i=log;i>=0;i--)
     41         if(dep[a]-(1<<i)>=dep[b])
     42             a=p[a][i];
     43     if(a==b) return a;
     44     for(int i=log;i>=0;i--)
     45         if(p[a][i]!=-1&&p[a][i]!=p[b][i])
     46         {
     47             a=p[a][i];
     48             b=p[b][i];
     49         }
     50     return p[a][0];
     51 }
     52 
     53 int cal(int t)
     54 {
     55     if(s.empty()) return 0;
     56     it=s.lower_bound(t);
     57     int x,y;
     58     if(it==s.begin()||it==s.end())
     59     {
     60         x=(*s.begin());
     61         it=s.end(); it--;
     62         y=*(it);
     63     }
     64     else
     65     {
     66         y=(*it);
     67         it--; x=(*it);
     68     }
     69     return dist[f[t]]-dist[lca(f[x],f[t])]-dist[lca(f[y],f[t])]+dist[lca(f[x],f[y])];
     70 }
     71 
     72 
     73 int main(void)
     74 {
     75     int T;cin>>T;
     76     for(int kase=1;kase<=T;kase++)
     77     {
     78         int n,q; scanf("%d%d",&n,&q);
     79         for(int i=1;i<=n;i++) vec[i].clear();
     80         for(int i=1;i<n;i++)
     81         {
     82             int u,v,w; scanf("%d%d%d",&u,&v,&w);
     83             vec[u].push_back(mp(v,w));
     84             vec[v].push_back(mp(u,w));
     85         }
     86         memset(p,-1,sizeof(p));
     87         t=0; CLR(dep); dist[1]=0;
     88         dfs(1);
     89         for(int j=1;(1<<j)<=n;j++)
     90             for(int i=1;i<=n;i++)
     91                 if(p[i][j-1]!=-1)
     92                     p[i][j]=p[p[i][j-1]][j-1];
     93         int ans=0; s.clear();
     94         printf("Case #%d:
    ",kase);
     95         while(q--)
     96         {
     97             int x,y; scanf("%d%d",&x,&y);
     98             if(x==1&&!s.count(time[y]))
     99             {
    100                 ans+=cal(time[y]);
    101                 s.insert(time[y]);
    102             }
    103             else if(x==2&&s.count(time[y]))
    104             {
    105                 s.erase(time[y]);
    106                 ans-=cal(time[y]);    
    107             }
    108             printf("%d
    ",ans);
    109         }
    110     }
    111     return 0;
    112 }
    Aguin

    1010 Y sequence

    1011 Solid Geometry Homework

    1012 Circles Game

  • 相关阅读:
    Spring 框架的设计理念与设计模式分析
    stratos paas平台
    云计算国际标准
    如何在KVM中管理存储池
    深度学习(四) softmax函数
    深度学习(二)BP求解过程和梯度下降
    深度学习(一) BP神经网络
    提交代码到git
    Mac 安装tensorflow
    Mac 安装Git
  • 原文地址:https://www.cnblogs.com/Aguin/p/4665510.html
Copyright © 2020-2023  润新知