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
原文地址:https://www.cnblogs.com/HZOIDJ123/p/13377199.html