求教卡常/kk
查看原帖
求教卡常/kk
172370
fzj2007楼主2021/11/13 16:15

RT,不知道为什么就 T 了......

TLE on test 15,16,17,18,21

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<cmath>
#include<iomanip>
#include<string>
#include<cstring>
#include<set>
#include<stack>
#include<queue>
#include<bitset>
using namespace std;
namespace IO{
    template<typename T>inline void read(T &x){
        x=0;
        char ch=getchar();
        bool flag=0;
        while(ch<'0'||ch>'9') flag=flag||(ch=='-'),ch=getchar();
        while(ch>='0'&&ch<='9') x=x*10+(ch^'0'),ch=getchar();
        if(ch!='.'){
            x=flag?-x:x;
            return;
        }
        double Base=0.1;
        while(ch<'0'||ch>'9') ch=getchar();
        while(ch>='0'&&ch<='9') x=x+Base*(ch^'0'),Base/=10.0,ch=getchar();
        x=flag?-x:x;
    }
    template<typename T>void prt(T x){
        if(x>9) prt(x/10);
        putchar(x%10+'0');
    }
    template<typename T>inline void put(char ch,T x){
        if(x<0) putchar('-'),x=-x;
        prt(x);
        putchar(ch);
    }
    const int DM[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
    inline void putd(char ch,double x,int w){
        if(x<0) putchar('-'),x=-x;
        if(!w){
            put(ch,(int)(x+0.5));
            return;
        }
        int prex=(int)x;
        x-=(int)x;
        x*=DM[w];
        x+=0.5;
        int nowx=(int)x,now=0;
        if(nowx>=DM[w]) nowx=0,prex++;
        put('.',prex);
        int xx=nowx;
        if(!xx) now=1;
        else while(xx) xx/=10,now++;
        now=w-now;
        while(now--) putchar('0');
        put(ch,nowx);
    }
    inline void putstr(string s){
        for(int i=0;i<s.length();i++) putchar(s[i]);
    }
}
using namespace IO;
#define N 100005
#define lowbit(x) (x&-x)
int n,m,w[N],head[N],cnt;
struct edge{
	int v,nxt;
}e[N<<1];
struct que{
	int l,r,id;
	que(){}
	que(int _l,int _r,int _id){
		l=_l,r=_r,id=_id;	
	}
	inline bool operator<(const que &b)const{
		return r<b.r;
	}
};
int c[N],siz[N],ans[N],lst[N];
bool vis[N],book[N];
vector<que> q[N],A,B;
vector<int> son[N];
inline void add(int u,int v){
	e[++cnt]=(edge){v,head[u]},head[u]=cnt;
}
inline void update(int x,int v){
	if(!x) return;
	for(;x<=n;x+=lowbit(x)) c[x]+=v;
}
inline int query(int x){
	int res=0;
	for(;x;x^=lowbit(x)) res+=c[x];
	return res;
}
void get_wc(int x,int fa,int sum,int &wc){
	siz[x]=1;
	int ms=0;
	for(int i=head[x];i;i=e[i].nxt){
		int v=e[i].v;
		if(!vis[v]&&v!=fa){
			get_wc(v,x,sum,wc);
			ms=max(ms,siz[v]);
			siz[x]+=siz[v];
		}
	}
	ms=max(ms,sum-ms);
	if(ms<=sum/2) wc=x;
}
void dfs(int x,int fa,int l,int r){
	siz[x]=1;
	A.emplace_back(que(l,r,w[x]));
	for(auto now:q[x])
		if(!book[now.id]&&now.l<=l&&now.r>=r) book[now.id]=1,B.push_back(now);
	for(int i=head[x];i;i=e[i].nxt){
		int v=e[i].v;
		if(!vis[v]&&v!=fa) dfs(v,x,min(l,v),max(r,v)),siz[x]+=siz[v];
	}
}
inline void devide(int x){
	vis[x]=1;
	A.clear(),B.clear();
	dfs(x,0,x,x);
	sort(A.begin(),A.end()),sort(B.begin(),B.end());
	for(int i=0,j=0;i<B.size();i++){
		while(j<A.size()&&A[j].r<=B[i].r){
			if(A[j].l>lst[A[j].id]) update(lst[A[j].id],-1),update(lst[A[j].id]=A[j].l,1);
			j++;
		}
		ans[B[i].id]=query(n)-query(B[i].l-1);
	}
	for(auto now:A) update(lst[now.id],-1),lst[now.id]=0;
	for(int i=head[x];i;i=e[i].nxt){
		int v=e[i].v;
		if(!vis[v]){
			get_wc(v,x,siz[v],v);
			devide(v);
		}
	}
}
int main(){
	read(n),read(m);
	for(int i=1;i<=n;i++) read(w[i]);
	for(int i=1,u,v;i<n;i++)
		read(u),read(v),add(u,v),add(v,u);
	for(int i=1,l,r,d;i<=m;i++)
		read(l),read(r),read(d),q[d].push_back(que(l,r,i));
	int x=1;
	get_wc(x,0,n,x);
	devide(x);
	for(int i=1;i<=m;i++) put('\n',ans[i]);
	return 0;
}
2021/11/13 16:15
加载中...