如果我的根号分治T了
查看原帖
如果我的根号分治T了
251723
Schwarzkopf_Henkal楼主2020/12/11 21:15

常数快要被我优化成负的了还是TLE on Test8/kk/kk/kk/kk

最好能来个人证明是我算法假掉了而不是常数问题/kk

#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
const int buff_size = 1e6;
char gc() {
  static char buf[buff_size], *p1 = buf, *p2 = buf;
  return p1 == p2 &&
                 (p2 = (p1 = buf) + fread(buf, 1, buff_size, stdin), p1 == p2)
             ? EOF
             : *p1++;
};
inline void pc(const char &c = 0) {
  static char buf[buff_size], *p = buf;
  if (p - buf == buff_size || !c) fwrite(buf, 1, p - buf, stdout), p = buf;
  *p++ = c;
}
template <class _Tp = int>
inline void write(_Tp x) {
  if (x < 0) x = -x, pc('-');
  static int sta[35];
  int top = 0;
  do {
    sta[top++] = x % 10, x /= 10;
  } while (x);
  while (top) pc(sta[--top] ^ 48);
}
template <class _Tp = int>
inline _Tp read() {
  _Tp w = _Tp();
  bool f = 0;
  char ch = gc();
  while (!isdigit(ch)) f |= ch == '-', ch = gc();
  while (isdigit(ch)) w = (w << 3) + (w << 1) + (ch ^ 48), ch = gc();
  return f ? -w : w;
}
using namespace std;
int n,S,s[100005],ans[100005],res;
vector<int>to[100005];
void dfs(int p,int f,int NEKO){
    int mx=0,smx=0;
    for(int i=0;i<to[p].size();i++){
        int X=to[p][i];
        if(X!=f){
            dfs(X,p,NEKO);
            if(s[X]>mx){
                smx=mx;
                mx=s[X];
            }else if(s[X]>smx)
                smx=s[X];
        }
    }
    if(mx+smx+1>=NEKO){
        s[p]=0;
        res++;
    }else s[p]=mx+1;
}
int main(){
    n=read();
    S=sqrt(n*log2(n));
    for(int i=1,u,v;i<n;i++){
        u=read();
        v=read();
        to[u].push_back(v);
        to[v].push_back(u);
    }
    for(int i=1;i<=S&&i<=n;i++){
        res=0;
        dfs(1,0,i);
        ans[i]=res;
    }
    for(int i=S+1,l,r,mid,R;i<=n;i=R+1){
        res=0;
        dfs(1,0,i);
        ans[i]=res;
        l=i;
        r=n;
        while(l<=r){
            mid=(l+r)/2;
            res=0;
            dfs(1,0,mid);
            if(res==ans[i]){
                R=mid;
                l=mid+1;
            }else r=mid-1;
        }
        for(int j=i+1;j<=R;j++)
            ans[j]=ans[i];
    }
    for(int i=1;i<=n;i++){
        write(ans[i]);
        pc('\n');
    }
    pc();
}
2020/12/11 21:15
加载中...