• saf


      1 #include<cstdio>
      2 #include<vector>
      3 #include<queue>
      4 using namespace std;
      5 const int maxn=100000+10,maxm=1e6+10;
      6 vector<int> hang[maxm];
      7 vector<int> lie[maxm];
      8 int rd[maxn],out[maxn],f[maxn];
      9 struct Edge{
     10     int to,next,from;
     11 }e[maxm<<2];
     12 struct Node1{
     13     int to,next;
     14 }g[maxm<<2];
     15 struct Node{
     16     int x,y;
     17     int t;
     18 }a[maxn];
     19 int head[maxn],tot=0;
     20 void Insert(int a,int b){
     21     e[++tot].to=b;
     22     e[tot].from=a;
     23     e[tot].next=head[a];
     24     head[a]=tot;
     25 }
     26 int rhead[maxn],top=0;
     27 void add(int a,int b){
     28     g[++top].to=b;
     29     g[top].next=rhead[a];
     30     rhead[a]=top;
     31 }
     32 int dfn[maxn],low[maxn],size[maxn],st[maxn],t=0,sc=0,scc[maxn],vis[maxn],Time=0;
     33 void tarjan(int u){
     34     dfn[u]=low[u]=++Time;
     35     st[++t]=u;
     36     vis[u]=1;
     37     for(int i=head[u];i;i=e[i].next){
     38         int v=e[i].to;
     39         if(!dfn[v]){
     40             tarjan(v);
     41             low[u]=min(low[u],low[v]);
     42         }
     43         else if(vis[v]) low[u]=min(low[u],dfn[v]);
     44     }
     45     if(dfn[u]==low[u]){
     46         sc++;
     47         while(st[t]!=u){
     48             scc[st[t]]=sc;
     49             size[sc]++;
     50             vis[st[t]]=0;
     51             t--;
     52         }
     53         scc[u]=sc;
     54         size[sc]++;
     55         vis[u]=0;
     56         t--;
     57     }
     58 }
     59 void tosort(){
     60     queue<int> q;
     61     for(int i=1;i<=sc;i++){
     62         if(!rd[i]){
     63             q.push(i);
     64             f[i]=size[i];
     65         }    
     66     }
     67     while(!q.empty()){
     68         int u=q.front();
     69         q.pop();
     70         for(int i=rhead[u];i;i=g[i].next){
     71             int v=g[i].to;
     72             rd[v]--;
     73             f[v]=max(f[v],f[u]+size[v]);
     74             if(!rd[v]){
     75                 q.push(v);
     76             }
     77         }
     78     }
     79 }
     80 int main(){
     81     int n,r,c;
     82     scanf("%d%d%d",&n,&r,&c);
     83     for(int i=1;i<=n;i++){
     84         scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].t);
     85         hang[a[i].x].push_back(i);
     86         lie[a[i].y].push_back(i);
     87     }    
     88     for(int i=1;i<=n;i++){
     89         if(a[i].t==1){
     90             int size=hang[a[i].x].size();
     91             for(int j=0;j<size;j++){
     92                 int x=hang[a[i].x][j];
     93                 if(x==i) continue;
     94                 Insert(i,x);
     95             }    
     96         }
     97         else if(a[i].t==2){
     98             int size=lie[a[i].y].size();
     99             for(int j=0;j<size;j++){
    100                 int x=lie[a[i].y][j];
    101                 if(x==i) continue;
    102                 Insert(i,x);
    103             }
    104         }
    105         else{
    106             for(int k=-1;k<=1;k++){
    107                 int x=a[i].x+k;
    108                 int size=hang[x].size();
    109                 for(int j=0;j<size;j++){
    110                     int xx=hang[x][j];
    111                     if(xx==i||a[xx].y<a[i].y-1||a[xx].y>a[i].y+1) continue;
    112                     Insert(i,xx);
    113                 }
    114             }
    115         }
    116     }
    117     for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
    118     for(int i=1;i<=tot;i++){
    119         int u=e[i].from;
    120         int v=e[i].to;
    121         if(scc[u]!=scc[v]){
    122             add(scc[u],scc[v]);
    123             rd[scc[v]]++;
    124             out[scc[u]]++;
    125         }    
    126     }
    127     tosort();
    128     int ans=0;
    129     for(int i=1;i<=sc;i++){
    130         if(!out[i]) ans=max(ans,f[i]);
    131     }
    132     printf("%d
    ",ans);
    133     return 0;
    134 }
    View Code
      1 #include<cstdio>
      2 #include<cstring>
      3 #include<utility>
      4 using namespace std;
      5 const int maxn=250000+10;
      6 int lazy[maxn<<2],tree[maxn<<2];
      7 struct Edge{
      8     int to,next;
      9 }e[maxn<<1];
     10 int head[maxn],tot=0;
     11 void Insert(int a,int b){
     12     e[++tot].to=b;
     13     e[tot].next=head[a];
     14     head[a]=tot;
     15 }
     16 int top=0;
     17 int deep[maxn],size[maxn],num[maxn];
     18 void dfs(int u,int fa){
     19     deep[u]=deep[fa]+1;
     20     num[u]=++top;
     21     for(int i=head[u];i;i=e[i].next){
     22         int v=e[i].to;
     23         if(v==fa) continue;
     24         dfs(v,u);
     25         size[u]+=size[v];
     26     }
     27 }
     28 void pushup(int rt){
     29     tree[rt]=tree[rt<<1]+tree[rt<<1|1];
     30 }
     31 void Modify(int rt,int l,int r,int x,int w){
     32     if(l==r){
     33         tree[rt]+=w;
     34         return;
     35     }
     36     int mid=(l+r)>>1;
     37     if(x<=mid) Modify(rt<<1,l,mid,x,w);
     38     else Modify(rt<<1|1,mid+1,r,x,w);
     39     pushup(rt);
     40 }
     41 void update(int rt,int l,int r,int w){
     42     tree[rt]+=(r-l+1)*w;
     43     lazy[rt]+=w;
     44 }
     45 void pushdown(int rt,int l,int r){
     46     int mid=(l+r)>>1;
     47     update(rt<<1,l,mid,lazy[rt]);
     48     update(rt<<1|1,mid+1,r,lazy[rt]);
     49     lazy[rt]=0;
     50 }
     51 int query(int rt,int l,int r,int x){
     52     if(l==r){
     53         return tree[rt];
     54     }
     55     pushdown(rt,l,r);
     56     int mid=(l+r)>>1;
     57     if(x<=mid) return query(rt<<1,l,mid,x);
     58     else return query(rt<<1|1,mid+1,r,x);
     59 }
     60 void Modify1(int rt,int l,int r,int s,int t,int w){
     61     if(s<=l&&t>=r){
     62         update(rt,l,r,w);
     63         return;
     64     }
     65     int mid=(l+r)>>1;
     66     if(s<=mid) Modify1(rt<<1,l,mid,s,t,w);
     67     if(t>mid) Modify1(rt<<1|1,mid+1,r,s,t,w);
     68     pushup(rt);
     69 }
     70 int main(){
     71     int n;
     72     scanf("%d",&n);
     73     for(int i=1;i<n;i++){
     74         int x,y;
     75         scanf("%d%d",&x,&y);
     76         Insert(x,y);
     77         Insert(y,x);
     78     }
     79     for(int i=1;i<=n;i++) size[i]=1;
     80     dfs(1,0);
     81     for(int i=1;i<=n;i++) Modify(1,1,n,num[i],deep[i]-1);
     82     int m;
     83     scanf("%d",&m);
     84     for(int i=1;i<=n+m-1;i++){
     85         char s[3];
     86         scanf("%s",s);
     87         if(s[0]=='W'){
     88             int x;
     89             scanf("%d",&x);
     90             int ans=query(1,1,n,num[x]);
     91             printf("%d
    ",ans);
     92         }
     93         else{
     94             int x,y;
     95             scanf("%d%d",&x,&y);
     96             if(x>y) swap(x,y);
     97             Modify1(1,1,n,num[y],num[y]+size[y]-1,-1);
     98         }
     99     }
    100     return 0;
    101 }
    View Code
  • 相关阅读:
    AspNet WebApi 中应用fo-dicom抛出异常:No codec registered for tranfer syntax:
    Codeforces Round #261 (Div. 2)459A. Pashmak and Garden(数学题)
    Android开发之使用Web Service进行网络编程
    线段树 + 扫描线加深具体解释
    对Shell几个冷知识的总结(IFS,数组,替换,分割,查找)
    lscript.ld 链接器脚本
    iOS 系统地图实现及定位
    Perl怎样过滤html标签
    hdu1213 How Many Tables(并查集)
    数据结构——链表
  • 原文地址:https://www.cnblogs.com/HZOIDJ123/p/13377199.html
Copyright © 2020-2023  润新知